depager 0.2.3 → 0.3.0.b20160729

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/README.en +4 -19
  3. data/README.ja +42 -79
  4. data/bin/depager +42 -45
  5. data/examples/action_pl0d/pl0d.action.dr +421 -0
  6. data/examples/action_pl0d/test.pl0ds +49 -0
  7. data/examples/c89/c89.dr +493 -496
  8. data/examples/c89/test.c89 +10 -10
  9. data/examples/extension/astdf.rb +10 -0
  10. data/examples/extension/atree.dr +55 -0
  11. data/examples/{sample_calc → extension}/calc.atree.dr +42 -43
  12. data/examples/extension/calc.simple_action.dr +33 -0
  13. data/examples/extension/paction.dr +16 -15
  14. data/examples/extension/pactiontest.dr +14 -14
  15. data/examples/extension/simple_action.rb +44 -0
  16. data/examples/pl0d/pl0ds.dr +337 -334
  17. data/examples/pl0d/test.pl0ds +33 -33
  18. data/examples/rie_calc/calc.rie.dr +57 -0
  19. data/examples/rie_calc/test.calc +4 -0
  20. data/examples/rie_dcuse/dcuse.rie.dr +71 -0
  21. data/examples/rie_dcuse/test.dcuse +1 -0
  22. data/examples/rie_pl0/orig_ex/exerrdg.pl0 +44 -0
  23. data/examples/rie_pl0/orig_ex/exerrm.pl0 +19 -0
  24. data/examples/rie_pl0/orig_ex/exerrmre.pl0 +20 -0
  25. data/examples/rie_pl0/orig_ex/exerrtok.pl0 +18 -0
  26. data/examples/rie_pl0/orig_ex/exmdg.pl0 +40 -0
  27. data/examples/rie_pl0/orig_ex/exmdgwwl.pl0 +43 -0
  28. data/examples/rie_pl0/orig_ex/exmrw.pl0 +22 -0
  29. data/examples/rie_pl0/orig_ex/exmwwl.pl0 +18 -0
  30. data/examples/rie_pl0/orig_ex/exnorw.pl0 +17 -0
  31. data/examples/rie_pl0/pl0.rie.dr +450 -0
  32. data/examples/rie_pl0/test.pl0 +10 -0
  33. data/examples/sample_calc/calc.action.dr +33 -33
  34. data/examples/sample_calc/calc.ast.action.dr +65 -66
  35. data/examples/sample_calc/calc.ast.dr +55 -55
  36. data/examples/sample_calc/calc.cst.dr +45 -45
  37. data/examples/sample_calc/calc.dr +43 -43
  38. data/examples/sample_calc/calc.lex.dr +29 -29
  39. data/examples/sample_calc/{calc_prec.nvaction.dr → calc_prec.action.dr} +31 -31
  40. data/examples/slex_test/divreg.slex.dr +29 -29
  41. data/examples/slex_test/ljoin.slex.dr +36 -36
  42. data/examples/slex_test/test.divreg +1 -1
  43. data/examples/slex_test/test.ljoin +3 -3
  44. data/lib/depager.rb +582 -670
  45. data/lib/depager/grammar.rb +256 -291
  46. data/lib/depager/lr.rb +574 -579
  47. data/lib/depager/parser.rb +282 -277
  48. data/lib/depager/ruby/plugins/_rie_debug.rb +35 -0
  49. data/lib/depager/ruby/plugins/action.rb +53 -43
  50. data/lib/depager/ruby/plugins/ast.dr +364 -269
  51. data/lib/depager/ruby/plugins/ast.rb +1367 -1308
  52. data/lib/depager/ruby/plugins/cst.dr +172 -180
  53. data/lib/depager/ruby/plugins/cst.rb +587 -626
  54. data/lib/depager/ruby/plugins/lex.dr +85 -89
  55. data/lib/depager/ruby/plugins/lex.rb +310 -336
  56. data/lib/depager/ruby/plugins/rie.dr +723 -0
  57. data/lib/depager/ruby/plugins/rie.rb +1653 -0
  58. data/lib/depager/ruby/plugins/slex.dr +202 -200
  59. data/lib/depager/ruby/plugins/slex.rb +780 -817
  60. data/lib/depager/ruby/plugins/srp.rb +56 -51
  61. data/lib/depager/ruby/templates/extension_lalr_master.erb +46 -51
  62. data/lib/depager/ruby/templates/extension_lalr_slave.erb +99 -107
  63. data/lib/depager/ruby/templates/single_lalr_parser.erb +115 -117
  64. data/lib/depager/utils.rb +148 -318
  65. data/lib/depager/version.rb +4 -3
  66. metadata +52 -60
  67. data/ChangeLog +0 -16
  68. data/data/depager/pre-setup.rb +0 -3
  69. data/examples/c89/c89.tab.rb +0 -7127
  70. data/examples/pl0d/pl0ds.tab.rb +0 -2698
  71. data/examples/sample_calc/calc.action.tab.rb +0 -457
  72. data/examples/sample_calc/calc.ast.action.tab.rb +0 -749
  73. data/examples/sample_calc/calc.ast.tab.rb +0 -665
  74. data/examples/sample_calc/calc.astdf.dr +0 -54
  75. data/examples/sample_calc/calc.astdf.tab.rb +0 -672
  76. data/examples/sample_calc/calc.atree.tab.rb +0 -451
  77. data/examples/sample_calc/calc.cst.tab.rb +0 -644
  78. data/examples/sample_calc/calc.lex.tab.rb +0 -374
  79. data/examples/sample_calc/calc.nvaction.dr +0 -33
  80. data/examples/sample_calc/calc.nvaction.tab.rb +0 -465
  81. data/examples/sample_calc/calc.tab.rb +0 -365
  82. data/examples/sample_calc/calc_prec.nvaction.tab.rb +0 -431
  83. data/examples/slex_test/divreg.slex.tab.rb +0 -303
  84. data/examples/slex_test/ljoin.slex.tab.rb +0 -370
  85. data/lib/depager/ruby/plugins/_ast_tmpl.rb +0 -73
  86. data/lib/depager/ruby/plugins/astdf.rb +0 -6
  87. data/lib/depager/ruby/plugins/atree.dr +0 -55
  88. data/lib/depager/ruby/plugins/atree.rb +0 -347
  89. data/lib/depager/ruby/plugins/nvaction.rb +0 -19
  90. data/lib/depager/ruby/templates/simple.erb +0 -23
  91. data/setup.rb +0 -1585
@@ -1,200 +1,202 @@
1
- %defext StatefulLexerExtension
2
- %extend Lexer ('plugins/lex.rb')
3
- %extend NVAction ('plugins/nvaction.rb')
4
- %decorate @NVAction
5
- #%decorate ShiftReducePrinter ('plugins/srp.rb')
6
- %inner{
7
- attr_accessor :ins, :code, :optval
8
- def init_parser
9
- super
10
- @ins = []
11
- @optouter = []
12
- @on_reduce = []
13
- @addition = []
14
- end
15
- def post_rule_list
16
- @optouter << %{
17
- def afterError
18
- warn "StatefulLex: lex_state==\#{@basis.lex_state}" if $MP_DEBUG
19
- end
20
- }
21
- g_parser.optouter <<
22
- gen_action_decorator_code(target_name, paramkey,
23
- @on_reduce, @optouter)
24
- end
25
- def post_rhs
26
- j = 0
27
- rhs = g_parser.rhs
28
- @ins.each do |i, option_list, debug|
29
- state_name = "#{lhs_name}_#{nrhs}_#{i}"
30
- m_name = "_lex_#{state_name}"
31
- if i != rhs.size
32
- nt_name = "__#{state_name}__"
33
- isym = g_parser.add_nonterm(nt_name)
34
- g_parser.rhs_insert_sym(i+j, isym, nt_name)
35
- @addition << [ isym, m_name ]
36
- j += 1
37
- else
38
- @on_reduce[nrules] = ':'+m_name
39
- end
40
-
41
- codes = option_list.map do |k, m|
42
- case k
43
- when :GOTO
44
- "@basis.lex_state = #{m}" <<
45
- (debug ? ";warn 'MODE:->#{m}'" : '')
46
- when :ADD
47
- "@basis.lex_context[#{m}] = true" <<
48
- (debug ? ";warn 'CONTEXT:+#{m}/\#{@context.inspect}'" : '')
49
- when :SUB
50
- "@basis.lex_context.delete #{m}" <<
51
- (debug ? ";warn 'CONTEXT:-#{m}'/\#{@context.inspect}" : '')
52
- else
53
- end
54
- end
55
- @optouter.push << %{
56
- def #{m_name} val
57
- #{codes.join("\n ")}
58
- end
59
- }
60
- end
61
- @ins.clear
62
- end
63
- def post_rhs_list
64
- @addition.each do |isym, m_name|
65
- g_parser.add_rule isym, []
66
- @on_reduce[nrules] = ':'+m_name
67
- end
68
- @addition.clear
69
- end
70
- %}
71
- ######################################################################
72
- # Define Tokens
73
- ######################################################################
74
- %hook pre_rule_list /%LEX\{\s*\Z/ skip
75
- %banner '%LEX{ ... }'
76
- %%
77
- %LEX{
78
- /\s+/, /#.*\Z/ { }
79
- /[A-Z]+/ { yield token(:ID, $&) }
80
- /\%\}\s*\Z/ { yield nil,nil }
81
- /\/(([^\/\\]+|\\.)*)\// { yield token(:LEX, "/\\A#{$1}/") }
82
- /'([^'\\]+|\\.)*'/,
83
- /"([^"\\]+|\\.)*"/
84
- {
85
- yield token(:LEX, "/\\A#{Regexp.escape($1).gsub('/', '\/')}/")
86
- }
87
- '{' !
88
- {
89
- _lineno = lineno
90
- yield token(:ACTION, parse_action, _lineno)
91
- }
92
- /./ { yield token($&, $&) }
93
- %}
94
- #begin-rule
95
- start:
96
- mode_list
97
- {
98
- ll = ''
99
- _mode_list.each do |m, s, l|
100
- else_code = if s
101
- "lex_#{s}(&block)"
102
- else
103
- 'raise RuntimeError, "must not happen #{@line}"'
104
- end
105
- ll << %{
106
- def lex_#{m}(&block)
107
- case @line
108
- #{l}
109
- else
110
- #{else_code}
111
- end
112
- end
113
- }; #code
114
- end
115
- g_parser.optinner << ll << %{
116
- attr_accessor :lex_state, :lex_context
117
- def lex(&block)
118
- @lex_state ||= :START
119
- @lex_context ||= {}
120
- begin
121
- until @line.empty?
122
- self.send "lex_\#{@lex_state}", &block
123
- end
124
- end while @line0 = @line = getline
125
- yield nil, nil
126
- end
127
- }; #code
128
- }
129
- ;
130
- mode_list:
131
- { [ ] }
132
- | mode_list mode lexactlist { _mode_list << [_mode[0], _mode[1], _lexactlist] }
133
- ;
134
- mode:
135
- '<' ID opt_super '>' { [ _ID.value, _opt_super ] }
136
- ;
137
- opt_super:
138
- { nil }
139
- | ':' ID { _ID.value }
140
- ;
141
- lexactlist:
142
- lexact { _lexact }
143
- | lexactlist lexact { _lexactlist << _lexact }
144
- ;
145
- lexact:
146
- lexlist opt_noskip ACTION
147
- {
148
- %{
149
- when #{_lexlist.join(', ')}
150
- #{ _opt_noskip ? '#' : "@oldline = @line; @line = $'" }
151
- #{ _ACTION.value }
152
- }; #code
153
- }
154
- ;
155
- opt_noskip:
156
- { false }
157
- | '!' { true }
158
- ;
159
- lexlist:
160
- LEX { [ _LEX.value ] }
161
- | lexlist ',' LEX { _lexlist.push _LEX.value }
162
- ;
163
- #end-rule
164
- %%
165
- ######################################################################
166
- # Change State
167
- ######################################################################
168
- %hook pre_rhs post_symbol /\[/
169
- %banner '[> ...]'
170
- %%
171
- %LEX{
172
- /\s+/ { }
173
- /:[a-zA-Z_]+\??/ { yield token(:SYMBOL, $&) }
174
- /\]/ { yield token($&, $&); @line = $'; yield nil, nil }
175
- /./ { yield token($&, $&) }
176
- %}
177
-
178
- #begin-rule
179
- start:
180
- '[' option_list ']'
181
- {
182
- master.ins.push [g_parser.rhs.size, _option_list, false]
183
- }
184
- | '[' option_list '?' ']'
185
- {
186
- master.ins.push [g_parser.rhs.size, _option_list, true]
187
- }
188
-
189
- ;
190
- option_list:
191
- option { [_option] }
192
- | option_list option { _option_list << _option }
193
- ;
194
- option:
195
- '>' SYMBOL { [:GOTO, _SYMBOL.value] }
196
- | '+' SYMBOL { [:ADD, _SYMBOL.value] }
197
- | '-' SYMBOL { [:SUB, _SYMBOL.value] }
198
- ;
199
- #end-rule
200
- %%
1
+ %defext Depager::StatefulLexerExtension
2
+ %extend Depager::Depager::Lexer ('plugins/lex.rb')
3
+ %extend Depager::Depager::Action ('plugins/action.rb')
4
+ %decorate @Action
5
+ #%decorate Depager::LALR::ShiftReducePrinter ('plugins/srp.rb')
6
+ %expanded_code_delimiter DEPAGER_EXPANDED_CODE
7
+ %inner{
8
+ attr_accessor :ins, :code, :optval
9
+ def init_extension
10
+ @ins = []
11
+ @action_code = ''
12
+ @on_reduce = []
13
+ @addition = []
14
+ end
15
+
16
+ def term_extension
17
+ @action_code << %{
18
+ def after_error
19
+ warn "StatefulLex: lex_state==\#{@basis.lex_state}" if Depager.debug_mode?
20
+ end
21
+ }
22
+ g_parser.outer_code <<
23
+ generate_action_decorator_code(@on_reduce, @action_code)
24
+ end
25
+
26
+ def post_rhs
27
+ j = 0
28
+ rhs = g_parser.rhs
29
+ @ins.each do |i, option_list, debug|
30
+ state_name = "#{g_parser.lhs_name}_#{g_parser.nrhs}_#{i}"
31
+ m_name = "_lex_#{state_name}"
32
+ if i != rhs.size
33
+ nt_name = "__#{state_name}__"
34
+ isym = g_parser.add_nonterm(nt_name)
35
+ g_parser.insert_sym_to_rhs(i + j, isym, nt_name)
36
+ @addition << [ isym, m_name ]
37
+ j += 1
38
+ else
39
+ @on_reduce[g_parser.rules.size-1] = ':'+m_name
40
+ end
41
+
42
+ codes = option_list.map do |k, m|
43
+ case k
44
+ when :GOTO
45
+ "@basis.lex_state = #{m}" <<
46
+ (debug ? ";warn 'MODE:->#{m}'" : '')
47
+ when :ADD
48
+ "@basis.lex_context[#{m}] = true" <<
49
+ (debug ? ";warn 'CONTEXT:+#{m}/\#{@context.inspect}'" : '')
50
+ when :SUB
51
+ "@basis.lex_context.delete #{m}" <<
52
+ (debug ? ";warn 'CONTEXT:-#{m}'/\#{@context.inspect}" : '')
53
+ else
54
+ end
55
+ end
56
+ @action_code << %{
57
+ def #{m_name} val
58
+ #{codes.join("\n ")}
59
+ end
60
+ }
61
+ end
62
+ @ins.clear
63
+ end
64
+
65
+ def post_rhs_list
66
+ @addition.each do |isym, m_name|
67
+ g_parser.add_rule isym, []
68
+ @on_reduce[g_parser.rules.size-1] = ':'+m_name
69
+ end
70
+ @addition.clear
71
+ end
72
+ %}
73
+ ######################################################################
74
+ # Define Tokens
75
+ ######################################################################
76
+ %hook pre_rule_list /%LEX\{\s*\Z/ skip
77
+ %banner '%LEX{ ... }'
78
+ %%
79
+ %LEX{
80
+ /\s+/, /#.*\Z/ { }
81
+ /[A-Z]+/ { yield token(:ID, $&) }
82
+ /\%\}\s*\Z/ { yield nil,nil }
83
+ /\/(([^\/\\]+|\\.)*)\// { yield token(:LEX, "/\\A#{$1}/") }
84
+ /'([^'\\]+|\\.)*'/,
85
+ /"([^"\\]+|\\.)*"/
86
+ {
87
+ yield token(:LEX, "/\\A#{Regexp.escape($1).gsub('/', '\/')}/")
88
+ }
89
+ '{' !
90
+ {
91
+ lineno = file.lineno
92
+ yield token(:ACTION, parse_block, lineno)
93
+ }
94
+ /./ { yield token($&, $&) }
95
+ %}
96
+ #begin-rule
97
+ start:
98
+ mode_list
99
+ {
100
+ ll = ''
101
+ _mode_list.each do |m, s, l|
102
+ else_code = if s
103
+ "lex_#{s}(&block)"
104
+ else
105
+ 'raise RuntimeError, "must not happen #{@line}"'
106
+ end
107
+ ll << %{
108
+ def lex_#{m}(&block)
109
+ case @line
110
+ #{l}
111
+ else
112
+ #{else_code}
113
+ end
114
+ end
115
+ }; #code
116
+ end
117
+ g_parser.inner_code << ll << %{
118
+ attr_accessor :lex_state, :lex_context
119
+ def lex(&block)
120
+ @lex_state ||= :START
121
+ @lex_context ||= {}
122
+ begin
123
+ until @line.empty?
124
+ self.send "lex_\#{@lex_state}", &block
125
+ end
126
+ end while @original_line = @line = file.gets
127
+ yield nil, nil
128
+ end
129
+ }; #code
130
+ }
131
+ ;
132
+ mode_list:
133
+ { [ ] }
134
+ | mode_list mode lexactlist { _mode_list << [_mode[0], _mode[1], _lexactlist] }
135
+ ;
136
+ mode:
137
+ '<' ID opt_super '>' { [ _ID.value, _opt_super ] }
138
+ ;
139
+ opt_super:
140
+ { nil }
141
+ | ':' ID { _ID.value }
142
+ ;
143
+ lexactlist:
144
+ lexact { _lexact }
145
+ | lexactlist lexact { _lexactlist << _lexact }
146
+ ;
147
+ lexact:
148
+ lexlist opt_noskip ACTION
149
+ {
150
+ %{
151
+ when #{_lexlist.join(', ')}
152
+ #{ _opt_noskip ? '#' : "@line = $'" }
153
+ #{ _ACTION.value }
154
+ }; #code
155
+ }
156
+ ;
157
+ opt_noskip:
158
+ { false }
159
+ | '!' { true }
160
+ ;
161
+ lexlist:
162
+ LEX { [ _LEX.value ] }
163
+ | lexlist ',' LEX { _lexlist.push _LEX.value }
164
+ ;
165
+ #end-rule
166
+ %%
167
+ ######################################################################
168
+ # Change State
169
+ ######################################################################
170
+ %hook pre_rhs post_symbol /\[/
171
+ %banner '[> ...]'
172
+ %%
173
+ %LEX{
174
+ /\s+/ { }
175
+ /:[a-zA-Z_]+\??/ { yield token(:SYMBOL, $&) }
176
+ /\]/ { yield token($&, $&); @line = $'; yield nil, nil }
177
+ /./ { yield token($&, $&) }
178
+ %}
179
+
180
+ #begin-rule
181
+ start:
182
+ '[' option_list ']'
183
+ {
184
+ master.ins.push [g_parser.rhs.size, _option_list, false]
185
+ }
186
+ | '[' option_list '?' ']'
187
+ {
188
+ master.ins.push [g_parser.rhs.size, _option_list, true]
189
+ }
190
+
191
+ ;
192
+ option_list:
193
+ option { [_option] }
194
+ | option_list option { _option_list << _option }
195
+ ;
196
+ option:
197
+ '>' SYMBOL { [:GOTO, _SYMBOL.value] }
198
+ | '+' SYMBOL { [:ADD, _SYMBOL.value] }
199
+ | '-' SYMBOL { [:SUB, _SYMBOL.value] }
200
+ ;
201
+ #end-rule
202
+ %%
@@ -1,817 +1,780 @@
1
-
2
- ###
3
- ### StatefulLexerExtension - Depager Extension (master)
4
- ###
5
- require 'pp.rb'
6
- require 'depager/parser.rb'
7
-
8
-
9
- module D4StatefulLexerExtension #:nodoc:all
10
- end
11
-
12
- class StatefulLexerExtension #:nodoc:all
13
- include Depager::ExtensionUtils
14
-
15
- attr_accessor :h2p
16
-
17
- def initialize
18
- @master = self
19
- @hook = []
20
- @h2p = {}
21
- init_parser
22
- end
23
-
24
- def __regext__ p
25
- super p, :default, nil
26
-
27
- @hook[0] = StatefulLexerExtension_pre_rhs__post_symbol.new(p, @nparam, self)
28
- @h2p['pre_rhs__post_symbol'] = @hook[0]
29
- p.hooks[:post_symbol].push [@hook[0], :do_parse]
30
-
31
- @hook[1] = StatefulLexerExtension_pre_rule_list.new(p, @nparam, self)
32
- @h2p['pre_rule_list'] = @hook[1]
33
- p.hooks[:pre_rule_list].push [@hook[1], :do_parse]
34
-
35
- # use @hook[0](StatefulLexerExtension_pre_rhs__post_symbol)
36
- p.hooks[:pre_rhs].push [@hook[0], :do_parse]
37
-
38
- regext p
39
- end
40
-
41
- ### Inner Code
42
- attr_accessor :ins, :code, :optval
43
- def init_parser
44
- super
45
- @ins = []
46
- @optouter = []
47
- @on_reduce = []
48
- @addition = []
49
- end
50
- def post_rule_list
51
- @optouter << %{
52
- def afterError
53
- warn "StatefulLex: lex_state==\#{@basis.lex_state}" if $MP_DEBUG
54
- end
55
- }
56
- g_parser.optouter <<
57
- gen_action_decorator_code(target_name, paramkey,
58
- @on_reduce, @optouter)
59
- end
60
- def post_rhs
61
- j = 0
62
- rhs = g_parser.rhs
63
- @ins.each do |i, option_list, debug|
64
- state_name = "#{lhs_name}_#{nrhs}_#{i}"
65
- m_name = "_lex_#{state_name}"
66
- if i != rhs.size
67
- nt_name = "__#{state_name}__"
68
- isym = g_parser.add_nonterm(nt_name)
69
- g_parser.rhs_insert_sym(i+j, isym, nt_name)
70
- @addition << [ isym, m_name ]
71
- j += 1
72
- else
73
- @on_reduce[nrules] = ':'+m_name
74
- end
75
-
76
- codes = option_list.map do |k, m|
77
- case k
78
- when :GOTO
79
- "@basis.lex_state = #{m}" <<
80
- (debug ? ";warn 'MODE:->#{m}'" : '')
81
- when :ADD
82
- "@basis.lex_context[#{m}] = true" <<
83
- (debug ? ";warn 'CONTEXT:+#{m}/\#{@context.inspect}'" : '')
84
- when :SUB
85
- "@basis.lex_context.delete #{m}" <<
86
- (debug ? ";warn 'CONTEXT:-#{m}'/\#{@context.inspect}" : '')
87
- else
88
- end
89
- end
90
- @optouter.push << %{
91
- def #{m_name} val
92
- #{codes.join("\n ")}
93
- end
94
- }
95
- end
96
- @ins.clear
97
- end
98
- def post_rhs_list
99
- @addition.each do |isym, m_name|
100
- g_parser.add_rule isym, []
101
- @on_reduce[nrules] = ':'+m_name
102
- end
103
- @addition.clear
104
- end
105
-
106
- end
107
-
108
- ### Outer Code
109
-
110
- ###
111
- ### StatefulLexerExtension_pre_rule_list - Part of Depager Extension (slave)
112
- ###
113
- module D4StatefulLexerExtension_pre_rule_list #:nodoc:all
114
- end
115
-
116
- class StatefulLexerExtension_pre_rule_list < Depager::LALR::Basis #:nodoc:all
117
- include Depager::ExtensionUtils
118
-
119
-
120
- ### Reduce Table
121
- reduce_table = [
122
- [ -1, 1 ],
123
- [ 0, 1 ],
124
- [ 1, 0 ],
125
- [ 1, 3 ],
126
- [ 2, 4 ],
127
- [ 4, 0 ],
128
- [ 4, 2 ],
129
- [ 3, 1 ],
130
- [ 3, 2 ],
131
- [ 5, 3 ],
132
- [ 7, 0 ],
133
- [ 7, 1 ],
134
- [ 6, 1 ],
135
- [ 6, 3 ],
136
- ]
137
- ### Extension Params
138
- nparams = {
139
- 'NVAction' => 2,
140
- }
141
- ### Term to Int
142
- t2i = {
143
- nil => 0,
144
- false => 1,
145
- "<" => 2,
146
- :ID => 3,
147
- ">" => 4,
148
- ":" => 5,
149
- :ACTION => 6,
150
- "!" => 7,
151
- :LEX => 8,
152
- "," => 9,
153
- }
154
- ### Int to Term
155
- i2t = [
156
- nil,
157
- false,
158
- "<",
159
- :ID,
160
- ">",
161
- ":",
162
- :ACTION,
163
- "!",
164
- :LEX,
165
- ",",
166
- ]
167
- ### Action Table
168
- action_table = [
169
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
170
- [ ACC, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
171
- [ nil, nil, 3, nil, nil, nil, nil, nil, nil, nil, ],
172
- [ nil, nil, nil, 5, nil, nil, nil, nil, nil, nil, ],
173
- [ nil, nil, nil, nil, nil, nil, nil, nil, 6, nil, ],
174
- [ nil, nil, nil, nil, nil, 11, nil, nil, nil, nil, ],
175
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
176
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
177
- [ nil, nil, nil, nil, nil, nil, nil, 12, nil, 13, ],
178
- [ nil, nil, nil, nil, nil, nil, nil, nil, 6, nil, ],
179
- [ nil, nil, nil, nil, 16, nil, nil, nil, nil, nil, ],
180
- [ nil, nil, nil, 17, nil, nil, nil, nil, nil, nil, ],
181
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
182
- [ nil, nil, nil, nil, nil, nil, nil, nil, 18, nil, ],
183
- [ nil, nil, nil, nil, nil, nil, 19, nil, nil, nil, ],
184
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
185
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
186
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
187
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
188
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
189
- ]
190
- ### Default Reduce Table
191
- defred_table = [
192
- -2,
193
- nil,
194
- -1,
195
- nil,
196
- nil,
197
- -5,
198
- -12,
199
- -7,
200
- -10,
201
- -3,
202
- nil,
203
- nil,
204
- -11,
205
- nil,
206
- nil,
207
- -8,
208
- -4,
209
- -6,
210
- -13,
211
- -9,
212
- ]
213
- defred_after_shift_table = [
214
- -2,
215
- nil,
216
- nil,
217
- nil,
218
- nil,
219
- nil,
220
- -12,
221
- -7,
222
- nil,
223
- nil,
224
- nil,
225
- nil,
226
- -11,
227
- nil,
228
- nil,
229
- -8,
230
- -4,
231
- -6,
232
- -13,
233
- -9,
234
- ]
235
- ### Nonterm to Int
236
- nt2i = {
237
- :start => 0,
238
- :mode_list => 1,
239
- :mode => 2,
240
- :lexactlist => 3,
241
- :opt_super => 4,
242
- :lexact => 5,
243
- :lexlist => 6,
244
- :opt_noskip => 7,
245
- }
246
- ### Int to Nonterm
247
- i2nt = [
248
- :start,
249
- :mode_list,
250
- :mode,
251
- :lexactlist,
252
- :opt_super,
253
- :lexact,
254
- :lexlist,
255
- :opt_noskip,
256
- ]
257
- ### Goto Table
258
- goto_table = [
259
- [ 1, 2, nil, nil, nil, nil, nil, nil, ],
260
- [ nil, nil, nil, nil, nil, nil, nil, nil, ],
261
- [ nil, nil, 4, nil, nil, nil, nil, nil, ],
262
- [ nil, nil, nil, nil, nil, nil, nil, nil, ],
263
- [ nil, nil, nil, 9, nil, 7, 8, nil, ],
264
- [ nil, nil, nil, nil, 10, nil, nil, nil, ],
265
- [ nil, nil, nil, nil, nil, nil, nil, nil, ],
266
- [ nil, nil, nil, nil, nil, nil, nil, nil, ],
267
- [ nil, nil, nil, nil, nil, nil, nil, 14, ],
268
- [ nil, nil, nil, nil, nil, 15, 8, nil, ],
269
- [ nil, nil, nil, nil, nil, nil, nil, nil, ],
270
- [ nil, nil, nil, nil, nil, nil, nil, nil, ],
271
- [ nil, nil, nil, nil, nil, nil, nil, nil, ],
272
- [ nil, nil, nil, nil, nil, nil, nil, nil, ],
273
- [ nil, nil, nil, nil, nil, nil, nil, nil, ],
274
- [ nil, nil, nil, nil, nil, nil, nil, nil, ],
275
- [ nil, nil, nil, nil, nil, nil, nil, nil, ],
276
- [ nil, nil, nil, nil, nil, nil, nil, nil, ],
277
- [ nil, nil, nil, nil, nil, nil, nil, nil, ],
278
- [ nil, nil, nil, nil, nil, nil, nil, nil, ],
279
- ]
280
-
281
- Tables = [ reduce_table, nparams, action_table,
282
- defred_table, defred_after_shift_table, goto_table,
283
- t2i, i2t, nt2i, i2nt ]
284
-
285
- attr_accessor :p, :m
286
- def initialize p, nparam, master = nil
287
- super()
288
- @g_parser = @p = p
289
- @master = @m = master
290
- @nparam = nparam
291
- @dect = D4StatefulLexerExtension_pre_rule_list::NVAction.new(self)
292
- init_parser
293
- end
294
-
295
-
296
- def do_parse?
297
- if @line =~ /^\s*%LEX\{\s*\Z/
298
- @line = $'
299
- true
300
- else
301
- false
302
- end
303
- end
304
-
305
-
306
- def banner
307
- "%LEX{ ... } / #{@master.class.name}"
308
- end
309
-
310
- ### Inner Code
311
-
312
- def lex
313
- begin
314
- until @line.empty?
315
- case @line
316
-
317
- when /\A\s+/, /\A#.*\Z/
318
- @oldline = @line; @line = $'
319
-
320
-
321
-
322
- when /\A[A-Z]+/
323
- @oldline = @line; @line = $'
324
- yield token(:ID, $&)
325
-
326
-
327
- when /\A\%\}\s*\Z/
328
- @oldline = @line; @line = $'
329
- yield nil,nil
330
-
331
-
332
- when /\A\/(([^\/\\]+|\\.)*)\//
333
- @oldline = @line; @line = $'
334
- yield token(:LEX, "/\\A#{$1}/")
335
-
336
-
337
- when /\A'([^'\\]+|\\.)*'/, /\A"([^"\\]+|\\.)*"/
338
- @oldline = @line; @line = $'
339
-
340
- yield token(:LEX, "/\\A#{Regexp.escape($1).gsub('/', '\/')}/")
341
-
342
-
343
- when /\A\{/
344
- #
345
-
346
- _lineno = lineno
347
- yield token(:ACTION, parse_action, _lineno)
348
-
349
-
350
- when /\A./
351
- @oldline = @line; @line = $'
352
- yield token($&, $&)
353
-
354
-
355
- else
356
- raise RuntimeError, "must not happen #{@line}"
357
- end
358
- end
359
- end while @line0 = @line = getline
360
- yield nil, nil
361
- end
362
-
363
- end
364
-
365
- ### Outer Code
366
-
367
- class D4StatefulLexerExtension_pre_rule_list::NVAction < Depager::LALR::Action #:nodoc:all
368
- include Depager::DecoratorUtils
369
-
370
- on_reduce = [
371
- nil,
372
- :_act_0,
373
- :_act_1,
374
- :_act_2,
375
- :_act_3,
376
- :_act_4,
377
- :_act_5,
378
- :_act_6,
379
- :_act_7,
380
- :_act_8,
381
- :_act_9,
382
- :_act_10,
383
- :_act_11,
384
- :_act_12,
385
-
386
- ]
387
- Tables = [on_reduce]
388
- def initialize inside
389
- super inside, 'NVAction'
390
- @on_reduce, = self.class::Tables
391
- init_parser
392
- end
393
-
394
-
395
- module_eval <<-'.,.,1227458033159.,.,', 'slex.dr', 95
396
- def _act_0 val
397
- _mode_list, = *val
398
-
399
- ll = ''
400
- _mode_list.each do |m, s, l|
401
- else_code = if s
402
- "lex_#{s}(&block)"
403
- else
404
- 'raise RuntimeError, "must not happen #{@line}"'
405
- end
406
- ll << %{
407
- def lex_#{m}(&block)
408
- case @line
409
- #{l}
410
- else
411
- #{else_code}
412
- end
413
- end
414
- }; #code
415
- end
416
- g_parser.optinner << ll << %{
417
- attr_accessor :lex_state, :lex_context
418
- def lex(&block)
419
- @lex_state ||= :START
420
- @lex_context ||= {}
421
- begin
422
- until @line.empty?
423
- self.send "lex_\#{@lex_state}", &block
424
- end
425
- end while @line0 = @line = getline
426
- yield nil, nil
427
- end
428
- }; #code
429
-
430
- end
431
- .,.,1227458033159.,.,
432
-
433
- module_eval <<-'.,.,122745803342120.,.,', 'slex.dr', 129
434
- def _act_1 val
435
- [ ]
436
-
437
- end
438
- .,.,122745803342120.,.,
439
-
440
- module_eval <<-'.,.,12274580336600.,.,', 'slex.dr', 130
441
- def _act_2 val
442
- _mode_list, _mode, _lexactlist, = *val
443
- _mode_list << [_mode[0], _mode[1], _lexactlist]
444
-
445
- end
446
- .,.,12274580336600.,.,
447
-
448
- module_eval <<-'.,.,122745803347797.,.,', 'slex.dr', 133
449
- def _act_3 val
450
- _, _ID, _opt_super, _, = *val
451
- [ _ID.value, _opt_super ]
452
-
453
- end
454
- .,.,122745803347797.,.,
455
-
456
- module_eval <<-'.,.,122745803312942.,.,', 'slex.dr', 136
457
- def _act_4 val
458
- nil
459
-
460
- end
461
- .,.,122745803312942.,.,
462
-
463
- module_eval <<-'.,.,122745803315084.,.,', 'slex.dr', 137
464
- def _act_5 val
465
- _, _ID, = *val
466
- _ID.value
467
-
468
- end
469
- .,.,122745803315084.,.,
470
-
471
- module_eval <<-'.,.,12274580334440.,.,', 'slex.dr', 140
472
- def _act_6 val
473
- _lexact, = *val
474
- _lexact
475
-
476
- end
477
- .,.,12274580334440.,.,
478
-
479
- module_eval <<-'.,.,122745803358254.,.,', 'slex.dr', 141
480
- def _act_7 val
481
- _lexactlist, _lexact, = *val
482
- _lexactlist << _lexact
483
-
484
- end
485
- .,.,122745803358254.,.,
486
-
487
- module_eval <<-'.,.,122745803337351.,.,', 'slex.dr', 145
488
- def _act_8 val
489
- _lexlist, _opt_noskip, _ACTION, = *val
490
-
491
- %{
492
- when #{_lexlist.join(', ')}
493
- #{ _opt_noskip ? '#' : "@oldline = @line; @line = $'" }
494
- #{ _ACTION.value }
495
- }; #code
496
-
497
- end
498
- .,.,122745803337351.,.,
499
-
500
- module_eval <<-'.,.,122745803316408.,.,', 'slex.dr', 154
501
- def _act_9 val
502
- false
503
-
504
- end
505
- .,.,122745803316408.,.,
506
-
507
- module_eval <<-'.,.,122745803341193.,.,', 'slex.dr', 155
508
- def _act_10 val
509
- _, = *val
510
- true
511
-
512
- end
513
- .,.,122745803341193.,.,
514
-
515
- module_eval <<-'.,.,12274580332500.,.,', 'slex.dr', 158
516
- def _act_11 val
517
- _LEX, = *val
518
- [ _LEX.value ]
519
-
520
- end
521
- .,.,12274580332500.,.,
522
-
523
- module_eval <<-'.,.,122745803323427.,.,', 'slex.dr', 159
524
- def _act_12 val
525
- _lexlist, _, _LEX, = *val
526
- _lexlist.push _LEX.value
527
-
528
- end
529
- .,.,122745803323427.,.,
530
-
531
- end
532
-
533
-
534
- ###
535
- ### StatefulLexerExtension_pre_rhs__post_symbol - Part of Depager Extension (slave)
536
- ###
537
- module D4StatefulLexerExtension_pre_rhs__post_symbol #:nodoc:all
538
- end
539
-
540
- class StatefulLexerExtension_pre_rhs__post_symbol < Depager::LALR::Basis #:nodoc:all
541
- include Depager::ExtensionUtils
542
-
543
-
544
- ### Reduce Table
545
- reduce_table = [
546
- [ -1, 1 ],
547
- [ 0, 3 ],
548
- [ 0, 4 ],
549
- [ 1, 1 ],
550
- [ 1, 2 ],
551
- [ 2, 2 ],
552
- [ 2, 2 ],
553
- [ 2, 2 ],
554
- ]
555
- ### Extension Params
556
- nparams = {
557
- 'NVAction' => 2,
558
- }
559
- ### Term to Int
560
- t2i = {
561
- nil => 0,
562
- false => 1,
563
- "[" => 2,
564
- "]" => 3,
565
- "?" => 4,
566
- ">" => 5,
567
- :SYMBOL => 6,
568
- "+" => 7,
569
- "-" => 8,
570
- }
571
- ### Int to Term
572
- i2t = [
573
- nil,
574
- false,
575
- "[",
576
- "]",
577
- "?",
578
- ">",
579
- :SYMBOL,
580
- "+",
581
- "-",
582
- ]
583
- ### Action Table
584
- action_table = [
585
- [ nil, nil, 1, nil, nil, nil, nil, nil, nil, ],
586
- [ nil, nil, nil, nil, nil, 7, nil, 3, 4, ],
587
- [ ACC, nil, nil, nil, nil, nil, nil, nil, nil, ],
588
- [ nil, nil, nil, nil, nil, nil, 8, nil, nil, ],
589
- [ nil, nil, nil, nil, nil, nil, 9, nil, nil, ],
590
- [ nil, nil, nil, 10, 11, 7, nil, 3, 4, ],
591
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
592
- [ nil, nil, nil, nil, nil, nil, 13, nil, nil, ],
593
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
594
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
595
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
596
- [ nil, nil, nil, 14, nil, nil, nil, nil, nil, ],
597
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
598
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
599
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
600
- ]
601
- ### Default Reduce Table
602
- defred_table = [
603
- nil,
604
- nil,
605
- nil,
606
- nil,
607
- nil,
608
- nil,
609
- -3,
610
- nil,
611
- -6,
612
- -7,
613
- -1,
614
- nil,
615
- -4,
616
- -5,
617
- -2,
618
- ]
619
- defred_after_shift_table = [
620
- nil,
621
- nil,
622
- nil,
623
- nil,
624
- nil,
625
- nil,
626
- -3,
627
- nil,
628
- -6,
629
- -7,
630
- -1,
631
- nil,
632
- -4,
633
- -5,
634
- -2,
635
- ]
636
- ### Nonterm to Int
637
- nt2i = {
638
- :start => 0,
639
- :option_list => 1,
640
- :option => 2,
641
- }
642
- ### Int to Nonterm
643
- i2nt = [
644
- :start,
645
- :option_list,
646
- :option,
647
- ]
648
- ### Goto Table
649
- goto_table = [
650
- [ 2, nil, nil, ],
651
- [ nil, 5, 6, ],
652
- [ nil, nil, nil, ],
653
- [ nil, nil, nil, ],
654
- [ nil, nil, nil, ],
655
- [ nil, nil, 12, ],
656
- [ nil, nil, nil, ],
657
- [ nil, nil, nil, ],
658
- [ nil, nil, nil, ],
659
- [ nil, nil, nil, ],
660
- [ nil, nil, nil, ],
661
- [ nil, nil, nil, ],
662
- [ nil, nil, nil, ],
663
- [ nil, nil, nil, ],
664
- [ nil, nil, nil, ],
665
- ]
666
-
667
- Tables = [ reduce_table, nparams, action_table,
668
- defred_table, defred_after_shift_table, goto_table,
669
- t2i, i2t, nt2i, i2nt ]
670
-
671
- attr_accessor :p, :m
672
- def initialize p, nparam, master = nil
673
- super()
674
- @g_parser = @p = p
675
- @master = @m = master
676
- @nparam = nparam
677
- @dect = D4StatefulLexerExtension_pre_rhs__post_symbol::NVAction.new(self)
678
- init_parser
679
- end
680
-
681
-
682
- def do_parse?
683
- if @line =~ /^\s*\[/
684
-
685
- true
686
- else
687
- false
688
- end
689
- end
690
-
691
-
692
- def banner
693
- "[> ...] / #{@master.class.name}"
694
- end
695
-
696
- ### Inner Code
697
-
698
- def lex
699
- begin
700
- until @line.empty?
701
- case @line
702
-
703
- when /\A\s+/
704
- @oldline = @line; @line = $'
705
-
706
-
707
-
708
- when /\A:[a-zA-Z_]+\??/
709
- @oldline = @line; @line = $'
710
- yield token(:SYMBOL, $&)
711
-
712
-
713
- when /\A\]/
714
- @oldline = @line; @line = $'
715
- yield token($&, $&); @line = $'; yield nil, nil
716
-
717
-
718
- when /\A./
719
- @oldline = @line; @line = $'
720
- yield token($&, $&)
721
-
722
-
723
- else
724
- raise RuntimeError, "must not happen #{@line}"
725
- end
726
- end
727
- end while @line0 = @line = getline
728
- yield nil, nil
729
- end
730
-
731
- end
732
-
733
- ### Outer Code
734
-
735
- class D4StatefulLexerExtension_pre_rhs__post_symbol::NVAction < Depager::LALR::Action #:nodoc:all
736
- include Depager::DecoratorUtils
737
-
738
- on_reduce = [
739
- nil,
740
- :_act_0,
741
- :_act_1,
742
- :_act_2,
743
- :_act_3,
744
- :_act_4,
745
- :_act_5,
746
- :_act_6,
747
-
748
- ]
749
- Tables = [on_reduce]
750
- def initialize inside
751
- super inside, 'NVAction'
752
- @on_reduce, = self.class::Tables
753
- init_parser
754
- end
755
-
756
-
757
- module_eval <<-'.,.,122745803310395.,.,', 'slex.dr', 179
758
- def _act_0 val
759
- _, _option_list, _, = *val
760
-
761
- master.ins.push [g_parser.rhs.size, _option_list, false]
762
-
763
- end
764
- .,.,122745803310395.,.,
765
-
766
- module_eval <<-'.,.,122745803327506.,.,', 'slex.dr', 183
767
- def _act_1 val
768
- _, _option_list, _, _, = *val
769
-
770
- master.ins.push [g_parser.rhs.size, _option_list, true]
771
-
772
- end
773
- .,.,122745803327506.,.,
774
-
775
- module_eval <<-'.,.,122745803335394.,.,', 'slex.dr', 189
776
- def _act_2 val
777
- _option, = *val
778
- [_option]
779
-
780
- end
781
- .,.,122745803335394.,.,
782
-
783
- module_eval <<-'.,.,122745803345722.,.,', 'slex.dr', 190
784
- def _act_3 val
785
- _option_list, _option, = *val
786
- _option_list << _option
787
-
788
- end
789
- .,.,122745803345722.,.,
790
-
791
- module_eval <<-'.,.,122745803311899.,.,', 'slex.dr', 193
792
- def _act_4 val
793
- _, _SYMBOL, = *val
794
- [:GOTO, _SYMBOL.value]
795
-
796
- end
797
- .,.,122745803311899.,.,
798
-
799
- module_eval <<-'.,.,122745803346690.,.,', 'slex.dr', 194
800
- def _act_5 val
801
- _, _SYMBOL, = *val
802
- [:ADD, _SYMBOL.value]
803
-
804
- end
805
- .,.,122745803346690.,.,
806
-
807
- module_eval <<-'.,.,122745803330412.,.,', 'slex.dr', 195
808
- def _act_6 val
809
- _, _SYMBOL, = *val
810
- [:SUB, _SYMBOL.value]
811
-
812
- end
813
- .,.,122745803330412.,.,
814
-
815
- end
816
-
817
-
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ###
4
+ ### Depager::StatefulLexerExtension - Depager Extension (master)
5
+ ###
6
+ require 'depager/parser.rb'
7
+
8
+
9
+ module Depager ; end
10
+
11
+ class Depager::StatefulLexerExtension < Depager::Extension
12
+
13
+ def initialize
14
+ @master = self
15
+ @slaves = []
16
+ end
17
+
18
+ def extension_registered g_parser
19
+ super g_parser
20
+
21
+ @slaves[0] = Depager::StatefulLexerExtension::Slave_pre_rule_list::Parser.new(g_parser, self)
22
+ g_parser.hooks[:pre_rule_list].push [@slaves[0], :do_parse]
23
+ @slaves[1] = Depager::StatefulLexerExtension::Slave_pre_rhs__post_symbol::Parser.new(g_parser, self)
24
+ g_parser.hooks[:pre_rhs].push [@slaves[1], :do_parse]
25
+ # use @slaves[1](Depager::StatefulLexerExtension::Slave_pre_rhs__post_symbol::Parser)
26
+ g_parser.hooks[:post_symbol].push [@slaves[1], :do_parse]
27
+ end
28
+
29
+ module_eval <<'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 8
30
+ attr_accessor :ins, :code, :optval
31
+ def init_extension
32
+ @ins = []
33
+ @action_code = ''
34
+ @on_reduce = []
35
+ @addition = []
36
+ end
37
+
38
+ def term_extension
39
+ @action_code << %{
40
+ def after_error
41
+ warn "StatefulLex: lex_state==\#{@basis.lex_state}" if Depager.debug_mode?
42
+ end
43
+ }
44
+ g_parser.outer_code <<
45
+ generate_action_decorator_code(@on_reduce, @action_code)
46
+ end
47
+
48
+ def post_rhs
49
+ j = 0
50
+ rhs = g_parser.rhs
51
+ @ins.each do |i, option_list, debug|
52
+ state_name = "#{g_parser.lhs_name}_#{g_parser.nrhs}_#{i}"
53
+ m_name = "_lex_#{state_name}"
54
+ if i != rhs.size
55
+ nt_name = "__#{state_name}__"
56
+ isym = g_parser.add_nonterm(nt_name)
57
+ g_parser.insert_sym_to_rhs(i + j, isym, nt_name)
58
+ @addition << [ isym, m_name ]
59
+ j += 1
60
+ else
61
+ @on_reduce[g_parser.rules.size-1] = ':'+m_name
62
+ end
63
+
64
+ codes = option_list.map do |k, m|
65
+ case k
66
+ when :GOTO
67
+ "@basis.lex_state = #{m}" <<
68
+ (debug ? ";warn 'MODE:->#{m}'" : '')
69
+ when :ADD
70
+ "@basis.lex_context[#{m}] = true" <<
71
+ (debug ? ";warn 'CONTEXT:+#{m}/\#{@context.inspect}'" : '')
72
+ when :SUB
73
+ "@basis.lex_context.delete #{m}" <<
74
+ (debug ? ";warn 'CONTEXT:-#{m}'/\#{@context.inspect}" : '')
75
+ else
76
+ end
77
+ end
78
+ @action_code << %{
79
+ def #{m_name} val
80
+ #{codes.join("\n ")}
81
+ end
82
+ }
83
+ end
84
+ @ins.clear
85
+ end
86
+
87
+ def post_rhs_list
88
+ @addition.each do |isym, m_name|
89
+ g_parser.add_rule isym, []
90
+ @on_reduce[g_parser.rules.size-1] = ':'+m_name
91
+ end
92
+ @addition.clear
93
+ end
94
+
95
+ DEPAGER_EXPANDED_CODE
96
+
97
+ end
98
+
99
+ ###
100
+ ### Depager::StatefulLexerExtension::Slave_pre_rule_list - Part of Depager Extension (slave)
101
+ ###
102
+
103
+ module Depager::StatefulLexerExtension::Slave_pre_rule_list #:nodoc:all
104
+ class Parser < Depager::LALR::Basis #:nodoc:all
105
+ include Depager::Utils::ExtensionSlaveMethods
106
+
107
+
108
+ ### Reduce Table
109
+ reduce_table = [
110
+ [ -1, 1 ],
111
+ [ 0, 1 ],
112
+ [ 1, 0 ],
113
+ [ 1, 3 ],
114
+ [ 2, 4 ],
115
+ [ 4, 0 ],
116
+ [ 4, 2 ],
117
+ [ 3, 1 ],
118
+ [ 3, 2 ],
119
+ [ 5, 3 ],
120
+ [ 7, 0 ],
121
+ [ 7, 1 ],
122
+ [ 6, 1 ],
123
+ [ 6, 3 ],
124
+ ]
125
+ ### Term to Int
126
+ term_to_int = {
127
+ nil => 0,
128
+ false => 1,
129
+ "<" => 2,
130
+ :ID => 3,
131
+ ">" => 4,
132
+ ":" => 5,
133
+ :ACTION => 6,
134
+ "!" => 7,
135
+ :LEX => 8,
136
+ "," => 9,
137
+ }
138
+ ### Int to Term
139
+ int_to_term = [
140
+ nil,
141
+ false,
142
+ "<",
143
+ :ID,
144
+ ">",
145
+ ":",
146
+ :ACTION,
147
+ "!",
148
+ :LEX,
149
+ ",",
150
+ ]
151
+ ### Action Table
152
+ action_table = [
153
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
154
+ [ ACC, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
155
+ [ nil, nil, 4, nil, nil, nil, nil, nil, nil, nil, ],
156
+ [ nil, nil, nil, nil, nil, nil, nil, nil, 8, nil, ],
157
+ [ nil, nil, nil, 9, nil, nil, nil, nil, nil, nil, ],
158
+ [ nil, nil, nil, nil, nil, nil, nil, nil, 8, nil, ],
159
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
160
+ [ nil, nil, nil, nil, nil, nil, nil, 12, nil, 13, ],
161
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
162
+ [ nil, nil, nil, nil, nil, 15, nil, nil, nil, nil, ],
163
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
164
+ [ nil, nil, nil, nil, nil, nil, 16, nil, nil, nil, ],
165
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
166
+ [ nil, nil, nil, nil, nil, nil, nil, nil, 17, nil, ],
167
+ [ nil, nil, nil, nil, 18, nil, nil, nil, nil, nil, ],
168
+ [ nil, nil, nil, 19, nil, nil, nil, nil, nil, nil, ],
169
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
170
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
171
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
172
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
173
+ ]
174
+ ### Default Reduce Table
175
+ defred_table = [
176
+ -2,
177
+ nil,
178
+ -1,
179
+ nil,
180
+ nil,
181
+ -3,
182
+ -7,
183
+ -10,
184
+ -12,
185
+ -5,
186
+ -8,
187
+ nil,
188
+ -11,
189
+ nil,
190
+ nil,
191
+ nil,
192
+ -9,
193
+ -13,
194
+ -4,
195
+ -6,
196
+ ]
197
+ defred_after_shift_table = [
198
+ -2,
199
+ nil,
200
+ nil,
201
+ nil,
202
+ nil,
203
+ nil,
204
+ -7,
205
+ nil,
206
+ -12,
207
+ nil,
208
+ -8,
209
+ nil,
210
+ -11,
211
+ nil,
212
+ nil,
213
+ nil,
214
+ -9,
215
+ -13,
216
+ -4,
217
+ -6,
218
+ ]
219
+ ### Nonterm to Int
220
+ nonterm_to_int = {
221
+ :start => 0,
222
+ :mode_list => 1,
223
+ :mode => 2,
224
+ :lexactlist => 3,
225
+ :opt_super => 4,
226
+ :lexact => 5,
227
+ :lexlist => 6,
228
+ :opt_noskip => 7,
229
+ }
230
+ ### Int to Nonterm
231
+ int_to_nonterm = [
232
+ :start,
233
+ :mode_list,
234
+ :mode,
235
+ :lexactlist,
236
+ :opt_super,
237
+ :lexact,
238
+ :lexlist,
239
+ :opt_noskip,
240
+ ]
241
+ ### Goto Table
242
+ goto_table = [
243
+ [ 1, 2, nil, nil, nil, nil, nil, nil, ],
244
+ [ nil, nil, nil, nil, nil, nil, nil, nil, ],
245
+ [ nil, nil, 3, nil, nil, nil, nil, nil, ],
246
+ [ nil, nil, nil, 5, nil, 6, 7, nil, ],
247
+ [ nil, nil, nil, nil, nil, nil, nil, nil, ],
248
+ [ nil, nil, nil, nil, nil, 10, 7, nil, ],
249
+ [ nil, nil, nil, nil, nil, nil, nil, nil, ],
250
+ [ nil, nil, nil, nil, nil, nil, nil, 11, ],
251
+ [ nil, nil, nil, nil, nil, nil, nil, nil, ],
252
+ [ nil, nil, nil, nil, 14, nil, nil, nil, ],
253
+ [ nil, nil, nil, nil, nil, nil, nil, nil, ],
254
+ [ nil, nil, nil, nil, nil, nil, nil, nil, ],
255
+ [ nil, nil, nil, nil, nil, nil, nil, nil, ],
256
+ [ nil, nil, nil, nil, nil, nil, nil, nil, ],
257
+ [ nil, nil, nil, nil, nil, nil, nil, nil, ],
258
+ [ nil, nil, nil, nil, nil, nil, nil, nil, ],
259
+ [ nil, nil, nil, nil, nil, nil, nil, nil, ],
260
+ [ nil, nil, nil, nil, nil, nil, nil, nil, ],
261
+ [ nil, nil, nil, nil, nil, nil, nil, nil, ],
262
+ [ nil, nil, nil, nil, nil, nil, nil, nil, ],
263
+ ]
264
+
265
+ Tables = [ reduce_table, action_table,
266
+ defred_table, defred_after_shift_table, goto_table,
267
+ term_to_int, int_to_term, nonterm_to_int, int_to_nonterm ]
268
+
269
+ def initialize g_parser, master
270
+ super()
271
+ @g_parser = g_parser
272
+ @d_parser = g_parser.d_parser
273
+ @master = master
274
+ @decorated = Action.new(self)
275
+ end
276
+
277
+
278
+ def do_parse?
279
+ if @line.match(/^\s*%LEX\{\s*\Z/)
280
+ @line = $'
281
+ true
282
+ else
283
+ false
284
+ end
285
+ end
286
+
287
+
288
+ def banner
289
+ "%LEX{ ... } / Depager::StatefulLexerExtension"
290
+ end
291
+
292
+
293
+ def lex
294
+ begin
295
+ until @line.empty?
296
+ case @line
297
+
298
+ when /\A\s+/, /\A#.*\Z/
299
+ @line = $'
300
+
301
+
302
+
303
+ when /\A[A-Z]+/
304
+ @line = $'
305
+ yield token(:ID, $&)
306
+
307
+
308
+ when /\A\%\}\s*\Z/
309
+ @line = $'
310
+ yield nil,nil
311
+
312
+
313
+ when /\A\/(([^\/\\]+|\\.)*)\//
314
+ @line = $'
315
+ yield token(:LEX, "/\\A#{$1}/")
316
+
317
+
318
+ when /\A'([^'\\]+|\\.)*'/, /\A"([^"\\]+|\\.)*"/
319
+ @line = $'
320
+
321
+ yield token(:LEX, "/\\A#{Regexp.escape($1).gsub('/', '\/')}/")
322
+
323
+
324
+ when /\A\{/
325
+ #
326
+
327
+ lineno = file.lineno
328
+ yield token(:ACTION, parse_block, lineno)
329
+
330
+
331
+ when /\A./
332
+ @line = $'
333
+ yield token($&, $&)
334
+
335
+
336
+ else
337
+ raise RuntimeError, "must not happen #{@line}"
338
+ end
339
+ end
340
+ end while @original_line = @line = file.gets
341
+ yield nil, nil
342
+ end
343
+
344
+ end
345
+ end
346
+
347
+
348
+ class Depager::StatefulLexerExtension::Slave_pre_rule_list::Action < Depager::LALR::Action #:nodoc:all
349
+ include Depager::Utils::ExtensionSlaveDecoratorMethods
350
+
351
+ on_reduce = [
352
+ nil,
353
+ :_act_1,
354
+ :_act_2,
355
+ :_act_3,
356
+ :_act_4,
357
+ :_act_5,
358
+ :_act_6,
359
+ :_act_7,
360
+ :_act_8,
361
+ :_act_9,
362
+ :_act_10,
363
+ :_act_11,
364
+ :_act_12,
365
+ :_act_13,
366
+
367
+ ]
368
+ Tables = [ on_reduce ]
369
+
370
+
371
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 97
372
+ def _act_1 val
373
+ _mode_list, = *val
374
+
375
+ ll = ''
376
+ _mode_list.each do |m, s, l|
377
+ else_code = if s
378
+ "lex_#{s}(&block)"
379
+ else
380
+ 'raise RuntimeError, "must not happen #{@line}"'
381
+ end
382
+ ll << %{
383
+ def lex_#{m}(&block)
384
+ case @line
385
+ #{l}
386
+ else
387
+ #{else_code}
388
+ end
389
+ end
390
+ }; #code
391
+ end
392
+ g_parser.inner_code << ll << %{
393
+ attr_accessor :lex_state, :lex_context
394
+ def lex(&block)
395
+ @lex_state ||= :START
396
+ @lex_context ||= {}
397
+ begin
398
+ until @line.empty?
399
+ self.send "lex_\#{@lex_state}", &block
400
+ end
401
+ end while @original_line = @line = file.gets
402
+ yield nil, nil
403
+ end
404
+ }; #code
405
+
406
+ end
407
+ DEPAGER_EXPANDED_CODE
408
+
409
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 131
410
+ def _act_2 val
411
+ [ ]
412
+
413
+ end
414
+ DEPAGER_EXPANDED_CODE
415
+
416
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 132
417
+ def _act_3 val
418
+ _mode_list, _mode, _lexactlist, = *val
419
+ _mode_list << [_mode[0], _mode[1], _lexactlist]
420
+
421
+ end
422
+ DEPAGER_EXPANDED_CODE
423
+
424
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 135
425
+ def _act_4 val
426
+ _, _ID, _opt_super, _, = *val
427
+ [ _ID.value, _opt_super ]
428
+
429
+ end
430
+ DEPAGER_EXPANDED_CODE
431
+
432
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 138
433
+ def _act_5 val
434
+ nil
435
+
436
+ end
437
+ DEPAGER_EXPANDED_CODE
438
+
439
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 139
440
+ def _act_6 val
441
+ _, _ID, = *val
442
+ _ID.value
443
+
444
+ end
445
+ DEPAGER_EXPANDED_CODE
446
+
447
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 142
448
+ def _act_7 val
449
+ _lexact, = *val
450
+ _lexact
451
+
452
+ end
453
+ DEPAGER_EXPANDED_CODE
454
+
455
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 143
456
+ def _act_8 val
457
+ _lexactlist, _lexact, = *val
458
+ _lexactlist << _lexact
459
+
460
+ end
461
+ DEPAGER_EXPANDED_CODE
462
+
463
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 147
464
+ def _act_9 val
465
+ _lexlist, _opt_noskip, _ACTION, = *val
466
+
467
+ %{
468
+ when #{_lexlist.join(', ')}
469
+ #{ _opt_noskip ? '#' : "@line = $'" }
470
+ #{ _ACTION.value }
471
+ }; #code
472
+
473
+ end
474
+ DEPAGER_EXPANDED_CODE
475
+
476
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 156
477
+ def _act_10 val
478
+ false
479
+
480
+ end
481
+ DEPAGER_EXPANDED_CODE
482
+
483
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 157
484
+ def _act_11 val
485
+ _, = *val
486
+ true
487
+
488
+ end
489
+ DEPAGER_EXPANDED_CODE
490
+
491
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 160
492
+ def _act_12 val
493
+ _LEX, = *val
494
+ [ _LEX.value ]
495
+
496
+ end
497
+ DEPAGER_EXPANDED_CODE
498
+
499
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 161
500
+ def _act_13 val
501
+ _lexlist, _, _LEX, = *val
502
+ _lexlist.push _LEX.value
503
+
504
+ end
505
+ DEPAGER_EXPANDED_CODE
506
+
507
+
508
+ end
509
+
510
+ ###
511
+ ### Depager::StatefulLexerExtension::Slave_pre_rhs__post_symbol - Part of Depager Extension (slave)
512
+ ###
513
+
514
+ module Depager::StatefulLexerExtension::Slave_pre_rhs__post_symbol #:nodoc:all
515
+ class Parser < Depager::LALR::Basis #:nodoc:all
516
+ include Depager::Utils::ExtensionSlaveMethods
517
+
518
+
519
+ ### Reduce Table
520
+ reduce_table = [
521
+ [ -1, 1 ],
522
+ [ 0, 3 ],
523
+ [ 0, 4 ],
524
+ [ 1, 1 ],
525
+ [ 1, 2 ],
526
+ [ 2, 2 ],
527
+ [ 2, 2 ],
528
+ [ 2, 2 ],
529
+ ]
530
+ ### Term to Int
531
+ term_to_int = {
532
+ nil => 0,
533
+ false => 1,
534
+ "[" => 2,
535
+ "]" => 3,
536
+ "?" => 4,
537
+ ">" => 5,
538
+ :SYMBOL => 6,
539
+ "+" => 7,
540
+ "-" => 8,
541
+ }
542
+ ### Int to Term
543
+ int_to_term = [
544
+ nil,
545
+ false,
546
+ "[",
547
+ "]",
548
+ "?",
549
+ ">",
550
+ :SYMBOL,
551
+ "+",
552
+ "-",
553
+ ]
554
+ ### Action Table
555
+ action_table = [
556
+ [ nil, nil, 2, nil, nil, nil, nil, nil, nil, ],
557
+ [ ACC, nil, nil, nil, nil, nil, nil, nil, nil, ],
558
+ [ nil, nil, nil, nil, nil, 5, nil, 6, 7, ],
559
+ [ nil, nil, nil, 8, 10, 5, nil, 6, 7, ],
560
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
561
+ [ nil, nil, nil, nil, nil, nil, 11, nil, nil, ],
562
+ [ nil, nil, nil, nil, nil, nil, 12, nil, nil, ],
563
+ [ nil, nil, nil, nil, nil, nil, 13, nil, nil, ],
564
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
565
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
566
+ [ nil, nil, nil, 14, nil, nil, nil, nil, nil, ],
567
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
568
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
569
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
570
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
571
+ ]
572
+ ### Default Reduce Table
573
+ defred_table = [
574
+ nil,
575
+ nil,
576
+ nil,
577
+ nil,
578
+ -3,
579
+ nil,
580
+ nil,
581
+ nil,
582
+ -1,
583
+ -4,
584
+ nil,
585
+ -5,
586
+ -6,
587
+ -7,
588
+ -2,
589
+ ]
590
+ defred_after_shift_table = [
591
+ nil,
592
+ nil,
593
+ nil,
594
+ nil,
595
+ -3,
596
+ nil,
597
+ nil,
598
+ nil,
599
+ -1,
600
+ -4,
601
+ nil,
602
+ -5,
603
+ -6,
604
+ -7,
605
+ -2,
606
+ ]
607
+ ### Nonterm to Int
608
+ nonterm_to_int = {
609
+ :start => 0,
610
+ :option_list => 1,
611
+ :option => 2,
612
+ }
613
+ ### Int to Nonterm
614
+ int_to_nonterm = [
615
+ :start,
616
+ :option_list,
617
+ :option,
618
+ ]
619
+ ### Goto Table
620
+ goto_table = [
621
+ [ 1, nil, nil, ],
622
+ [ nil, nil, nil, ],
623
+ [ nil, 3, 4, ],
624
+ [ nil, nil, 9, ],
625
+ [ nil, nil, nil, ],
626
+ [ nil, nil, nil, ],
627
+ [ nil, nil, nil, ],
628
+ [ nil, nil, nil, ],
629
+ [ nil, nil, nil, ],
630
+ [ nil, nil, nil, ],
631
+ [ nil, nil, nil, ],
632
+ [ nil, nil, nil, ],
633
+ [ nil, nil, nil, ],
634
+ [ nil, nil, nil, ],
635
+ [ nil, nil, nil, ],
636
+ ]
637
+
638
+ Tables = [ reduce_table, action_table,
639
+ defred_table, defred_after_shift_table, goto_table,
640
+ term_to_int, int_to_term, nonterm_to_int, int_to_nonterm ]
641
+
642
+ def initialize g_parser, master
643
+ super()
644
+ @g_parser = g_parser
645
+ @d_parser = g_parser.d_parser
646
+ @master = master
647
+ @decorated = Action.new(self)
648
+ end
649
+
650
+
651
+ def do_parse?
652
+ if @line.match(/^\s*\[/)
653
+
654
+ true
655
+ else
656
+ false
657
+ end
658
+ end
659
+
660
+
661
+ def banner
662
+ "[> ...] / Depager::StatefulLexerExtension"
663
+ end
664
+
665
+
666
+ def lex
667
+ begin
668
+ until @line.empty?
669
+ case @line
670
+
671
+ when /\A\s+/
672
+ @line = $'
673
+
674
+
675
+
676
+ when /\A:[a-zA-Z_]+\??/
677
+ @line = $'
678
+ yield token(:SYMBOL, $&)
679
+
680
+
681
+ when /\A\]/
682
+ @line = $'
683
+ yield token($&, $&); @line = $'; yield nil, nil
684
+
685
+
686
+ when /\A./
687
+ @line = $'
688
+ yield token($&, $&)
689
+
690
+
691
+ else
692
+ raise RuntimeError, "must not happen #{@line}"
693
+ end
694
+ end
695
+ end while @original_line = @line = file.gets
696
+ yield nil, nil
697
+ end
698
+
699
+ end
700
+ end
701
+
702
+
703
+ class Depager::StatefulLexerExtension::Slave_pre_rhs__post_symbol::Action < Depager::LALR::Action #:nodoc:all
704
+ include Depager::Utils::ExtensionSlaveDecoratorMethods
705
+
706
+ on_reduce = [
707
+ nil,
708
+ :_act_1,
709
+ :_act_2,
710
+ :_act_3,
711
+ :_act_4,
712
+ :_act_5,
713
+ :_act_6,
714
+ :_act_7,
715
+
716
+ ]
717
+ Tables = [ on_reduce ]
718
+
719
+
720
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 181
721
+ def _act_1 val
722
+ _, _option_list, _, = *val
723
+
724
+ master.ins.push [g_parser.rhs.size, _option_list, false]
725
+
726
+ end
727
+ DEPAGER_EXPANDED_CODE
728
+
729
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 185
730
+ def _act_2 val
731
+ _, _option_list, _, _, = *val
732
+
733
+ master.ins.push [g_parser.rhs.size, _option_list, true]
734
+
735
+ end
736
+ DEPAGER_EXPANDED_CODE
737
+
738
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 191
739
+ def _act_3 val
740
+ _option, = *val
741
+ [_option]
742
+
743
+ end
744
+ DEPAGER_EXPANDED_CODE
745
+
746
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 192
747
+ def _act_4 val
748
+ _option_list, _option, = *val
749
+ _option_list << _option
750
+
751
+ end
752
+ DEPAGER_EXPANDED_CODE
753
+
754
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 195
755
+ def _act_5 val
756
+ _, _SYMBOL, = *val
757
+ [:GOTO, _SYMBOL.value]
758
+
759
+ end
760
+ DEPAGER_EXPANDED_CODE
761
+
762
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 196
763
+ def _act_6 val
764
+ _, _SYMBOL, = *val
765
+ [:ADD, _SYMBOL.value]
766
+
767
+ end
768
+ DEPAGER_EXPANDED_CODE
769
+
770
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/ruby/plugins/slex.dr', 197
771
+ def _act_7 val
772
+ _, _SYMBOL, = *val
773
+ [:SUB, _SYMBOL.value]
774
+
775
+ end
776
+ DEPAGER_EXPANDED_CODE
777
+
778
+
779
+ end
780
+