yaparc 0.0.7 → 0.0.8
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/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
|