yaparc 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/README +172 -8
- data/lib/yaparc.rb +402 -69
- data/tests/test_calc.rb +42 -105
- data/tests/test_parser.rb +304 -67
- metadata +2 -2
data/tests/test_parser.rb
CHANGED
@@ -15,28 +15,55 @@ class YaparcTest < Test::Unit::TestCase
|
|
15
15
|
|
16
16
|
def test_succeed_parse
|
17
17
|
parser = ::Yaparc::SucceedParser.new(1)
|
18
|
-
|
19
|
-
assert_equal
|
18
|
+
result = parser.parse("abs")
|
19
|
+
assert_equal 1, result.value
|
20
|
+
assert_equal "abs", result.input
|
21
|
+
# assert_equal 1, parser.tree
|
20
22
|
result = parser.parse("abs") do |result|
|
21
|
-
result
|
23
|
+
result
|
22
24
|
end
|
23
|
-
assert_equal 1, result
|
25
|
+
assert_equal 1, result.value
|
24
26
|
end
|
25
27
|
|
28
|
+
# def test_succeed_parse
|
29
|
+
# parser = ::Yaparc::SucceedParser.new(1)
|
30
|
+
# assert_equal [[1, "abs"]], parser.parse("abs")
|
31
|
+
# assert_equal [[1, "abs"]], parser.tree
|
32
|
+
# result = parser.parse("abs") do |result|
|
33
|
+
# result[0][0]
|
34
|
+
# end
|
35
|
+
# assert_equal 1, result
|
36
|
+
# end
|
37
|
+
|
26
38
|
def test_fail_parse
|
27
39
|
parser = ::Yaparc::FailParser.new
|
28
40
|
result = parser.parse("abc")
|
29
|
-
|
41
|
+
assert_instance_of Fail, result
|
30
42
|
end
|
31
43
|
|
44
|
+
# def test_fail_parse
|
45
|
+
# parser = ::Yaparc::FailParser.new
|
46
|
+
# result = parser.parse("abc")
|
47
|
+
# assert_equal [], result
|
48
|
+
# end
|
49
|
+
|
32
50
|
def test_item_parse
|
33
51
|
parser = ::Yaparc::ItemParser.new
|
34
52
|
result = parser.parse("")
|
35
|
-
|
53
|
+
assert_instance_of Fail, result
|
36
54
|
result = parser.parse("abc")
|
37
|
-
assert_equal
|
55
|
+
assert_equal "a", result.value
|
56
|
+
assert_equal "bc", result.input
|
38
57
|
end
|
39
58
|
|
59
|
+
# def test_item_parse
|
60
|
+
# parser = ::Yaparc::ItemParser.new
|
61
|
+
# result = parser.parse("")
|
62
|
+
# assert_equal [], result
|
63
|
+
# result = parser.parse("abc")
|
64
|
+
# assert_equal [["a", "bc"]], result
|
65
|
+
# end
|
66
|
+
|
40
67
|
def test_satisfy_parse
|
41
68
|
is_integer = lambda do |i|
|
42
69
|
begin
|
@@ -48,11 +75,12 @@ class YaparcTest < Test::Unit::TestCase
|
|
48
75
|
end
|
49
76
|
parser = SatisfyParser.new(is_integer)
|
50
77
|
result = parser.parse("123")
|
51
|
-
assert_equal
|
78
|
+
assert_equal "1", result.value
|
79
|
+
assert_equal "23", result.input
|
52
80
|
|
53
81
|
parser = SatisfyParser.new(is_integer)
|
54
82
|
result = parser.parse("abc")
|
55
|
-
|
83
|
+
assert_instance_of Fail, result
|
56
84
|
|
57
85
|
is_char = lambda do |i|
|
58
86
|
begin
|
@@ -64,175 +92,384 @@ class YaparcTest < Test::Unit::TestCase
|
|
64
92
|
end
|
65
93
|
parser = SatisfyParser.new(is_char)
|
66
94
|
result = parser.parse("abc")
|
67
|
-
assert_equal
|
95
|
+
assert_equal "a", result.value
|
96
|
+
assert_equal "bc", result.input
|
68
97
|
end
|
69
98
|
|
99
|
+
# def test_satisfy_parse
|
100
|
+
# is_integer = lambda do |i|
|
101
|
+
# begin
|
102
|
+
# Integer(i)
|
103
|
+
# true
|
104
|
+
# rescue
|
105
|
+
# false
|
106
|
+
# end
|
107
|
+
# end
|
108
|
+
# parser = SatisfyParser.new(is_integer)
|
109
|
+
# result = parser.parse("123")
|
110
|
+
# assert_equal [["1", "23"]], result
|
111
|
+
|
112
|
+
# parser = SatisfyParser.new(is_integer)
|
113
|
+
# result = parser.parse("abc")
|
114
|
+
# assert_equal [], result
|
115
|
+
|
116
|
+
# is_char = lambda do |i|
|
117
|
+
# begin
|
118
|
+
# String(i)
|
119
|
+
# true
|
120
|
+
# rescue
|
121
|
+
# false
|
122
|
+
# end
|
123
|
+
# end
|
124
|
+
# parser = SatisfyParser.new(is_char)
|
125
|
+
# result = parser.parse("abc")
|
126
|
+
# assert_equal [["a", "bc"]], result
|
127
|
+
# end
|
128
|
+
|
129
|
+
|
70
130
|
def test_seq_parse
|
71
131
|
parser = SeqParser.new(ItemParser.new, ItemParser.new) do |item1, item2|
|
72
132
|
[item1, item2]
|
73
133
|
end
|
74
134
|
result = parser.parse("abcdef")
|
75
|
-
assert_equal [
|
135
|
+
assert_equal ["a", "b"], result.value
|
136
|
+
assert_equal "cdef", result.input
|
76
137
|
|
77
138
|
parser = SeqParser.new(ItemParser.new, ItemParser.new, ItemParser.new) do |item1, item2, item3|
|
78
139
|
[item1, item3]
|
79
140
|
end
|
80
141
|
result = parser.parse("ABCDEF")
|
81
|
-
assert_equal [
|
142
|
+
assert_equal ["A", "C"], result.value
|
143
|
+
assert_equal "DEF", result.input
|
82
144
|
|
83
145
|
parser = SeqParser.new(ItemParser.new, ItemParser.new, ItemParser.new) do |item1, item2, item3|
|
84
146
|
[item2]
|
85
147
|
end
|
86
148
|
result = parser.parse("ABCDEF")
|
87
|
-
assert_equal [
|
149
|
+
assert_equal ["B"], result.value
|
150
|
+
assert_equal "DEF", result.input
|
88
151
|
end
|
89
152
|
|
153
|
+
# def test_seq_parse
|
154
|
+
# parser = SeqParser.new(ItemParser.new, ItemParser.new) do |item1, item2|
|
155
|
+
# [item1, item2]
|
156
|
+
# end
|
157
|
+
# result = parser.parse("abcdef")
|
158
|
+
# assert_equal [[["a", "b"], "cdef"]], result
|
159
|
+
|
160
|
+
# parser = SeqParser.new(ItemParser.new, ItemParser.new, ItemParser.new) do |item1, item2, item3|
|
161
|
+
# [item1, item3]
|
162
|
+
# end
|
163
|
+
# result = parser.parse("ABCDEF")
|
164
|
+
# assert_equal [[["A", "C"], "DEF"]], result
|
165
|
+
|
166
|
+
# parser = SeqParser.new(ItemParser.new, ItemParser.new, ItemParser.new) do |item1, item2, item3|
|
167
|
+
# [item2]
|
168
|
+
# end
|
169
|
+
# result = parser.parse("ABCDEF")
|
170
|
+
# assert_equal [[["B"], "DEF"]], result
|
171
|
+
# end
|
172
|
+
|
90
173
|
def test_seq_parse_without_block
|
91
174
|
parser = SeqParser.new(ItemParser.new, ItemParser.new)
|
92
175
|
result = parser.parse("abcdef")
|
93
|
-
assert_equal
|
176
|
+
assert_equal "b", result.value
|
177
|
+
assert_equal "cdef", result.input
|
94
178
|
end
|
95
179
|
|
180
|
+
# def test_seq_parse_without_block
|
181
|
+
# parser = SeqParser.new(ItemParser.new, ItemParser.new)
|
182
|
+
# result = parser.parse("abcdef")
|
183
|
+
# assert_equal [["b", "cdef"]], result
|
184
|
+
# end
|
185
|
+
|
96
186
|
def test_alt_parse
|
97
187
|
parser = AltParser.new(ItemParser.new, SucceedParser.new('d'))
|
98
188
|
result = parser.parse("abc")
|
99
|
-
assert_equal
|
189
|
+
assert_equal "a", result.value
|
190
|
+
assert_equal "bc", result.input
|
100
191
|
|
101
192
|
parser = AltParser.new(FailParser.new, SucceedParser.new('d'))
|
102
193
|
result = parser.parse("abc")
|
103
|
-
assert_equal
|
194
|
+
assert_equal "d", result.value
|
195
|
+
assert_equal "abc", result.input
|
104
196
|
|
105
197
|
parser = AltParser.new(FailParser.new, FailParser.new)
|
106
198
|
result = parser.parse("abc")
|
107
|
-
|
199
|
+
assert_instance_of Fail, result
|
108
200
|
end
|
109
201
|
|
110
202
|
|
203
|
+
# def test_alt_parse
|
204
|
+
# parser = AltParser.new(ItemParser.new, SucceedParser.new('d'))
|
205
|
+
# result = parser.parse("abc")
|
206
|
+
# assert_equal [["a", "bc"]], result
|
207
|
+
|
208
|
+
# parser = AltParser.new(FailParser.new, SucceedParser.new('d'))
|
209
|
+
# result = parser.parse("abc")
|
210
|
+
# assert_equal [["d", "abc"]], result
|
211
|
+
|
212
|
+
# parser = AltParser.new(FailParser.new, FailParser.new)
|
213
|
+
# result = parser.parse("abc")
|
214
|
+
# assert_equal [], result
|
215
|
+
# end
|
216
|
+
|
217
|
+
# def test_apply_parse
|
218
|
+
# is_digit = lambda {|i| i >= '0' and i <= '9'}
|
219
|
+
# parser = ApplyParser.new(SatisfyParser.new(is_digit)) do |digit|
|
220
|
+
# digit.to_i - '0'.to_i
|
221
|
+
# end
|
222
|
+
|
223
|
+
# result = parser.parse('7')
|
224
|
+
# assert_equal [[7, ""]], result
|
225
|
+
# end
|
226
|
+
|
111
227
|
def test_char_parse
|
112
228
|
parser = CharParser.new("a")
|
113
229
|
result = parser.parse("abc")
|
114
|
-
assert_equal
|
230
|
+
assert_equal "a", result.value
|
231
|
+
assert_equal "bc", result.input
|
115
232
|
|
116
233
|
parser = CharParser.new("a")
|
117
234
|
result = parser.parse("123")
|
118
|
-
|
235
|
+
assert_instance_of Fail, result
|
119
236
|
end
|
120
237
|
|
238
|
+
# def test_char_parse
|
239
|
+
# parser = CharParser.new("a")
|
240
|
+
# result = parser.parse("abc")
|
241
|
+
# assert_equal [["a", "bc"]], result
|
242
|
+
|
243
|
+
# parser = CharParser.new("a")
|
244
|
+
# result = parser.parse("123")
|
245
|
+
# assert_equal [], result
|
246
|
+
# end
|
247
|
+
|
121
248
|
def test_string_parse
|
122
249
|
parser = StringParser.new("abc")
|
123
250
|
result = parser.parse("abcdef")
|
124
|
-
assert_equal
|
251
|
+
assert_equal "abc", result.value
|
252
|
+
assert_equal "def", result.input
|
125
253
|
|
126
254
|
parser = StringParser.new("abc")
|
127
255
|
result = parser.parse("ab1234")
|
128
|
-
|
256
|
+
assert_instance_of Fail, result
|
129
257
|
end
|
130
258
|
|
259
|
+
# def test_string_parse
|
260
|
+
# parser = StringParser.new("abc")
|
261
|
+
# result = parser.parse("abcdef")
|
262
|
+
# assert_equal [["abc", "def"]], result
|
263
|
+
|
264
|
+
# parser = StringParser.new("abc")
|
265
|
+
# result = parser.parse("ab1234")
|
266
|
+
# assert_equal [], result
|
267
|
+
# end
|
268
|
+
|
131
269
|
def test_regex_parse
|
132
270
|
parser = RegexParser.new(/[a-z]/)
|
133
271
|
result = parser.parse("abcdef")
|
134
|
-
assert_equal
|
272
|
+
assert_equal "a", result.value
|
273
|
+
assert_equal "bcdef", result.input
|
135
274
|
|
136
275
|
parser = RegexParser.new(/[0-9]+/)
|
137
276
|
result = parser.parse("1234ab")
|
138
|
-
assert_equal
|
277
|
+
assert_equal "1234", result.value
|
278
|
+
assert_equal "ab", result.input
|
139
279
|
end
|
140
280
|
|
281
|
+
# def test_regex_parse
|
282
|
+
# parser = RegexParser.new(/[a-z]/)
|
283
|
+
# result = parser.parse("abcdef")
|
284
|
+
# assert_equal [["a", "bcdef"]], result
|
285
|
+
|
286
|
+
# parser = RegexParser.new(/[0-9]+/)
|
287
|
+
# result = parser.parse("1234ab")
|
288
|
+
# assert_equal [["1234", "ab"]], result
|
289
|
+
# end
|
290
|
+
|
141
291
|
def test_zero_one_parse
|
142
292
|
parser = ZeroOneParser.new(StringParser.new("abc"))
|
143
293
|
result = parser.parse("abc ")
|
144
|
-
assert_equal
|
294
|
+
assert_equal "abc", result.value
|
295
|
+
assert_equal " ", result.input
|
145
296
|
parser = ZeroOneParser.new(StringParser.new("abc"))
|
146
297
|
result = parser.parse("123")
|
147
|
-
assert_equal [
|
298
|
+
assert_equal [], result.value
|
299
|
+
assert_equal "123", result.input
|
148
300
|
end
|
149
301
|
|
302
|
+
# def test_zero_one_parse
|
303
|
+
# parser = ZeroOneParser.new(StringParser.new("abc"))
|
304
|
+
# result = parser.parse("abc ")
|
305
|
+
# assert_equal [["abc", " "]], result
|
306
|
+
# parser = ZeroOneParser.new(StringParser.new("abc"))
|
307
|
+
# result = parser.parse("123")
|
308
|
+
# assert_equal [[[], "123"]], result
|
309
|
+
# end
|
310
|
+
|
150
311
|
def test_many_parse
|
151
|
-
|
152
|
-
is_digit = SatisfyParser.new(lambda {|i| i > '0' and i < '9'})
|
312
|
+
is_digit = SatisfyParser.new(lambda {|i| i >= '0' and i <= '9'})
|
153
313
|
parser = ManyParser.new(is_digit)
|
154
314
|
result = parser.parse("123abc")
|
155
|
-
assert_equal
|
315
|
+
assert_equal "123", result.value
|
316
|
+
assert_equal "abc", result.input
|
156
317
|
|
157
318
|
result = parser.parse("abcdef")
|
158
|
-
assert_equal
|
319
|
+
assert_equal "", result.value
|
320
|
+
assert_equal "abcdef", result.input
|
159
321
|
end
|
160
322
|
|
323
|
+
# def test_many_parse
|
324
|
+
# is_digit = SatisfyParser.new(lambda {|i| i >= '0' and i <= '9'})
|
325
|
+
# parser = ManyParser.new(is_digit)
|
326
|
+
# result = parser.parse("123abc")
|
327
|
+
# assert_equal [["123", "abc"]], result
|
328
|
+
|
329
|
+
# result = parser.parse("abcdef")
|
330
|
+
# assert_equal [[[], "abcdef"]], result
|
331
|
+
# end
|
332
|
+
|
161
333
|
|
162
334
|
def test_ident
|
163
335
|
parser = Ident.new
|
164
336
|
result = parser.parse("abc def")
|
165
|
-
assert_equal
|
337
|
+
assert_equal "abc", result.value
|
338
|
+
assert_equal " def", result.input
|
166
339
|
end
|
167
340
|
|
341
|
+
# def test_ident
|
342
|
+
# parser = Ident.new
|
343
|
+
# result = parser.parse("abc def")
|
344
|
+
# assert_equal [["abc", " def"]], result
|
345
|
+
# end
|
346
|
+
|
168
347
|
def test_nat
|
169
348
|
parser = Nat.new
|
170
349
|
result = parser.parse("123 abc")
|
171
|
-
assert_equal
|
350
|
+
assert_equal 123, result.value
|
351
|
+
assert_equal " abc", result.input
|
172
352
|
end
|
173
353
|
|
354
|
+
|
355
|
+
# def test_nat
|
356
|
+
# parser = Nat.new
|
357
|
+
# result = parser.parse("123 abc")
|
358
|
+
# assert_equal [[123, " abc"]], result
|
359
|
+
# end
|
360
|
+
|
174
361
|
def test_nat_ident
|
175
362
|
parser = SeqParser.new(Nat.new, Ident.new) do |nat, ident|
|
176
363
|
[nat,ident]
|
177
364
|
end
|
178
365
|
result = parser.parse("123abc")
|
179
|
-
assert_equal [
|
366
|
+
assert_equal [123, "abc"], result.value
|
367
|
+
assert_equal "", result.input
|
180
368
|
end
|
181
369
|
|
370
|
+
# def test_nat_ident
|
371
|
+
# parser = SeqParser.new(Nat.new, Ident.new) do |nat, ident|
|
372
|
+
# [nat,ident]
|
373
|
+
# end
|
374
|
+
# result = parser.parse("123abc")
|
375
|
+
# assert_equal [[[123, "abc"], ""]], result
|
376
|
+
# end
|
377
|
+
|
182
378
|
def test_space
|
183
379
|
parser = Space.new
|
184
380
|
result = parser.parse(" abc")
|
185
|
-
assert_equal [
|
381
|
+
assert_equal [], result.value
|
382
|
+
assert_equal "abc", result.input
|
186
383
|
end
|
187
384
|
|
385
|
+
# def test_space
|
386
|
+
# parser = Space.new
|
387
|
+
# result = parser.parse(" abc")
|
388
|
+
# assert_equal [[[], "abc"]], result
|
389
|
+
# end
|
390
|
+
|
188
391
|
def test_identifier
|
189
392
|
parser = Identifier.new
|
190
393
|
result = parser.parse(" abc ")
|
191
|
-
assert_equal
|
394
|
+
assert_equal "abc", result.value
|
395
|
+
assert_equal "", result.input
|
396
|
+
|
397
|
+
parser_with_keyword = Identifier.new("abc","efg")
|
398
|
+
result = parser_with_keyword.parse("abc")
|
399
|
+
assert_instance_of Fail, result
|
400
|
+
result = parser_with_keyword.parse(" xyz")
|
401
|
+
assert_equal "xyz", result.value
|
402
|
+
assert_equal "", result.input
|
192
403
|
end
|
193
404
|
|
405
|
+
# def test_identifier
|
406
|
+
# parser = Identifier.new
|
407
|
+
# result = parser.parse(" abc ")
|
408
|
+
# assert_equal [["abc", ""]], result
|
409
|
+
|
410
|
+
# parser_with_keyword = Identifier.new("abc","efg")
|
411
|
+
# result = parser_with_keyword.parse("abc")
|
412
|
+
# assert_equal [], result
|
413
|
+
# result = parser_with_keyword.parse(" xyz")
|
414
|
+
# assert_equal [["xyz", ""]], result
|
415
|
+
# end
|
416
|
+
|
194
417
|
def test_natural
|
195
418
|
parser = Natural.new
|
196
419
|
result = parser.parse(" 1234 ")
|
197
|
-
assert_equal
|
420
|
+
assert_equal 1234, result.value
|
421
|
+
assert_equal "", result.input
|
198
422
|
end
|
199
423
|
|
424
|
+
# def test_natural
|
425
|
+
# parser = Natural.new
|
426
|
+
# result = parser.parse(" 1234 ")
|
427
|
+
# assert_equal [[1234, ""]], result
|
428
|
+
# end
|
429
|
+
|
200
430
|
def test_symbol
|
201
431
|
parser = Symbol.new('%')
|
202
432
|
result = parser.parse(" % ")
|
203
|
-
assert_equal
|
433
|
+
assert_equal "%", result.value
|
434
|
+
assert_equal "", result.input
|
204
435
|
end
|
205
436
|
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
437
|
+
# def test_symbol
|
438
|
+
# parser = Symbol.new('%')
|
439
|
+
# result = parser.parse(" % ")
|
440
|
+
# assert_equal [["%", ""]], result
|
441
|
+
# end
|
442
|
+
|
443
|
+
# def test_define_parser
|
444
|
+
# parser = Symbol.new('%')
|
445
|
+
# result = parser.parse(" % ")
|
446
|
+
# assert_equal [["%", ""]], result
|
447
|
+
# end
|
448
|
+
|
449
|
+
# def test_combination
|
450
|
+
# parser = AltParser.new(
|
451
|
+
# SeqParser.new(Symbol.new('+'),
|
452
|
+
# Natural.new) do | _, nat|
|
453
|
+
# nat
|
454
|
+
# end,
|
455
|
+
# Natural.new
|
456
|
+
# )
|
457
|
+
# result = parser.parse("+123")
|
458
|
+
# assert_equal [[123, ""]], result
|
459
|
+
# result = parser.parse(" 123 ")
|
460
|
+
# assert_equal [[123, ""]], result
|
461
|
+
# parser = AltParser.new(
|
462
|
+
# SeqParser.new(
|
463
|
+
# Symbol.new('('),
|
464
|
+
# Natural.new,
|
465
|
+
# Symbol.new(')')
|
466
|
+
# ) do |_,expr, _|
|
467
|
+
# expr
|
468
|
+
# end,
|
469
|
+
# Natural.new
|
470
|
+
# )
|
471
|
+
# result = parser.parse("( 123 )")
|
472
|
+
# assert_equal [[123, ""]], result
|
473
|
+
# end
|
237
474
|
end
|
238
475
|
|
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.8
|
7
|
+
date: 2008-01-10 00:00:00 +09:00
|
8
8
|
summary: Yet Another Combinator Parser Library
|
9
9
|
require_paths:
|
10
10
|
- lib
|