yaparc 0.0.4 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/lib/yaparc.rb +135 -91
  2. data/tests/test_calc.rb +158 -72
  3. data/tests/test_parser.rb +64 -37
  4. 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 > '0' and i < '9'}
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
- @@parser = lambda do |input|
44
- parser = yield
45
- parser.parse(input)
43
+ @@cparser = lambda do
44
+ yield
46
45
  end
47
46
  end
48
47
 
49
- def parser
50
- @@parser
51
- end
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 parse(input, &block)
54
- tree = @@parser.call(input)
55
+ def cparse(input, &block)
56
+ tree = @@cparser.call.parse(input)
55
57
  if block_given?
56
- @@tree = yield tree
58
+ yield tree
57
59
  else
58
- @@tree = tree
60
+ tree
59
61
  end
60
62
  end
61
- # def self.initialize
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
- def initialize(value)
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.parse(input)
106
+ FailParser.new
104
107
  else
105
- if predicate.call(item[0][0])
106
- SucceedParser.new(item[0][0]).parse(item[0][1])
107
- else
108
- FailParser.new.parse(input)
109
- end
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
- class CharParser
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 = lambda do |input|
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).parse(input) # FailParser.new.parse(input)
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.parse(input)
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.parse(input)
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
- class ZeroOneParser
227
- include Parsable
283
+
284
+ class ZeroOneParser < ParserBase
285
+
228
286
  def initialize(parser)
229
- @parser = lambda do |input|
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
- class Ident
237
- include Parsable
291
+
292
+ class Ident < ParserBase
293
+
238
294
  def initialize
239
- @parser = lambda do |input|
240
- SeqParser.new(
241
- SatisfyParser.new(IS_LOWER),
242
- # ManyParser.new(IS_ALPHANUM)
243
- ManyParser.new(SatisfyParser.new(IS_ALPHANUM))
244
- ) do |v, vs|
245
- if vs == []
246
- v
247
- else
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
- include Parsable
308
+ class Nat < ParserBase
309
+
257
310
  def initialize
258
- @parser = lambda do |input|
259
- # SeqParser.new(ManyOneParser.new(IS_DIGIT)) do |vs|
260
- SeqParser.new(ManyOneParser.new(SatisfyParser.new(IS_DIGIT))) do |vs|
261
- if vs == []
262
- vs
263
- else
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
- class Space
272
- include Parsable
321
+
322
+ class Space < ParserBase
323
+
273
324
  def initialize
274
- @parser = lambda do |input|
275
- # SeqParser.new(ManyParser.new(IS_SPACE)) do |vs|
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
- class Token
284
- include Parsable
331
+
332
+ class Token < ParserBase
333
+
285
334
  def initialize(parser)
286
- @parser = lambda do |input|
287
- SeqParser.new(Space.new, parser, Space.new) do |_, vs, _|
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
- class Identifier
295
- include Parsable
341
+
342
+ class Identifier < ParserBase
343
+
296
344
  def initialize
297
- @parser = lambda do |input|
298
- Token.new(Ident.new).parse(input)
299
- end
345
+ @parser = Token.new(Ident.new)
300
346
  end
301
347
  end
302
348
 
303
- class Natural
304
- include Parsable
349
+
350
+ class Natural < ParserBase
351
+
305
352
  def initialize
306
- @parser = lambda do |input|
307
- Token.new(Nat.new).parse(input)
308
- end
353
+ @parser = Token.new(Nat.new)
309
354
  end
310
355
  end
311
356
 
312
- class Symbol
313
- include Parsable
357
+
358
+ class Symbol < ParserBase
359
+
314
360
  def initialize(literal)
315
- @parser = lambda do |input|
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
- class Expr
8
- include Yaparc::Parsable
9
-
10
- define_parser do
11
- AltParser.new(
12
- SeqParser.new(Term.new,
13
- Symbol.new('+'),
14
- Expr.new) do |term, _, expr|
15
- ['+', term,expr]
16
- end,
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 |input|
23
- AltParser.new(
24
- SeqParser.new(Term.new,
25
- Symbol.new('+'),
26
- Expr.new) do |term, _, expr|
27
- ['+', term,expr]
28
- end,
29
- Term.new
30
- ).parse(input)
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
- def eval(input)
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
- # SeqParser.new(Factor.new,
67
- # Symbol.new('*'),
68
- # Term.new) do |factor, _, term|
69
- # ['*', factor,term]
70
- # end,
71
- # Factor.new
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 |input|
77
- AltParser.new(
78
- SeqParser.new(Factor.new,
79
- Symbol.new('*'),
80
- Term.new) do |factor, _, term|
81
- ['*', factor,term]
82
- end,
83
- Factor.new
84
- ).parse(input)
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
- # define_parser do
93
- # AltParser.new(
94
- # SeqParser.new(Symbol.new('('),
95
- # Expr.new,
96
- # Symbol.new(')')) do |_,expr, _|
97
- # expr
98
- # end,
99
- # Natural.new
100
- # )
101
- # end
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 |input|
140
+ @parser = lambda do
105
141
  AltParser.new(
106
- SeqParser.new(Symbol.new('('),
107
- Expr.new,
108
- Symbol.new(')')) do |_,expr, _|
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
- ).parse(input)
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
- parser = Expr.new
125
- result = parser.parse("1 + 2 ")
188
+ result = @expr.parse("1 + 2 ")
126
189
  assert_equal [[["+", 1, 2], ""]], result
127
- assert_equal 3, parser.eval("1 + 2 ")
128
- assert_equal 9, parser.eval("(1 + 2) * 3 ")
190
+ assert_equal 3, @expr.evaluate("1 + 2 ")
191
+ assert_equal 9, @expr.evaluate("(1 + 2) * 3 ")
129
192
  end
130
193
 
131
- def test_expr_define_parser
132
- parser = Expr.new
133
- result = Expr.parse("1 + 2 ")
134
- assert_equal [[["+", 1, 2], ""]], result
135
- assert_equal 3, parser.eval("1 + 2 ")
136
- assert_equal 9, parser.eval("(1 + 2) * 3 ")
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.4
7
- date: 2008-01-05 00:00:00 +09:00
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