yaparc 0.1.6 → 0.2.0

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 CHANGED
@@ -19,39 +19,39 @@ All parsers has 'parse' method, each of which takes input string as its argument
19
19
 
20
20
  == Primitive Parsers
21
21
 
22
- * SucceedParser
23
- * FailParser
24
- * ItemParser
25
- * SatisfyParser
22
+ * Succeed
23
+ * Fail
24
+ * Item
25
+ * Satisfy
26
26
 
27
- === SucceedParser class
27
+ === Succeed class
28
28
 
29
- The parser SucceedParser always succeeds with the result value, without consuming any of the input string.
30
- In the following example, SucceedParser#parse takes an input string "blah, blah, blah" and returns the singleton array [[1, "blah, blah, blah"]].
29
+ The parser Succeed always succeeds with the result value, without consuming any of the input string.
30
+ In the following example, Succeed#parse takes an input string "blah, blah, blah" and returns the singleton array [[1, "blah, blah, blah"]].
31
31
 
32
- parser = Yaparc::SucceedParser.new(1)
32
+ parser = Yaparc::Succeed.new(1)
33
33
  parser.parse("blah, blah, blah")
34
34
  => #<Yaparc::Result::OK:0xb7aaaf5c @input="blah, blah, blah", @value=1>
35
35
 
36
- === FailParser class
36
+ === Fail class
37
37
 
38
- The parser FailParser always fails, regardless of the contents of the input string.
38
+ The parser Fail always fails, regardless of the contents of the input string.
39
39
 
40
- parser = Yaparc::FailParser.new
40
+ parser = Yaparc::Fail.new
41
41
  parser.parse("abc")
42
42
  => #<Yaparc::Result::Fail:0xb7aa56b0 @value=nil>
43
43
 
44
- === ItemParser class
44
+ === Item class
45
45
 
46
- The parser ItemParser fails if the input string is empty, and succeeds with the first character as the result value otherwise.
46
+ The parser Item fails if the input string is empty, and succeeds with the first character as the result value otherwise.
47
47
 
48
- parser = Yaparc::ItemParser.new
48
+ parser = Yaparc::Item.new
49
49
  parser.parse("abc")
50
50
  => #<Yaparc::Result::OK:0xb7a9fdb4 @input="bc", @value="a">
51
51
 
52
- === SatisfyParser class
52
+ === Satisfy class
53
53
 
54
- The parser SatisfyParser recognizes a single input via predicate which determines if an arbitrary input is suitable for the predicate.
54
+ The parser Satisfy recognizes a single input via predicate which determines if an arbitrary input is suitable for the predicate.
55
55
 
56
56
  is_integer = lambda do |i|
57
57
  begin
@@ -61,31 +61,31 @@ The parser SatisfyParser recognizes a single input via predicate which determine
61
61
  false
62
62
  end
63
63
  end
64
- parser = Yaparc::SatisfyParser.new(is_integer)
64
+ parser = Yaparc::Satisfy.new(is_integer)
65
65
  parser.parse("123")
66
66
  => #<Yaparc::Result::OK:0xb7a8f284 @input="23", @value="1">
67
67
 
68
68
 
69
69
  == Combining Parsers
70
70
 
71
- * AltParser
72
- * SeqParser
73
- * ManyParser
74
- * ManyOneParser
71
+ * Alt
72
+ * Seq
73
+ * Many
74
+ * ManyOne
75
75
 
76
76
 
77
77
 
78
78
  === Sequencing parser
79
79
 
80
- The SeqParser corresponds to sequencing in BNF. The following parser recognizes anything that Symbol.new('+') or Natural.new would if placed in succession.
80
+ The Seq corresponds to sequencing in BNF. The following parser recognizes anything that Symbol.new('+') or Natural.new would if placed in succession.
81
81
 
82
- parser = SeqParser.new(Symbol.new('+'), Natural.new)
82
+ parser = Seq.new(Symbol.new('+'), Natural.new)
83
83
  parser.parse("+321")
84
84
  => #<Yaparc::Result::OK:0xb7a81ae4 @input="", @value=321>
85
85
 
86
- if a block given to SeqParser, it analyses input string to construct its logical structure.
86
+ if a block given to Seq, it analyses input string to construct its logical structure.
87
87
 
88
- parser = Yaparc::SeqParser.new(Yaparc::Symbol.new('+'), Yaparc::Natural.new) do | plus, nat|
88
+ parser = Yaparc::Seq.new(Yaparc::Symbol.new('+'), Yaparc::Natural.new) do | plus, nat|
89
89
  nat
90
90
  end
91
91
  parser.parse("+1234")
@@ -95,11 +95,11 @@ It produces a parse tree which expounds the semantic structure of the program.
95
95
 
96
96
  === Alternation parser
97
97
 
98
- The parser AltParser class is an alternation parser, which returns the result of the first parser to succeed, and failure if neither does.
98
+ The parser Alt class is an alternation parser, which returns the result of the first parser to succeed, and failure if neither does.
99
99
 
100
100
 
101
- parser = Yaparc::AltParser.new(
102
- Yaparc::SeqParser.new(Yaparc::Symbol.new('+'), Yaparc::Natural.new) do | _, nat|
101
+ parser = Yaparc::Alt.new(
102
+ Yaparc::Seq.new(Yaparc::Symbol.new('+'), Yaparc::Natural.new) do | _, nat|
103
103
  nat
104
104
  end,
105
105
  Yaparc::Natural.new
@@ -110,17 +110,17 @@ The parser AltParser class is an alternation parser, which returns the result of
110
110
  => #<Yaparc::Result::Fail:0xb7a57ba4 @value=nil>
111
111
 
112
112
 
113
- === ManyParser
113
+ === Many
114
114
 
115
- In ManyParser, zero or more applications of parser are admissible.
115
+ In Many, zero or more applications of parser are admissible.
116
116
 
117
- parser = Yaparc::ManyParser.new(Yaparc::SatisfyParser.new(lambda {|i| i > '0' and i < '9'}))
117
+ parser = Yaparc::Many.new(Yaparc::Satisfy.new(lambda {|i| i > '0' and i < '9'}))
118
118
  parser.parse("123abc")
119
119
  => #<Yaparc::Result::OK:0xb7a49dc4 @input="abc", @value="123">
120
120
 
121
- === ManyOneParser
121
+ === ManyOne
122
122
 
123
- The ManyOneParser requires at least one successfull application of parser.
123
+ The ManyOne requires at least one successfull application of parser.
124
124
 
125
125
 
126
126
  == Tokenized parser
@@ -143,7 +143,7 @@ In order to construct parsers, you make parser class to be inherited from Yaparc
143
143
  class Identifier < Yaparc::AbstractParser
144
144
  def initialize
145
145
  @parser = lambda do
146
- Yaparc::Token.new(Yaparc::Ident.new)
146
+ Yaparc::Tokenize.new(Yaparc::Ident.new)
147
147
  end
148
148
  end
149
149
  end
@@ -154,8 +154,8 @@ In the following example, note that Expr class is instantiated inside Expr#initi
154
154
  class Expr < Yaparc::AbstractParser
155
155
  def initialize
156
156
  @parser = lambda do
157
- Yaparc::AltParser.new(
158
- Yaparc::SeqParser.new(Term.new,
157
+ Yaparc::Alt.new(
158
+ Yaparc::Seq.new(Term.new,
159
159
  Yaparc::Symbol.new('+'),
160
160
  Expr.new) do |term, _, expr|
161
161
  ['+', term,expr]
@@ -56,18 +56,13 @@ module Yaparc
56
56
  module ClassMethods
57
57
  def included(mod)
58
58
  end
59
-
60
- # def define_parser(&block)
61
- # @@cparser = lambda do
62
- # yield
63
- # end
64
- # end
65
59
  end
66
60
  end # of Module Parsable
67
61
 
68
62
 
69
63
 
70
- class SucceedParser
64
+ # class SucceedParser
65
+ class Succeed
71
66
  include Parsable
72
67
  attr_reader :remaining
73
68
  def initialize(value, remaining = nil)
@@ -78,7 +73,8 @@ module Yaparc
78
73
  end
79
74
  end
80
75
 
81
- class FailParser
76
+ # class FailParser
77
+ class Fail
82
78
  include Parsable
83
79
  def initialize
84
80
  @parser = lambda do |input|
@@ -89,7 +85,8 @@ module Yaparc
89
85
 
90
86
 
91
87
 
92
- class ItemParser
88
+ # class ItemParser
89
+ class Item
93
90
  include Parsable
94
91
  def initialize
95
92
  @parser = lambda do |input|
@@ -102,13 +99,15 @@ module Yaparc
102
99
  end
103
100
  end
104
101
 
105
- class ZeroOneParser
102
+ # class ZeroOneParser
103
+ class ZeroOne
106
104
  include Parsable
107
105
  def initialize(parser, identity = [])
108
106
  @parser = lambda do |input|
109
107
  case result = parser.parse(input)
110
108
  when Result::Fail
111
- SucceedParser.new(identity)
109
+ Result::OK.new(:value => identity, :input => input)
110
+ # Succeed.new(identity)
112
111
  when Result::Error
113
112
  Result::Error.new(:value => result.value, :input => result.input)
114
113
  when Result::OK
@@ -117,8 +116,8 @@ module Yaparc
117
116
  raise
118
117
  end
119
118
 
120
- # AltParser.new(parser, SucceedParser.new(identity))
121
- # case result = AltParser.new(parser, SucceedParser.new(identity)).parse(input)
119
+ # AltParser.new(parser, Succeed.new(identity))
120
+ # case result = AltParser.new(parser, Succeed.new(identity)).parse(input)
122
121
  # if input.nil? or input.empty?
123
122
  # Result::Fail.new(:input => input)
124
123
  # else
@@ -129,30 +128,31 @@ module Yaparc
129
128
  end
130
129
  end
131
130
 
132
- class SatisfyParser
131
+ # class SatisfyParser
132
+ class Satisfy
133
133
  include Parsable
134
134
  def initialize(predicate)
135
135
  raise unless predicate.instance_of?(Proc)
136
136
 
137
137
  @parser = lambda do |input|
138
- case result = ItemParser.new.parse(input)
138
+ case result = Item.new.parse(input)
139
139
  when Result::OK
140
140
  parser = if predicate.call(result.value)
141
- SucceedParser.new(result.value, result.input)
141
+ Succeed.new(result.value, result.input)
142
142
  else
143
- FailParser.new
143
+ Fail.new
144
144
  end
145
145
  else # Result::Fail or Result::Error
146
- FailParser.new
146
+ Fail.new
147
147
  end
148
148
  end
149
149
  end
150
150
 
151
151
  def parse(input)
152
152
  case parser = @parser.call(input)
153
- when SucceedParser
153
+ when Succeed
154
154
  parser.parse(parser.remaining)
155
- when FailParser
155
+ when Fail
156
156
  parser.parse(input)
157
157
  else
158
158
  raise
@@ -171,9 +171,9 @@ module Yaparc
171
171
  when Result::Fail
172
172
  Result::Error.new(:value => result.value, :input => result.input)
173
173
  when Result::OK
174
- SucceedParser.new(result.value)
174
+ Succeed.new(result.value)
175
175
  else
176
- SucceedParser.new(result.value)
176
+ Succeed.new(result.value)
177
177
  # Result::OK.new(:value => result.value,:input => result.input)
178
178
  end
179
179
  end
@@ -181,7 +181,8 @@ module Yaparc
181
181
  end # of NoFail
182
182
 
183
183
 
184
- class SeqParser
184
+ # class SeqParser
185
+ class Seq
185
186
  include Parsable
186
187
  def initialize(*parsers, &block)
187
188
  @parser = lambda do |input|
@@ -191,6 +192,8 @@ module Yaparc
191
192
  case result = parser.parse(subsequent.input)
192
193
  when Result::Fail
193
194
  break Result::Fail.new(:input => subsequent.input)
195
+ # when Result::Error
196
+ # break Result::Error.new(:input => subsequent.input)
194
197
  else
195
198
  args << result.value
196
199
  result
@@ -212,10 +215,11 @@ module Yaparc
212
215
  end
213
216
  end
214
217
  end # of initialize
215
- end # of SeqParser
218
+ end # of Seq
216
219
 
217
220
 
218
- class AltParser
221
+ # class AltParser
222
+ class Alt
219
223
  include Parsable
220
224
  def initialize(*parsers)
221
225
  @parser = lambda do |input|
@@ -239,48 +243,48 @@ module Yaparc
239
243
  end # of initialize
240
244
  end
241
245
 
242
-
243
-
244
- class ApplyParser
246
+ # class ApplyParser
247
+ class Apply
245
248
  include Parsable
246
249
  def initialize(parser, &block)
247
250
  @parser = lambda do |input|
248
251
  case result = parser.parse(input)
249
252
  when Result::OK
250
- SucceedParser.new(yield(result.value)).parse(result.input)
253
+ Succeed.new(yield(result.value)).parse(result.input)
251
254
  else
252
- FailParser.new.parse(input)
255
+ Fail.new.parse(input)
253
256
  end
254
257
  end
255
258
  end # of initialize
256
- end # of ApplyParser
259
+ end # of Apply
257
260
 
258
261
 
259
- class StringParser
262
+ class String
260
263
  include Parsable
261
264
  def initialize(string)
262
265
  @parser = lambda do |input|
263
- case result = ItemParser.new.parse(string)
266
+ case result = Item.new.parse(string)
264
267
  when Result::OK
265
- SeqParser.new(
266
- CharParser.new(result.value),
267
- StringParser.new(result.input),
268
- SucceedParser.new(result.value + result.input)
269
- ) do |char_result, string_result, succeed_result|
268
+ Seq.new(
269
+ Char.new(result.value),
270
+ Yaparc::String.new(result.input),
271
+ Succeed.new(result.value + result.input)
272
+ ) do |char_result, string_result, succeed_result|
270
273
  succeed_result
271
274
  end
272
275
  else
273
- SucceedParser.new(result) # Is it OK?
276
+ Succeed.new(result) # Is it OK?
274
277
  end
275
278
  end
276
279
  end
277
280
 
278
- def parse(input)
279
- @parser.call(input).parse(input)
280
- end
281
+ # def parse(input)
282
+ # @parser.call(input).parse(input)
283
+ # end
281
284
  end
282
285
 
283
- class RegexParser
286
+ # class RegexParser
287
+ class Regex
284
288
  include Parsable
285
289
 
286
290
  def initialize(regex, &block)
@@ -288,7 +292,7 @@ module Yaparc
288
292
  @parser = lambda do |input|
289
293
  if match = Regexp.new(regex).match(input)
290
294
  if block_given?
291
- SucceedParser.new(yield(*match.to_a[1..match.to_a.length])).parse(match.post_match)
295
+ Succeed.new(yield(*match.to_a[1..match.to_a.length])).parse(match.post_match)
292
296
  else
293
297
  Result::OK.new(:value => match[0], :input => match.post_match)
294
298
  end
@@ -310,89 +314,93 @@ module Yaparc
310
314
  end
311
315
  end
312
316
  end
313
- # class RegexParser
314
- # include Parsable
315
-
316
- # def initialize(regex)
317
- # @parser = lambda do |input|
318
- # if match = Regexp.new(regex).match(input)
319
- # Result::OK.new(:value => match[0], :input => match.post_match)
320
- # else
321
- # Result::Fail.new(:input => input)
322
- # end
323
- # end
324
- # end
325
- # end
326
317
 
327
318
  # permits zero or more applications of parser.
328
- class ManyParser
319
+ # class ManyParser
320
+ class Many
329
321
  include Parsable
330
322
  def initialize(parser, identity = [])
331
323
  @parser = lambda do |input|
332
- AltParser.new(ManyOneParser.new(parser, identity), SucceedParser.new(identity))
324
+ Alt.new(ManyOne.new(parser, identity), Succeed.new(identity))
333
325
  end
334
326
  end
335
-
336
- # def parse(input)
337
- # @parser.call(input).parse(input)
338
- # end
339
327
  end
340
328
 
341
329
  # requires at least one successfull application of parser.
342
- class ManyOneParser
330
+ # class ManyOne
331
+ class ManyOne
343
332
  include Parsable
344
333
  def initialize(parser, identity = [])
345
334
  @parser = lambda do |input|
346
- SeqParser.new(
347
- parser,
348
- ManyParser.new(parser, identity)
349
- ) do |head, tail|
350
- head + tail
335
+ Seq.new(parser, Many.new(parser, identity)) do |head, tail|
336
+ case head
337
+ when ::String
338
+ if tail.instance_of?(::String)
339
+ head + tail
340
+ else
341
+ raise "Incompatible type: head => #{head}, tail => #{tail}"
342
+ end
343
+ when ::Array
344
+ if tail.instance_of?(Array)
345
+ head + tail
346
+ else
347
+ raise "Incompatible type: head => #{head}, tail => #{tail}"
348
+ end
349
+ when ::Hash
350
+ if tail.instance_of?(Hash)
351
+ head.merge(tail)
352
+ else
353
+ raise "Incompatible type: head => #{head}, tail => #{tail}"
354
+ end
355
+ when ::Integer
356
+ if tail.kind_of?(Integer)
357
+ head + tail
358
+ else
359
+ raise "Incompatible type: head => #{head}, tail => #{tail}"
360
+ end
361
+ else
362
+ raise "Incompatible type: head => #{head}"
363
+ end
364
+ #head + tail
351
365
  end
352
366
  end
353
367
  end
354
-
355
- def parse(input)
356
- @parser.call(input).parse(input)
357
- end
358
368
  end
359
369
 
360
-
361
-
362
-
363
- class SpaceParser
370
+ # class SpaceParser
371
+ class Space
364
372
  include Parsable
365
373
  def initialize
366
374
  @parser = lambda do |input|
367
- SeqParser.new(ManyParser.new(SatisfyParser.new(IS_SPACE),""))
375
+ Seq.new(Many.new(Satisfy.new(IS_SPACE),""))
368
376
  end
369
377
  end
370
378
  end
371
379
 
372
- class WhiteSpaceParser
380
+ class WhiteSpace
373
381
  include Parsable
374
382
  def initialize
375
383
  @parser = lambda do |input|
376
- SeqParser.new(ManyParser.new(SatisfyParser.new(IS_WHITESPACE),''))
384
+ Seq.new(Many.new(Satisfy.new(IS_WHITESPACE),''))
377
385
  end
378
386
  end
379
387
  end
380
388
 
381
- class TokenizeParser
389
+ class Tokenize
382
390
  include Parsable
383
391
  attr_accessor :prefix, :postfix
384
392
 
385
393
  def initialize(parser, args = { }, &block)
386
394
  @parser = lambda do |input|
387
- @prefix = args[:prefix] ? args[:prefix] : WhiteSpaceParser.new
388
- @postfix = args[:postfix] ? args[:postfix] : WhiteSpaceParser.new
395
+ @prefix = args[:prefix] ? args[:prefix] : WhiteSpace.new
396
+ @postfix = args[:postfix] ? args[:postfix] : WhiteSpace.new
389
397
  if block_given?
390
398
  yield self
391
- SeqParser.new(@prefix, parser, @postfix) do |_, vs, _|
399
+ Seq.new(@prefix, parser, @postfix) do |_, vs, _|
392
400
  vs
393
401
  end
394
402
  else
395
- SeqParser.new(@prefix, parser, @postfix) do |_, vs, _|
403
+ Seq.new(@prefix, parser, @postfix) do |_, vs, _|
396
404
  vs
397
405
  end
398
406
  end
@@ -400,23 +408,12 @@ module Yaparc
400
408
  end
401
409
  end
402
410
 
403
- # class Tokenize < ParserBase
404
- # attr_accessor :prefix, :postfix
405
-
406
- # def initialize(parser, &block)
407
- # @prefix, @postfix = WhiteSpace.new,WhiteSpace.new
408
- # yield self
409
- # @parser = SeqParser.new(@prefix, parser, @postfix) do |_, vs, _|
410
- # vs
411
- # end
412
- # end
413
- # end
414
-
415
- class LiteralParser
411
+ # class LiteralParser
412
+ class Literal
416
413
  include Parsable
417
414
  def initialize(literal)
418
415
  @parser = lambda do |input|
419
- TokenizeParser.new(StringParser.new(literal))
416
+ Tokenize.new(Yaparc::String.new(literal))
420
417
  end
421
418
  end
422
419
  end
@@ -425,23 +422,21 @@ module Yaparc
425
422
 
426
423
  class Identifier
427
424
  include Yaparc::Parsable
428
- @@identifier_regex = ::Yaparc::RegexParser.new(/\A[a-zA-Z_]+[a-zA-Z0-9_]*/)
425
+ @@identifier_regex = ::Yaparc::Regex.new(/\A[a-zA-Z_]+[a-zA-Z0-9_]*/)
429
426
 
430
427
  def initialize(*keywords)
431
428
  if keywords == []
432
429
  @parser = lambda do |input|
433
- TokenizeParser.new(@@identifier_regex)
434
- # Yaparc::Token.new(@@identifier_regex)
430
+ Tokenize.new(@@identifier_regex)
435
431
  end
436
432
  else
437
433
  @parser = lambda do |input|
438
- keyword_parsers = keywords.map {|keyword| Yaparc::StringParser.new(keyword)}
439
- case result = Yaparc::AltParser.new(*keyword_parsers).parse(input)
434
+ keyword_parsers = keywords.map {|keyword| Yaparc::String.new(keyword)}
435
+ case result = Yaparc::Alt.new(*keyword_parsers).parse(input)
440
436
  when Yaparc::Result::OK
441
- Yaparc::FailParser.new
437
+ Yaparc::Fail.new
442
438
  else # Result::Fail or Result::Error
443
- TokenizeParser.new(@@identifier_regex)
444
- # Yaparc::Token.new(@@identifier_regex)
439
+ Tokenize.new(@@identifier_regex)
445
440
  end
446
441
  end
447
442
  end
@@ -452,69 +447,48 @@ module Yaparc
452
447
  end
453
448
  end
454
449
 
455
- # class ParserBase
456
- # include Parsable
457
-
458
- # def parse(input)
459
- # @parser.parse(input)
460
- # end
461
- # end
462
-
463
- class CharParser
450
+ # class Char
451
+ class Char
464
452
  include Parsable
465
453
 
466
454
  def initialize(char)
467
455
  equal_char = lambda {|i| i == char}
468
456
  @parser = lambda do |input|
469
- SatisfyParser.new(equal_char)
457
+ Satisfy.new(equal_char)
470
458
  end
471
459
  end
472
460
  end
473
- # class CharParser < ParserBase
474
-
475
- # def initialize(char)
476
- # equal_char = lambda {|i| i == char}
477
- # @parser = SatisfyParser.new(equal_char)
478
- # end
479
- # end
480
-
481
- # class ZeroOneParser < ParserBase
482
- # def initialize(parser, identity = [])
483
- # @parser = AltParser.new(parser, SucceedParser.new(identity)) # Is it OK?
484
- # end
485
- # end
486
461
 
487
462
  class Ident
488
463
  include Parsable
489
464
  def initialize
490
465
  @parser = lambda do |input|
491
- SeqParser.new(
492
- SatisfyParser.new(IS_LOWER),
493
- ManyParser.new(SatisfyParser.new(IS_ALPHANUM),"")
466
+ Seq.new(
467
+ Satisfy.new(IS_LOWER),
468
+ Many.new(Satisfy.new(IS_ALPHANUM),"")
494
469
  ) do |head, tail|
495
470
  head + tail
496
471
  end
497
472
  end
498
473
  end
499
474
  end
500
- # class Ident < ParserBase
501
- # def initialize
502
- # @parser = SeqParser.new(
503
- # SatisfyParser.new(IS_LOWER),
504
- # ManyParser.new(SatisfyParser.new(IS_ALPHANUM),"")
505
- # ) do |head, tail|
506
- # head + tail
507
- # end
508
- # end
509
- # end
475
+
476
+ class Digit
477
+ include Parsable
478
+ def initialize
479
+ @parser = lambda do |input|
480
+ Satisfy.new(IS_DIGIT)
481
+ end
482
+ end
483
+ end
510
484
 
511
485
  class Nat
512
486
  include Parsable
513
487
  def initialize
514
488
  @parser = lambda do |input|
515
- SeqParser.new(ManyOneParser.new(SatisfyParser.new(IS_DIGIT),"")) do |vs|
489
+ Seq.new(ManyOne.new(Digit.new,'')) do |vs|
516
490
  if vs == ""
517
- vs
491
+ 0 # vs
518
492
  else
519
493
  vs.to_i
520
494
  end
@@ -523,77 +497,25 @@ module Yaparc
523
497
  end
524
498
  end
525
499
 
526
- # class Nat < ParserBase
527
- # def initialize
528
- # @parser = SeqParser.new(ManyOneParser.new(SatisfyParser.new(IS_DIGIT),"")) do |vs|
529
- # if vs == ""
530
- # vs
531
- # else
532
- # vs.to_i
533
- # end
534
- # end
535
- # end
536
- # end
537
-
538
- # class Space < ParserBase
539
- # def initialize
540
- # @parser = SeqParser.new(ManyParser.new(SatisfyParser.new(IS_SPACE),"")) do |vs|
541
- # SucceedParser.new([])
542
- # end
543
- # end
544
- # end
545
-
546
- # class WhiteSpace < ParserBase
547
- # def initialize
548
- # @parser = SeqParser.new(ManyParser.new(SatisfyParser.new(IS_WHITESPACE),"")) do |vs|
549
- # SucceedParser.new([])
550
- # end
551
- # end
552
- # end
553
-
554
- # class Token < ParserBase
555
- # attr_accessor :prefix, :postfix
556
-
557
- # def initialize(parser, prefix = WhiteSpace.new, postfix = WhiteSpace.new)
558
- # @prefix, @postfix = prefix, postfix
559
- # @parser = SeqParser.new(@prefix, parser, @postfix) do |_, vs, _|
560
- # vs
561
- # end
562
- # end
563
- # end
564
500
 
565
501
  class Natural
566
502
  include Parsable
567
503
  def initialize(args = {})
568
504
  @parser = lambda do |input|
569
- TokenizeParser.new(Nat.new, args)
505
+ Tokenize.new(Nat.new, args)
570
506
  end
571
507
  end
572
508
  end
573
- # class Natural < ParserBase
574
-
575
- # def initialize
576
- # @parser = Token.new(Nat.new)
577
- # end
578
- # end
579
-
580
509
 
581
510
  class Symbol
582
511
  include Parsable
583
512
  def initialize(literal, args = {})
584
513
  @parser = lambda do |input|
585
- LiteralParser.new(literal)
514
+ Literal.new(literal)
586
515
  end
587
516
  end
588
517
  end
589
518
 
590
- # class Symbol < ParserBase
591
-
592
- # def initialize(literal)
593
- # @parser = Token.new(StringParser.new(literal))
594
- # end
595
- # end
596
-
597
519
  class AbstractParser
598
520
  include Parsable
599
521