yaparc 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/yaparc.rb +135 -91
- data/tests/test_calc.rb +158 -72
- data/tests/test_parser.rb +64 -37
- metadata +2 -2
data/lib/yaparc.rb
CHANGED
@@ -13,7 +13,7 @@ module Yaparc
|
|
13
13
|
|
14
14
|
IS_LOWER = lambda {|c| c >= 'a' and c <= 'z'}
|
15
15
|
IS_ALPHANUM = lambda {|c| (c >= 'a' and c <= 'z') or (c >= '0' and c <= '9')}
|
16
|
-
IS_DIGIT = lambda {|i| i
|
16
|
+
IS_DIGIT = lambda {|i| i >= '0' and i <= '9'}
|
17
17
|
IS_SPACE = lambda {|i| i == ' '}
|
18
18
|
|
19
19
|
def self.included(mod)
|
@@ -24,7 +24,7 @@ module Yaparc
|
|
24
24
|
def parse(input, &block)
|
25
25
|
tree = @parser.call(input)
|
26
26
|
if block_given?
|
27
|
-
@tree = yield tree
|
27
|
+
@tree = yield tree
|
28
28
|
else
|
29
29
|
@tree = tree
|
30
30
|
end
|
@@ -40,35 +40,38 @@ module Yaparc
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def define_parser(&block)
|
43
|
-
@@
|
44
|
-
|
45
|
-
parser.parse(input)
|
43
|
+
@@cparser = lambda do
|
44
|
+
yield
|
46
45
|
end
|
47
46
|
end
|
48
47
|
|
49
|
-
|
50
|
-
|
51
|
-
|
48
|
+
# def define_parser(&block)
|
49
|
+
# @@parser = lambda do |input|
|
50
|
+
# parser = yield
|
51
|
+
# parser.parse(input)
|
52
|
+
# end
|
53
|
+
# end
|
52
54
|
|
53
|
-
def
|
54
|
-
tree = @@
|
55
|
+
def cparse(input, &block)
|
56
|
+
tree = @@cparser.call.parse(input)
|
55
57
|
if block_given?
|
56
|
-
|
58
|
+
yield tree
|
57
59
|
else
|
58
|
-
|
60
|
+
tree
|
59
61
|
end
|
60
62
|
end
|
61
|
-
|
62
|
-
# @parser = @@parser
|
63
|
-
# end
|
63
|
+
module_function :cparse
|
64
64
|
|
65
65
|
end
|
66
|
-
end # of Parsable
|
66
|
+
end # of Module Parsable
|
67
|
+
|
67
68
|
|
68
69
|
class SucceedParser
|
69
70
|
include Parsable
|
70
|
-
|
71
|
+
attr_reader :remaining
|
72
|
+
def initialize(value, remaining = nil)
|
71
73
|
@parser = lambda {|input| [[value, input]]}
|
74
|
+
@remaining = remaining
|
72
75
|
end
|
73
76
|
end
|
74
77
|
|
@@ -100,18 +103,34 @@ module Yaparc
|
|
100
103
|
@parser = lambda do |input|
|
101
104
|
item = ItemParser.new.parse(input)
|
102
105
|
if item == []
|
103
|
-
FailParser.new
|
106
|
+
FailParser.new
|
104
107
|
else
|
105
|
-
if predicate.call(item[0][0])
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
108
|
+
parser = if predicate.call(item[0][0])
|
109
|
+
# input = item[0][1]
|
110
|
+
SucceedParser.new(item[0][0], item[0][1])
|
111
|
+
else
|
112
|
+
FailParser.new
|
113
|
+
end
|
114
|
+
# parser.parse(input)
|
110
115
|
end
|
111
116
|
end
|
112
117
|
end
|
118
|
+
|
119
|
+
def parse(input)
|
120
|
+
parser = @parser.call(input)
|
121
|
+
case parser
|
122
|
+
when SucceedParser
|
123
|
+
parser.parse(parser.remaining)
|
124
|
+
when FailParser
|
125
|
+
parser.parse(input)
|
126
|
+
else
|
127
|
+
raise
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
113
131
|
end
|
114
132
|
|
133
|
+
|
115
134
|
class SeqParser
|
116
135
|
include Parsable
|
117
136
|
def initialize(*parsers, &block)
|
@@ -134,6 +153,7 @@ module Yaparc
|
|
134
153
|
end
|
135
154
|
end
|
136
155
|
end # of initialize
|
156
|
+
|
137
157
|
end # of SeqParser
|
138
158
|
|
139
159
|
class AltParser
|
@@ -152,23 +172,45 @@ module Yaparc
|
|
152
172
|
end # of initialize
|
153
173
|
end
|
154
174
|
|
155
|
-
|
175
|
+
|
176
|
+
class ParserBase
|
177
|
+
include Parsable
|
178
|
+
|
179
|
+
def parse(input)
|
180
|
+
@parser.parse(input)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
class AbstractParser
|
156
185
|
include Parsable
|
186
|
+
|
187
|
+
def parse(input, &block)
|
188
|
+
tree = @parser.call.parse(input)
|
189
|
+
if block_given?
|
190
|
+
@tree = yield tree
|
191
|
+
else
|
192
|
+
@tree = tree
|
193
|
+
end
|
194
|
+
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
class CharParser < ParserBase
|
199
|
+
|
157
200
|
def initialize(char)
|
158
201
|
equal_char = lambda {|i| i == char}
|
159
|
-
@parser =
|
160
|
-
SatisfyParser.new(equal_char).parse(input)
|
161
|
-
end
|
202
|
+
@parser = SatisfyParser.new(equal_char)
|
162
203
|
end
|
163
204
|
end
|
164
205
|
|
206
|
+
|
165
207
|
class StringParser
|
166
208
|
include Parsable
|
167
209
|
def initialize(string)
|
168
210
|
@parser = lambda do |input|
|
169
211
|
result = ItemParser.new.parse(string)
|
170
212
|
if result == []
|
171
|
-
SucceedParser.new(result)
|
213
|
+
SucceedParser.new(result)
|
172
214
|
else
|
173
215
|
SeqParser.new(
|
174
216
|
CharParser.new(result[0][0]),
|
@@ -176,14 +218,20 @@ module Yaparc
|
|
176
218
|
SucceedParser.new(result[0][0] + result[0][1])
|
177
219
|
) do |char_result, string_result, succeed_result|
|
178
220
|
succeed_result
|
179
|
-
end
|
221
|
+
end
|
180
222
|
end
|
181
223
|
end
|
182
224
|
end
|
225
|
+
|
226
|
+
def parse(input)
|
227
|
+
@parser.call(input).parse(input)
|
228
|
+
end
|
183
229
|
end
|
184
230
|
|
231
|
+
|
185
232
|
class RegexParser
|
186
233
|
include Parsable
|
234
|
+
|
187
235
|
def initialize(regex)
|
188
236
|
@parser = lambda do |input|
|
189
237
|
if match = Regexp.new(regex).match(input)
|
@@ -195,6 +243,7 @@ module Yaparc
|
|
195
243
|
end
|
196
244
|
end
|
197
245
|
|
246
|
+
# permits zero or more applications of parser.
|
198
247
|
class ManyParser
|
199
248
|
include Parsable
|
200
249
|
def initialize(parser)
|
@@ -202,14 +251,18 @@ module Yaparc
|
|
202
251
|
AltParser.new(ManyOneParser.new(parser), SucceedParser.new([])).parse(input)
|
203
252
|
end
|
204
253
|
end
|
254
|
+
|
255
|
+
def parse(input)
|
256
|
+
@parser.call(input)
|
257
|
+
end
|
205
258
|
end
|
206
259
|
|
260
|
+
# requires at least one successfull application of parser.
|
207
261
|
class ManyOneParser
|
208
262
|
include Parsable
|
209
263
|
def initialize(parser)
|
210
264
|
@parser = lambda do |input|
|
211
265
|
SeqParser.new(
|
212
|
-
# SatisfyParser.new(parser),
|
213
266
|
parser,
|
214
267
|
ManyParser.new(parser)
|
215
268
|
) do |v, vs|
|
@@ -218,104 +271,95 @@ module Yaparc
|
|
218
271
|
else
|
219
272
|
v + vs.to_s
|
220
273
|
end
|
221
|
-
end
|
274
|
+
end
|
222
275
|
end
|
223
276
|
end
|
277
|
+
|
278
|
+
def parse(input)
|
279
|
+
@parser.call(input).parse(input)
|
280
|
+
end
|
224
281
|
end
|
225
282
|
|
226
|
-
|
227
|
-
|
283
|
+
|
284
|
+
class ZeroOneParser < ParserBase
|
285
|
+
|
228
286
|
def initialize(parser)
|
229
|
-
@parser =
|
230
|
-
AltParser.new(parser,
|
231
|
-
SucceedParser.new([])).parse(input)
|
232
|
-
end
|
287
|
+
@parser = AltParser.new(parser, SucceedParser.new([]))
|
233
288
|
end
|
234
289
|
end
|
235
290
|
|
236
|
-
|
237
|
-
|
291
|
+
|
292
|
+
class Ident < ParserBase
|
293
|
+
|
238
294
|
def initialize
|
239
|
-
@parser =
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
v + vs.to_s
|
249
|
-
end
|
250
|
-
end.parse(input)
|
295
|
+
@parser = SeqParser.new(
|
296
|
+
SatisfyParser.new(IS_LOWER),
|
297
|
+
ManyParser.new(SatisfyParser.new(IS_ALPHANUM))
|
298
|
+
) do |v, vs|
|
299
|
+
if vs == []
|
300
|
+
v
|
301
|
+
else
|
302
|
+
v + vs.to_s
|
303
|
+
end
|
251
304
|
end
|
252
305
|
end
|
253
306
|
end
|
254
307
|
|
255
|
-
class Nat
|
256
|
-
|
308
|
+
class Nat < ParserBase
|
309
|
+
|
257
310
|
def initialize
|
258
|
-
@parser =
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
vs.to_i
|
265
|
-
end
|
266
|
-
end.parse(input)
|
311
|
+
@parser = SeqParser.new(ManyOneParser.new(SatisfyParser.new(IS_DIGIT))) do |vs|
|
312
|
+
if vs == []
|
313
|
+
vs
|
314
|
+
else
|
315
|
+
vs.to_i
|
316
|
+
end
|
267
317
|
end
|
268
318
|
end
|
269
319
|
end
|
270
320
|
|
271
|
-
|
272
|
-
|
321
|
+
|
322
|
+
class Space < ParserBase
|
323
|
+
|
273
324
|
def initialize
|
274
|
-
@parser =
|
275
|
-
|
276
|
-
SeqParser.new(ManyParser.new(SatisfyParser.new(IS_SPACE))) do |vs|
|
277
|
-
[]
|
278
|
-
end.parse(input)
|
325
|
+
@parser = SeqParser.new(ManyParser.new(SatisfyParser.new(IS_SPACE))) do |vs|
|
326
|
+
[]
|
279
327
|
end
|
280
328
|
end
|
281
329
|
end
|
282
330
|
|
283
|
-
|
284
|
-
|
331
|
+
|
332
|
+
class Token < ParserBase
|
333
|
+
|
285
334
|
def initialize(parser)
|
286
|
-
@parser =
|
287
|
-
|
288
|
-
vs
|
289
|
-
end.parse(input)
|
335
|
+
@parser = SeqParser.new(Space.new, parser, Space.new) do |_, vs, _|
|
336
|
+
vs
|
290
337
|
end
|
291
338
|
end
|
292
339
|
end
|
293
340
|
|
294
|
-
|
295
|
-
|
341
|
+
|
342
|
+
class Identifier < ParserBase
|
343
|
+
|
296
344
|
def initialize
|
297
|
-
@parser =
|
298
|
-
Token.new(Ident.new).parse(input)
|
299
|
-
end
|
345
|
+
@parser = Token.new(Ident.new)
|
300
346
|
end
|
301
347
|
end
|
302
348
|
|
303
|
-
|
304
|
-
|
349
|
+
|
350
|
+
class Natural < ParserBase
|
351
|
+
|
305
352
|
def initialize
|
306
|
-
@parser =
|
307
|
-
Token.new(Nat.new).parse(input)
|
308
|
-
end
|
353
|
+
@parser = Token.new(Nat.new)
|
309
354
|
end
|
310
355
|
end
|
311
356
|
|
312
|
-
|
313
|
-
|
357
|
+
|
358
|
+
class Symbol < ParserBase
|
359
|
+
|
314
360
|
def initialize(literal)
|
315
|
-
@parser =
|
316
|
-
Token.new(StringParser.new(literal)).parse(input)
|
317
|
-
end
|
361
|
+
@parser = Token.new(StringParser.new(literal))
|
318
362
|
end
|
319
363
|
end
|
320
364
|
|
321
|
-
end
|
365
|
+
end # of Yaparc
|
data/tests/test_calc.rb
CHANGED
@@ -3,38 +3,55 @@ require 'test/unit'
|
|
3
3
|
require 'pp'
|
4
4
|
|
5
5
|
|
6
|
+
class Expr < Yaparc::AbstractParser
|
7
|
+
# include Yaparc::Parsable
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
Term.new
|
18
|
-
)
|
19
|
-
end
|
9
|
+
# define_parser do
|
10
|
+
# Yaparc::AltParser.new(
|
11
|
+
# Yaparc::SeqParser.new(Term.new,
|
12
|
+
# Yaparc::Symbol.new('+'),
|
13
|
+
# Expr.new) do |term, _, expr|
|
14
|
+
# ['+', term,expr]
|
15
|
+
# end,
|
16
|
+
# Term.new
|
17
|
+
# )
|
18
|
+
# end
|
20
19
|
|
21
20
|
def initialize
|
22
|
-
@parser = lambda do
|
23
|
-
AltParser.new(
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
21
|
+
@parser = lambda do
|
22
|
+
Yaparc::AltParser.new(
|
23
|
+
Yaparc::SeqParser.new(Term.new,
|
24
|
+
Yaparc::Symbol.new('+'),
|
25
|
+
Expr.new) do |term, _, expr|
|
26
|
+
['+', term,expr]
|
27
|
+
end,
|
28
|
+
Term.new
|
29
|
+
)
|
30
|
+
# SeqParser.new(Term.new,
|
31
|
+
# AltParser.new(
|
32
|
+
# SeqParser.new(
|
33
|
+
# Symbol.new('+'),
|
34
|
+
# Expr.new) do |_, expr|
|
35
|
+
# expr
|
36
|
+
# end,
|
37
|
+
# SucceedParser.new([]))
|
38
|
+
# ) do |term, expr|
|
39
|
+
# if expr == []
|
40
|
+
# term
|
41
|
+
# else
|
42
|
+
# ['+', term,expr]
|
43
|
+
# end
|
44
|
+
# end
|
31
45
|
end
|
32
46
|
end
|
33
47
|
|
34
|
-
|
48
|
+
# def parse(input)
|
49
|
+
# @parser.call.parse(input)
|
50
|
+
# end
|
51
|
+
|
52
|
+
def evaluate(input)
|
35
53
|
result = parse(input)
|
36
54
|
tree = result[0][0]
|
37
|
-
# p tree
|
38
55
|
eval_tree(tree)
|
39
56
|
end
|
40
57
|
|
@@ -54,85 +71,154 @@ class Expr
|
|
54
71
|
else
|
55
72
|
tree
|
56
73
|
end
|
57
|
-
|
58
74
|
end
|
59
75
|
end
|
60
76
|
|
61
|
-
class Term
|
62
|
-
include Yaparc::Parsable
|
77
|
+
class Term < Yaparc::AbstractParser
|
78
|
+
# include Yaparc::Parsable
|
63
79
|
|
64
80
|
# define_parser do
|
65
|
-
# AltParser.new(
|
66
|
-
#
|
67
|
-
#
|
68
|
-
#
|
69
|
-
#
|
70
|
-
#
|
71
|
-
#
|
72
|
-
#
|
81
|
+
# Yaparc::AltParser.new(
|
82
|
+
# Yaparc::SeqParser.new(Factor.new,
|
83
|
+
# Yaparc::Symbol.new('*'),
|
84
|
+
# Term.new) do |factor, _, term|
|
85
|
+
# ['*', factor,term]
|
86
|
+
# end,
|
87
|
+
# Factor.new
|
88
|
+
# )
|
73
89
|
# end
|
74
90
|
|
75
91
|
def initialize
|
76
|
-
@parser = lambda do
|
77
|
-
AltParser.new(
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
92
|
+
@parser = lambda do
|
93
|
+
Yaparc::AltParser.new(
|
94
|
+
Yaparc::SeqParser.new(Factor.new,
|
95
|
+
Yaparc::Symbol.new('*'),
|
96
|
+
Term.new) do |factor, _, term|
|
97
|
+
['*', factor,term]
|
98
|
+
end,
|
99
|
+
Factor.new
|
100
|
+
)
|
101
|
+
# SeqParser.new(Factor.new,
|
102
|
+
# AltParser.new(
|
103
|
+
# SeqParser.new(Symbol.new('*'),
|
104
|
+
# Term.new) do |_, term|
|
105
|
+
# term
|
106
|
+
# end,
|
107
|
+
# SucceedParser.new([]))
|
108
|
+
# ) do |factor, term|
|
109
|
+
# if term == []
|
110
|
+
# factor
|
111
|
+
# else
|
112
|
+
# ['*', factor,term]
|
113
|
+
# end
|
114
|
+
# end
|
85
115
|
end
|
86
116
|
end
|
117
|
+
|
118
|
+
# def parse(input)
|
119
|
+
# @parser.call.parse(input)
|
120
|
+
# end
|
87
121
|
end
|
88
122
|
|
89
|
-
class Factor
|
90
|
-
include Yaparc::Parsable
|
123
|
+
class Factor < Yaparc::AbstractParser
|
124
|
+
# include Yaparc::Parsable
|
91
125
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
126
|
+
define_parser do
|
127
|
+
AltParser.new(
|
128
|
+
Yaparc::SeqParser.new(
|
129
|
+
Yaparc::Symbol.new('('),
|
130
|
+
Expr.new,
|
131
|
+
Yaparc::Symbol.new(')')
|
132
|
+
) do |_,expr, _|
|
133
|
+
expr
|
134
|
+
end,
|
135
|
+
Natural.new
|
136
|
+
)
|
137
|
+
end
|
102
138
|
|
103
139
|
def initialize
|
104
|
-
@parser = lambda do
|
140
|
+
@parser = lambda do
|
105
141
|
AltParser.new(
|
106
|
-
SeqParser.new(
|
107
|
-
|
108
|
-
|
142
|
+
Yaparc::SeqParser.new(
|
143
|
+
Yaparc::Symbol.new('('),
|
144
|
+
Expr.new,
|
145
|
+
Yaparc::Symbol.new(')')
|
146
|
+
) do |_,expr, _|
|
109
147
|
expr
|
110
148
|
end,
|
111
|
-
Natural.new
|
112
|
-
)
|
149
|
+
Yaparc::Natural.new
|
150
|
+
)
|
113
151
|
end
|
114
152
|
end
|
153
|
+
|
154
|
+
# def parse(input)
|
155
|
+
# @parser.call.parse(input)
|
156
|
+
# end
|
115
157
|
end
|
116
158
|
|
159
|
+
# class Comb < Yaparc::ParserBase
|
160
|
+
# include Yaparc::Parsable
|
161
|
+
|
162
|
+
# def initialize
|
163
|
+
# @parser = lambda do
|
164
|
+
# AltParser.new(
|
165
|
+
# SeqParser.new(Symbol.new('+'),
|
166
|
+
# Nat.new) do | _, nat|
|
167
|
+
# nat
|
168
|
+
# end,
|
169
|
+
# Nat.new
|
170
|
+
# )
|
171
|
+
# end
|
172
|
+
# end
|
173
|
+
|
174
|
+
# def parse(input)
|
175
|
+
# @parser.call.parse(input)
|
176
|
+
# end
|
177
|
+
# end
|
178
|
+
|
117
179
|
class YaparcCalcTest < Test::Unit::TestCase
|
118
180
|
include ::Yaparc
|
119
181
|
|
120
182
|
def setup
|
183
|
+
@expr = Expr.new
|
184
|
+
@factor = Factor.new
|
121
185
|
end
|
122
186
|
|
123
187
|
def test_expr
|
124
|
-
|
125
|
-
result = parser.parse("1 + 2 ")
|
188
|
+
result = @expr.parse("1 + 2 ")
|
126
189
|
assert_equal [[["+", 1, 2], ""]], result
|
127
|
-
assert_equal 3,
|
128
|
-
assert_equal 9,
|
190
|
+
assert_equal 3, @expr.evaluate("1 + 2 ")
|
191
|
+
assert_equal 9, @expr.evaluate("(1 + 2) * 3 ")
|
129
192
|
end
|
130
193
|
|
131
|
-
def
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
assert_equal
|
194
|
+
def test_factor
|
195
|
+
result = @factor.parse("1")
|
196
|
+
assert_equal [[1, ""]], result
|
197
|
+
|
198
|
+
result = @factor.parse("( 1 )")
|
199
|
+
assert_equal [[1, ""]], result
|
200
|
+
|
201
|
+
result = @factor.parse("( 312 )")
|
202
|
+
assert_equal [[312, ""]], result
|
137
203
|
end
|
204
|
+
|
205
|
+
# def test_cexpr
|
206
|
+
# result = @expr.cparse("1 + 2 ")
|
207
|
+
# assert_equal [[["+", 1, 2], ""]], result
|
208
|
+
# end
|
209
|
+
|
210
|
+
# def test_comb
|
211
|
+
# comb = Comb.new
|
212
|
+
# result = comb.parse("+123")
|
213
|
+
# assert_equal [[123, ""]], result
|
214
|
+
# end
|
215
|
+
|
216
|
+
|
217
|
+
# def test_expr_define_parser
|
218
|
+
# parser = Expr.new
|
219
|
+
# result = Expr.parse("1 + 2 ")
|
220
|
+
# assert_equal [[["+", 1, 2], ""]], result
|
221
|
+
# # assert_equal 3, parser.evaluate("1 + 2 ")
|
222
|
+
# # assert_equal 9, parser.evaluate("(1 + 2) * 3 ")
|
223
|
+
# end
|
138
224
|
end
|
data/tests/test_parser.rb
CHANGED
@@ -37,6 +37,36 @@ class YaparcTest < Test::Unit::TestCase
|
|
37
37
|
assert_equal [["a", "bc"]], result
|
38
38
|
end
|
39
39
|
|
40
|
+
def test_satisfy_parse
|
41
|
+
is_integer = lambda do |i|
|
42
|
+
begin
|
43
|
+
Integer(i)
|
44
|
+
true
|
45
|
+
rescue
|
46
|
+
false
|
47
|
+
end
|
48
|
+
end
|
49
|
+
parser = SatisfyParser.new(is_integer)
|
50
|
+
result = parser.parse("123")
|
51
|
+
assert_equal [["1", "23"]], result
|
52
|
+
|
53
|
+
parser = SatisfyParser.new(is_integer)
|
54
|
+
result = parser.parse("abc")
|
55
|
+
assert_equal [], result
|
56
|
+
|
57
|
+
is_char = lambda do |i|
|
58
|
+
begin
|
59
|
+
String(i)
|
60
|
+
true
|
61
|
+
rescue
|
62
|
+
false
|
63
|
+
end
|
64
|
+
end
|
65
|
+
parser = SatisfyParser.new(is_char)
|
66
|
+
result = parser.parse("abc")
|
67
|
+
assert_equal [["a", "bc"]], result
|
68
|
+
end
|
69
|
+
|
40
70
|
def test_seq_parse
|
41
71
|
parser = SeqParser.new(ItemParser.new, ItemParser.new) do |item1, item2|
|
42
72
|
[item1, item2]
|
@@ -71,35 +101,6 @@ class YaparcTest < Test::Unit::TestCase
|
|
71
101
|
assert_equal [], result
|
72
102
|
end
|
73
103
|
|
74
|
-
def test_satisfy_parse
|
75
|
-
is_integer = lambda do |i|
|
76
|
-
begin
|
77
|
-
Integer(i)
|
78
|
-
true
|
79
|
-
rescue
|
80
|
-
false
|
81
|
-
end
|
82
|
-
end
|
83
|
-
parser = SatisfyParser.new(is_integer)
|
84
|
-
result = parser.parse("123")
|
85
|
-
assert_equal [["1", "23"]], result
|
86
|
-
|
87
|
-
parser = SatisfyParser.new(is_integer)
|
88
|
-
result = parser.parse("abc")
|
89
|
-
assert_equal [], result
|
90
|
-
|
91
|
-
is_char = lambda do |i|
|
92
|
-
begin
|
93
|
-
String(i)
|
94
|
-
true
|
95
|
-
rescue
|
96
|
-
false
|
97
|
-
end
|
98
|
-
end
|
99
|
-
parser = SatisfyParser.new(is_char)
|
100
|
-
result = parser.parse("abc")
|
101
|
-
assert_equal [["a", "bc"]], result
|
102
|
-
end
|
103
104
|
|
104
105
|
def test_char_parse
|
105
106
|
parser = CharParser.new("a")
|
@@ -131,6 +132,15 @@ class YaparcTest < Test::Unit::TestCase
|
|
131
132
|
assert_equal [["1234", "ab"]], result
|
132
133
|
end
|
133
134
|
|
135
|
+
def test_zero_one_parse
|
136
|
+
parser = ZeroOneParser.new(StringParser.new("abc"))
|
137
|
+
result = parser.parse("abc ")
|
138
|
+
assert_equal [["abc", " "]], result
|
139
|
+
parser = ZeroOneParser.new(StringParser.new("abc"))
|
140
|
+
result = parser.parse("123")
|
141
|
+
assert_equal [[[], "123"]], result
|
142
|
+
end
|
143
|
+
|
134
144
|
def test_many_parse
|
135
145
|
# is_digit = lambda {|i| i > '0' and i < '9'}
|
136
146
|
is_digit = SatisfyParser.new(lambda {|i| i > '0' and i < '9'})
|
@@ -142,14 +152,6 @@ class YaparcTest < Test::Unit::TestCase
|
|
142
152
|
assert_equal [[[], "abcdef"]], result
|
143
153
|
end
|
144
154
|
|
145
|
-
def test_zero_one_parse
|
146
|
-
parser = ZeroOneParser.new(StringParser.new("abc"))
|
147
|
-
result = parser.parse("abc ")
|
148
|
-
assert_equal [["abc", " "]], result
|
149
|
-
parser = ZeroOneParser.new(StringParser.new("abc"))
|
150
|
-
result = parser.parse("123")
|
151
|
-
assert_equal [[[], "123"]], result
|
152
|
-
end
|
153
155
|
|
154
156
|
def test_ident
|
155
157
|
parser = Ident.new
|
@@ -201,5 +203,30 @@ class YaparcTest < Test::Unit::TestCase
|
|
201
203
|
assert_equal [["%", ""]], result
|
202
204
|
end
|
203
205
|
|
206
|
+
def test_combination
|
207
|
+
parser = AltParser.new(
|
208
|
+
SeqParser.new(Symbol.new('+'),
|
209
|
+
Natural.new) do | _, nat|
|
210
|
+
nat
|
211
|
+
end,
|
212
|
+
Natural.new
|
213
|
+
)
|
214
|
+
result = parser.parse("+123")
|
215
|
+
assert_equal [[123, ""]], result
|
216
|
+
result = parser.parse(" 123 ")
|
217
|
+
assert_equal [[123, ""]], result
|
218
|
+
parser = AltParser.new(
|
219
|
+
SeqParser.new(
|
220
|
+
Symbol.new('('),
|
221
|
+
Natural.new,
|
222
|
+
Symbol.new(')')
|
223
|
+
) do |_,expr, _|
|
224
|
+
expr
|
225
|
+
end,
|
226
|
+
Natural.new
|
227
|
+
)
|
228
|
+
result = parser.parse("( 123 )")
|
229
|
+
assert_equal [[123, ""]], result
|
230
|
+
end
|
204
231
|
end
|
205
232
|
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.3
|
|
3
3
|
specification_version: 1
|
4
4
|
name: yaparc
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2008-01-
|
6
|
+
version: 0.0.6
|
7
|
+
date: 2008-01-07 00:00:00 +09:00
|
8
8
|
summary: Yet Another Combinator Parser Library
|
9
9
|
require_paths:
|
10
10
|
- lib
|