depager 0.2.2 → 0.2.3

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.
Files changed (62) hide show
  1. data/ChangeLog +4 -0
  2. data/README.ja +27 -28
  3. data/examples/c89/c89.dr +34 -34
  4. data/examples/c89/c89.tab.rb +3074 -3074
  5. data/examples/extension/paction.dr +4 -4
  6. data/examples/extension/pactiontest.dr +1 -1
  7. data/examples/pl0d/pl0ds.dr +27 -27
  8. data/examples/pl0d/pl0ds.tab.rb +626 -643
  9. data/examples/sample_calc/calc.action.dr +6 -6
  10. data/examples/sample_calc/calc.action.tab.rb +90 -90
  11. data/examples/sample_calc/calc.ast.action.dr +7 -7
  12. data/examples/sample_calc/calc.ast.action.tab.rb +121 -127
  13. data/examples/sample_calc/calc.ast.dr +6 -6
  14. data/examples/sample_calc/calc.ast.tab.rb +102 -109
  15. data/examples/sample_calc/calc.astdf.dr +6 -6
  16. data/examples/sample_calc/calc.astdf.tab.rb +102 -109
  17. data/examples/sample_calc/calc.atree.dr +6 -6
  18. data/examples/sample_calc/calc.atree.tab.rb +90 -90
  19. data/examples/sample_calc/calc.cst.dr +5 -5
  20. data/examples/sample_calc/calc.cst.tab.rb +106 -106
  21. data/examples/sample_calc/calc.dr +1 -1
  22. data/examples/sample_calc/calc.lex.dr +4 -4
  23. data/examples/sample_calc/calc.lex.tab.rb +73 -73
  24. data/examples/sample_calc/calc.nvaction.dr +6 -6
  25. data/examples/sample_calc/calc.nvaction.tab.rb +90 -90
  26. data/examples/sample_calc/calc.tab.rb +71 -71
  27. data/examples/sample_calc/calc_prec.nvaction.dr +6 -6
  28. data/examples/sample_calc/calc_prec.nvaction.tab.rb +46 -46
  29. data/examples/slex_test/divreg.slex.dr +7 -7
  30. data/examples/slex_test/divreg.slex.tab.rb +20 -20
  31. data/examples/slex_test/ljoin.slex.dr +7 -7
  32. data/examples/slex_test/ljoin.slex.tab.rb +15 -15
  33. data/lib/depager.rb +45 -83
  34. data/lib/depager/grammar.rb +3 -7
  35. data/lib/depager/lr.rb +123 -1
  36. data/lib/depager/parser.rb +29 -48
  37. data/lib/depager/{template/ast.erbs → ruby/plugins/_ast_tmpl.rb} +11 -7
  38. data/lib/depager/{action.rb → ruby/plugins/action.rb} +7 -11
  39. data/lib/depager/{ast.dr → ruby/plugins/ast.dr} +24 -25
  40. data/lib/depager/{ast.rb → ruby/plugins/ast.rb} +241 -243
  41. data/lib/depager/{astdf.rb → ruby/plugins/astdf.rb} +1 -2
  42. data/lib/depager/{atree.dr → ruby/plugins/atree.dr} +5 -5
  43. data/lib/depager/{atree.rb → ruby/plugins/atree.rb} +39 -39
  44. data/lib/depager/{cst.dr → ruby/plugins/cst.dr} +17 -21
  45. data/lib/depager/{cst.rb → ruby/plugins/cst.rb} +62 -68
  46. data/lib/depager/{lex.dr → ruby/plugins/lex.dr} +3 -4
  47. data/lib/depager/{lex.rb → ruby/plugins/lex.rb} +29 -31
  48. data/lib/depager/{nvaction.rb → ruby/plugins/nvaction.rb} +1 -3
  49. data/lib/depager/{slex.dr → ruby/plugins/slex.dr} +16 -17
  50. data/lib/depager/{slex.rb → ruby/plugins/slex.rb} +115 -117
  51. data/lib/depager/{srp.rb → ruby/plugins/srp.rb} +4 -4
  52. data/lib/depager/{template → ruby/templates}/extension_lalr_master.erb +6 -6
  53. data/lib/depager/{template → ruby/templates}/extension_lalr_slave.erb +0 -0
  54. data/lib/depager/{template → ruby/templates}/simple.erb +0 -0
  55. data/lib/depager/{template → ruby/templates}/single_lalr_parser.erb +0 -0
  56. data/lib/depager/utils.rb +30 -69
  57. data/lib/depager/version.rb +1 -1
  58. metadata +59 -56
  59. data/examples/Rakefile +0 -36
  60. data/lib/depager/Rakefile +0 -34
  61. data/lib/depager/lr_put_table.rb +0 -116
  62. data/lib/depager/parse_action.rb +0 -24
@@ -2,8 +2,8 @@ module Depager::ParsingMethod
2
2
  class Grammar
3
3
  attr_accessor :rulelist, :lhs_to_rule, :syms, :nonterms, :terms
4
4
  attr_accessor :precs, :f0e, :first1
5
- Eps = 0x3fffffff #epsilon
6
- #Eps = []
5
+ Eps = 0x3fffffff #epsilon #Eps = []
6
+ def initialize_depend ; end # template method for inheritance
7
7
  def initialize rulelist, terms, nonterms, precs = nil
8
8
  @precs = precs
9
9
  @nonterms = nonterms.invert
@@ -26,9 +26,6 @@ module Depager::ParsingMethod
26
26
  initialize_depend
27
27
  end
28
28
 
29
- def initialize_depend
30
- end
31
-
32
29
  def make_sym_mask
33
30
  @sym_mask, @mask_sym = {}, []
34
31
  @terms.sort_by{|a, b| a}.each_with_index do |i,x|
@@ -90,8 +87,8 @@ module Depager::ParsingMethod
90
87
  end
91
88
  end while changed
92
89
 
93
- old_make_sym_first
94
90
  =begin
91
+ old_make_sym_first
95
92
  warn "check.."
96
93
  @first1.each do |k,v|
97
94
  old = @old_first1[k].sort
@@ -256,7 +253,6 @@ module Depager::ParsingMethod
256
253
  end
257
254
  end
258
255
  end
259
- G = Grammar
260
256
 
261
257
  class Rule
262
258
  def self.[] l, r, prec = nil
@@ -1,5 +1,11 @@
1
1
  require 'pp'
2
2
  require 'depager/grammar.rb'
3
+
4
+ module Depager::ParsingMethod
5
+ class Grammar
6
+ end
7
+ end
8
+
3
9
  module Depager::LALR
4
10
  class SingleParserGenerator < Simple::SingleGenerator
5
11
  Tmplfile = 'single_lalr_parser.erb'
@@ -420,7 +426,6 @@ module Depager::LALR
420
426
  @warning_list.each{|i| dp.warning i }
421
427
 
422
428
  if $MP_DEBUG
423
- require 'depager/lr_put_table.rb'
424
429
  gen_state_info
425
430
  verbose dp if $MP_VERBOSE
426
431
  end
@@ -455,3 +460,120 @@ module Depager::LALR
455
460
  end
456
461
  end
457
462
  end
463
+
464
+ class Depager::LALR::Table
465
+ def state_info
466
+ @state_info
467
+ end
468
+
469
+ #puts grammar.closure.values.join("\n")
470
+ #puts "-----"
471
+ #puts grammar.memo_closure1.sort_by{|k,v| k}.map{|k,v| "#{k.inspect}:\n#{v.join("\n")}"}
472
+ #puts 'mk'; mk.each{|k, v| p "#{k}=>#{v}"}
473
+ #trn = trn.uniq
474
+ #puts 'trn',trn.map{|a| "<#{a[2].n}>#{a[0]} => <#{a[3].n}>#{a[1]}"}
475
+
476
+ def gen_state_info
477
+ g = grammar
478
+ @state_info = []
479
+ @action_table.each_with_index {|s,x|
480
+ shi, red, acc = "", "", ""
481
+ s.each_with_index {|t, y|
482
+ next unless t
483
+ hd = (" %-15s" % g.symname(y + g.nonterms.size))
484
+ if t == 'ACC'
485
+ acc = "#{hd} accept\n\n"
486
+ elsif t < 0
487
+ red << "#{hd} reduce using rule #{-t} (#{g.symname g[-t].lhs})\n"
488
+ else
489
+ shi << "#{hd} shift, and goto to state #{t}\n"
490
+ end
491
+ }
492
+ if t = @defred_table[x]
493
+ as = @defred_after_shift_table[x] ? " [after shift]" : ""
494
+ red << (" %-15s" % '$default') <<
495
+ "reduce using rule #{-t} (#{g.symname g[-t].lhs}) #{as}\n"
496
+ end
497
+
498
+ @state_info << (@states[x].to_s << "\n\n#{shi}\n#{red}\n#{acc}")
499
+ }
500
+ end
501
+
502
+ def verbose dp
503
+ g, output = grammar, []
504
+
505
+ if $MP_DEBUG.match(/f/)
506
+ output << "** FIRST1 **"
507
+ str = g.first1.map{|k, v|
508
+ "#{g.symname k} => #{v.map{|i| g.symname i}.join(' ')}"
509
+ }.join("\n")
510
+ output << "#{str}\n\n"
511
+ end
512
+
513
+ if $MP_DEBUG.match(/e/)
514
+ output << "** Empty Reduction **"
515
+ str = g.f0e.map {|k, v|
516
+ "#{g.symname k} =>\n" << v.map{|n, f|
517
+ " #{rulelist[n]} ? #{f.map{|i| g.symname i}.join(' ')}"
518
+ }.join("\n")
519
+ }.join("\n")
520
+ output << "#{str}\n\n"
521
+ end
522
+
523
+ if $MP_DEBUG.match(/s/)
524
+ output << "** SYMBOLS **"
525
+ str = g.syms.map{|k,_| "#{"%03i" % k} #{ g.symname k}"}.sort.join("\n")
526
+ output << "#{str}\n\n"
527
+ end
528
+
529
+ if $MP_DEBUG.match(/g/)
530
+ output << "*** Grammar ***"
531
+ str = g.rulelist.join("\n")
532
+ output << "#{str}\n\n"
533
+ end
534
+
535
+ if $MP_DEBUG.match(/c/)
536
+ output << "*** States ***"
537
+ output << @state_info.to_s
538
+ end
539
+
540
+ nssize = g.nonterms.size
541
+ if $MP_DEBUG.match(/t/)
542
+ output << "*** Action Table ***"
543
+ ws = (nssize...g.syms.size).map{|i| j = g.symname(i).size; j < 6 ? 6 : j}
544
+ str = " |"
545
+ (nssize...g.syms.size).each_with_index{|i, x|
546
+ str << ("%0#{ws[x]}s|" % g.symname(i))
547
+ }; str << " $default|\n"
548
+
549
+ @action_table.each_with_index{|i,x|
550
+ str << ("%03i|" % x)
551
+ i.each_with_index{|j, y|
552
+ str << ("%0#{ws[y]}s|" % j)
553
+ }
554
+ str << ("%04s,%04s|\n" % [@defred_table[x], @defred_after_shift_table[x]])
555
+ }
556
+ output << "#{str}\n\n"
557
+
558
+ output << "*** Goto Table ***"
559
+ ws = (1...nssize).map{|i| j = g.symname(i).size; j < 6 ? 6 : j}
560
+ str = " |"
561
+ (1...nssize).each_with_index{|i, x|
562
+ str << ("%0#{ws[x]}s|" % g.symname(i))
563
+ }; str << "\n"
564
+
565
+ @goto_table.each_with_index{|i,x|
566
+ str << ("%03i|" % x)
567
+ i.each_with_index{|j, y|
568
+ str << ("%0#{ws[y]}s|" % j)
569
+ }
570
+ str << "\n"
571
+ }
572
+ output << "#{str}\n\n"
573
+ end
574
+
575
+ File.open("#{File.basename(dp.files.fname, '.dr')}.output", "w"){|f|
576
+ f.write output.join("\n")
577
+ }
578
+ end
579
+ end
@@ -40,19 +40,10 @@ module Depager::LALR
40
40
  # [0, [la0, v0], s0, [la1, v1], s1, .....]
41
41
  #
42
42
  class Parser
43
- def initialize
44
- end
45
-
46
43
  ACC = 0x03ffffff
47
44
 
48
- #
49
- # lexer
50
- #
51
- def lex
52
- end
53
-
54
45
  # parse method
55
- def yyparse f
46
+ def parse f
56
47
  @basis.file = f
57
48
  @basis.la = [0, nil]
58
49
  @basis.lex do |sym, val|
@@ -63,9 +54,6 @@ module Depager::LALR
63
54
  end
64
55
 
65
56
  protected
66
- def init_parser
67
- end
68
-
69
57
  # driver method
70
58
  def driver
71
59
  while true
@@ -95,14 +83,6 @@ module Depager::LALR
95
83
  end
96
84
  end
97
85
  end
98
- def accept
99
- end
100
- def error
101
- end
102
- def shift
103
- end
104
- def reduce
105
- end
106
86
 
107
87
  def enable?(act, sym)
108
88
  case act
@@ -125,6 +105,14 @@ module Depager::LALR
125
105
  else
126
106
  end
127
107
  end
108
+
109
+ # template methods
110
+ def init_parser ; end
111
+ def lex ; end
112
+ def accept ; end
113
+ def error ; end
114
+ def shift ; end
115
+ def reduce ; end
128
116
  end
129
117
 
130
118
  class Basis < Parser
@@ -153,7 +141,7 @@ module Depager::LALR
153
141
  @t2i, @i2t, @nt2i, @i2nt = self.class::Tables
154
142
  end
155
143
 
156
- def _Token sym, val=nil, lineno=nil
144
+ def token sym, val=nil, lineno=nil
157
145
  lineno ||= file.lineno
158
146
  return sym, Depager::Token[val, lineno, file.path]
159
147
  end
@@ -227,42 +215,35 @@ module Depager::LALR
227
215
  end
228
216
 
229
217
  def accept
230
- beforeAccept
218
+ before_accept
231
219
  @inside.accept
232
- afterAccept
220
+ after_accept
233
221
  end
234
222
  def error
235
- beforeError
223
+ before_error
236
224
  @inside.error
237
- afterError
225
+ after_error
238
226
  end
239
227
  def shift
240
- beforeShift
228
+ before_shift
241
229
  @inside.shift
242
- afterShift
230
+ after_shift
243
231
  end
244
232
  def reduce
245
- beforeReduce
233
+ before_reduce
246
234
  @inside.reduce
247
- afterReduce
235
+ after_reduce
248
236
  end
249
237
 
250
- def beforeAccept
251
- end
252
- def afterAccept
253
- end
254
- def beforeError
255
- end
256
- def afterError
257
- end
258
- def beforeShift
259
- end
260
- def afterShift
261
- end
262
- def beforeReduce
263
- end
264
- def afterReduce
265
- end
238
+ # template methods
239
+ def before_accept ; end
240
+ def after_accept ; end
241
+ def before_error ; end
242
+ def after_error ; end
243
+ def before_shift ; end
244
+ def after_shift ; end
245
+ def before_reduce ; end
246
+ def after_reduce ; end
266
247
  end
267
248
 
268
249
  #
@@ -273,7 +254,7 @@ module Depager::LALR
273
254
  super inside, nparamkey
274
255
  @_yy_val_ = []
275
256
  end
276
- def beforeReduce
257
+ def before_reduce
277
258
  @_yy_val_ = []
278
259
  n = @reduce_table[-_actvalue][1]
279
260
  n.times do |i|
@@ -281,7 +262,7 @@ module Depager::LALR
281
262
  @_yy_val_[n-i-1] = x[1] == :NT ? x[@nparam] : x[1]
282
263
  end
283
264
  end
284
- def afterReduce
265
+ def after_reduce
285
266
  mes = @on_reduce[-_actvalue]
286
267
  r = mes ? self.send(mes, @_yy_val_) : nil
287
268
  _stack[_stack.size-2][@nparam] = r
@@ -1,7 +1,8 @@
1
- ===:defnode
1
+ class ASTBuilderExtension
2
+ TMPL_NODE_BASE = <<EOS
2
3
  class Node
3
4
  attr_accessor :lineno
4
- attr_accessor <%= _opt_attr.map{|i| ":#{i}" }.join(', ') %>
5
+ attr_accessor <%= _opt_attr.map{|i| ":\#{i}" }.join(', ') %>
5
6
  <%= ini %>
6
7
  def self.[] lineno, *args
7
8
  self.new lineno, *args
@@ -43,22 +44,23 @@ class NodeList < Node
43
44
  end
44
45
  class NilNode
45
46
  attr_accessor :lineno
46
- attr_accessor <%= _opt_attr.map{|i| ":#{i}" }.join(', ') %>
47
+ attr_accessor <%= _opt_attr.map{|i| ":\#{i}" }.join(', ') %>
47
48
  def initialize(lineno, *args)
48
49
  @lineno = lineno
49
50
  end
50
51
  def accept v
51
52
  end
52
53
  end
54
+ EOS
53
55
 
54
- ===:node
56
+ TMPL_NODE = <<EOS
55
57
  class Node_<%= name %> < Node
56
- attr_accessor <%= nodes.map{|i| ":#{i}" }.join(', ') %>
57
- attr_accessor <%= attrs.map{|i| ":#{i}" }.join(', ') %>
58
+ attr_accessor <%= nodes.map{|i| ":\#{i}" }.join(', ') %>
59
+ attr_accessor <%= attrs.map{|i| ":\#{i}" }.join(', ') %>
58
60
  def initialize <%= nodes.unshift('lineno').join(', ') %>
59
61
  super()
60
62
  @lineno = lineno
61
- <%= nodes.inject(''){|r,i| r << " @#{i} = #{i}\n"} %>
63
+ <%= nodes.inject(''){|r,i| r << " @\#{i} = \#{i}\n"} %>
62
64
  end
63
65
  def accept v
64
66
  warn @lineno.to_s+':'+self.class.to_s if $DEBUG
@@ -67,3 +69,5 @@ class Node_<%= name %> < Node
67
69
  self
68
70
  end
69
71
  end
72
+ EOS
73
+ end
@@ -1,9 +1,7 @@
1
1
  require 'depager/parser.rb'
2
- require 'depager/parse_action.rb'
3
2
 
4
3
  class ActionExtension #:nodoc:all
5
4
  include Depager::ExtensionUtils
6
- include Depager::ActionParser
7
5
  def initialize
8
6
  @line0 = @line = @oldline = ''
9
7
  @optouter = []
@@ -14,31 +12,29 @@ class ActionExtension #:nodoc:all
14
12
  return code, 0
15
13
  end
16
14
 
17
- def preRuleList
15
+ def pre_rule_list
18
16
  if g_parser.line0 =~ /^%ACTION\{\s*$/
19
17
  while line = getline
20
18
  break if line =~ /^%\}\s*$/
21
19
  @optouter.push line
22
20
  end
23
- fixline ''
24
- gettoken
21
+ g_parser.update_context ''
25
22
  end
26
23
  end
27
24
 
28
- def postRhs
29
- if token[0] == '{'
30
- @line0, @line = g_parser.line0, g_parser.oldline
25
+ def post_rhs
26
+ if g_parser.line =~ /\s*\{/
27
+ @line0, @line = g_parser.line0, g_parser.line
31
28
  lineno = g_parser.lineno
32
29
  code, d = modify_action_code(parse_action)
33
30
  @optouter <<
34
31
  gen_defm_code("_act_#{nrules} val", code, lineno, d)
35
- fixline @line
36
- gettoken
32
+ g_parser.update_context @line
37
33
  @on_reduce[nrules] = ":_act_#{nrules}"
38
34
  end
39
35
  end
40
36
 
41
- def postRuleList
37
+ def post_rule_list
42
38
  g_parser.optouter <<
43
39
  gen_action_decorator_code(
44
40
  target_name, paramkey,
@@ -1,9 +1,10 @@
1
1
  %defext ASTBuilderExtension
2
- %extend Lexer ('depager/lex.rb')
3
- %extend NVAction ('depager/nvaction.rb')
2
+ %extend Lexer ('plugins/lex.rb')
3
+ %extend NVAction ('plugins/nvaction.rb')
4
4
  %decorate @NVAction
5
- #%decorate ShiftReducePrinter ('depager/srp.rb')
5
+ #%decorate ShiftReducePrinter ('plugins/srp.rb')
6
6
  %inner{
7
+ require 'plugins/_ast_tmpl'
7
8
  attr_accessor :optouter, :on_reduce, :visitor
8
9
  def init_parser
9
10
  super
@@ -12,13 +13,12 @@
12
13
  @on_reduce = []
13
14
  @output_file_name = nil
14
15
  end
15
- def postRuleList
16
+ def post_rule_list
16
17
  g_parser.optouter <<
17
18
  gen_action_decorator_code(target_name, paramkey,
18
19
  @on_reduce, @optouter)
19
20
  end
20
21
 
21
- Template = CodeUtils::make_tmpl("#{Depager::Tmpldir}/ast.erbs")
22
22
  def modify_action_code code, nodes=[]
23
23
  code = code.gsub(/\$\.([a-z_])/, 'node.\1')
24
24
  code << %{
@@ -37,19 +37,18 @@
37
37
  @output_file_name = ofname
38
38
  end
39
39
  %}
40
- %hook prerulelist /%AST\{\s*\Z/ skip
40
+ %hook pre_rule_list /%AST\{\s*\Z/ skip
41
41
  %banner '%AST{ ... }'
42
- %mixin ActionParser ('depager/parse_action')
43
42
  %%
44
43
 
45
44
  %LEX{
46
45
  /\s+/, /#.*/ { }
47
46
  /%\}\s*\Z/ { @line = $'; yield nil,nil }
48
- 'Node' { yield _Token(:NODE, $&) }
49
- 'Visitor' { yield _Token(:VISITOR, $&) }
50
- /[a-zA-Z][a-zA-Z0-9_]*/ { yield _Token(:ID, $&) }
51
- '{' ! { ln = lineno; yield _Token(:ACTION, parse_action, ln) }
52
- /./ { yield _Token($&, $&) }
47
+ 'Node' { yield token(:NODE, $&) }
48
+ 'Visitor' { yield token(:VISITOR, $&) }
49
+ /[a-zA-Z][a-zA-Z0-9_]*/ { yield token(:ID, $&) }
50
+ '{' ! { ln = lineno; yield token(:ACTION, parse_action, ln) }
51
+ /./ { yield token($&, $&) }
53
52
  %}
54
53
 
55
54
  #begin-rule
@@ -92,7 +91,7 @@
92
91
  #{_ACTION.value}
93
92
  end
94
93
  };#code
95
- master.gen_tmpl_code(:defnode, binding)
94
+ ERB.new(master.class::TMPL_NODE_BASE).result(binding)
96
95
  }
97
96
  ;
98
97
  opt_defvis:
@@ -131,7 +130,7 @@
131
130
  master.gen_defm_code("visit_Node_#{name} node",
132
131
  vis_code, act.lineno)
133
132
  end
134
- master.gen_tmpl_code(:node, binding)
133
+ ERB.new(master.class::TMPL_NODE).result(binding)
135
134
  }
136
135
  ;
137
136
  defnode_header:
@@ -173,7 +172,7 @@
173
172
  ;
174
173
  #end-rule
175
174
  %%
176
- %hook postrhs /=>/ skip
175
+ %hook post_rhs /=>/ skip
177
176
  %banner '=>...'
178
177
  %prec{
179
178
  left LL '@'
@@ -191,17 +190,17 @@
191
190
  %LEX{
192
191
  /[ \t]+/ { }
193
192
  /\r?\n/ { yield nil, nil }
194
- /<</ { yield _Token(:LL, $&) }
193
+ /<</ { yield token(:LL, $&) }
195
194
  /%([a-zA-Z0-9_]+)((::[a-zA-Z0-9_]+)*)/
196
- { yield _Token(:CONST, $1+$2) }
197
- /%\((.+)\)%/ { yield _Token(:EMBED, $1) }
198
- 'nil' { yield _Token(:NIL, $&) }
199
- 'NilNode' { yield _Token(:NILNODE, $&) }
200
- /[0-9]+/ { yield _Token(:NUMBER, $&.to_i) }
201
- /:[a-zA-Z0-9_]+/ { yield _Token(:SYMBOL, $&) }
202
- /[a-zA-Z][a-zA-Z0-9_]*/ { yield _Token(:ID, $&) }
203
- /'(.+)'/ { yield _Token(:STR, $1) }
204
- /./ { yield _Token($&, $&) }
195
+ { yield token(:CONST, $1+$2) }
196
+ /%\((.+)\)%/ { yield token(:EMBED, $1) }
197
+ 'nil' { yield token(:NIL, $&) }
198
+ 'NilNode' { yield token(:NILNODE, $&) }
199
+ /[0-9]+/ { yield token(:NUMBER, $&.to_i) }
200
+ /:[a-zA-Z0-9_]+/ { yield token(:SYMBOL, $&) }
201
+ /[a-zA-Z][a-zA-Z0-9_]*/ { yield token(:ID, $&) }
202
+ /'(.+)'/ { yield token(:STR, $1) }
203
+ /./ { yield token($&, $&) }
205
204
  %}
206
205
  #begin-rule
207
206
  start: