depager 0.2.3 → 0.3.0.b20250423

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 (106) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +44 -0
  3. data/.simplecov +5 -0
  4. data/Gemfile +12 -0
  5. data/LICENSE.gpl +339 -0
  6. data/Manifest.txt +73 -0
  7. data/README.en +7 -21
  8. data/README.ja +19 -99
  9. data/Rakefile +31 -0
  10. data/bin/depager +7 -45
  11. data/examples/action_pl0d/pl0d.action.dr +421 -0
  12. data/examples/action_pl0d/test.pl0ds +48 -0
  13. data/examples/c89/c89.dr +493 -496
  14. data/examples/c89/test.c89 +10 -10
  15. data/examples/extension/astdf.rb +9 -0
  16. data/examples/extension/atree.dr +55 -0
  17. data/examples/{sample_calc → extension}/calc.atree.dr +42 -43
  18. data/examples/{sample_calc/calc.action.dr → extension/calc.simple_action.dr} +33 -33
  19. data/examples/extension/paction.dr +16 -15
  20. data/examples/extension/pactiontest.dr +14 -14
  21. data/examples/extension/simple_action.rb +46 -0
  22. data/examples/pl0d/pl0ds.dr +337 -334
  23. data/examples/pl0d/test.pl0ds +33 -33
  24. data/examples/rie_calc/calc.rie.dr +57 -0
  25. data/examples/rie_calc/test.calc +4 -0
  26. data/examples/rie_dcuse/dcuse.rie.dr +71 -0
  27. data/examples/rie_dcuse/test.dcuse +1 -0
  28. data/examples/rie_pl0/orig_ex/exerrdg.pl0 +44 -0
  29. data/examples/rie_pl0/orig_ex/exerrm.pl0 +19 -0
  30. data/examples/rie_pl0/orig_ex/exerrmre.pl0 +20 -0
  31. data/examples/rie_pl0/orig_ex/exerrtok.pl0 +18 -0
  32. data/examples/rie_pl0/orig_ex/exmdg.pl0 +40 -0
  33. data/examples/rie_pl0/orig_ex/exmdgwwl.pl0 +43 -0
  34. data/examples/rie_pl0/orig_ex/exmrw.pl0 +22 -0
  35. data/examples/rie_pl0/orig_ex/exmwwl.pl0 +18 -0
  36. data/examples/rie_pl0/orig_ex/exnorw.pl0 +17 -0
  37. data/examples/rie_pl0/pl0.rie.dr +450 -0
  38. data/examples/rie_pl0/test.pl0 +10 -0
  39. data/examples/slex_test/divreg.slex.dr +29 -29
  40. data/examples/slex_test/ljoin.slex.dr +36 -36
  41. data/examples/slex_test/test.divreg +1 -1
  42. data/examples/slex_test/test.ljoin +3 -3
  43. data/examples/{sample_calc/calc.nvaction.dr → tiny_calc/calc.action.dr} +33 -33
  44. data/examples/{sample_calc → tiny_calc}/calc.ast.action.dr +76 -66
  45. data/examples/{sample_calc → tiny_calc}/calc.ast.dr +67 -55
  46. data/examples/tiny_calc/calc.cst.dr +50 -0
  47. data/examples/{sample_calc → tiny_calc}/calc.dr +43 -43
  48. data/examples/{sample_calc → tiny_calc}/calc.lex.dr +29 -29
  49. data/examples/{sample_calc/calc_prec.nvaction.dr → tiny_calc/calc_prec.action.dr} +31 -31
  50. data/lib/depager/cli.rb +44 -0
  51. data/lib/depager/grammar.rb +253 -291
  52. data/lib/depager/lr.rb +589 -579
  53. data/lib/depager/parser.rb +269 -277
  54. data/lib/depager/plugins/_rie_debug.rb +63 -0
  55. data/lib/depager/plugins/action.rb +47 -0
  56. data/lib/depager/plugins/ast.dr +367 -0
  57. data/lib/depager/plugins/ast.rb +1329 -0
  58. data/lib/depager/{ruby/plugins → plugins}/cst.dr +174 -180
  59. data/lib/depager/plugins/cst.rb +591 -0
  60. data/lib/depager/{ruby/plugins → plugins}/lex.dr +85 -89
  61. data/lib/depager/plugins/lex.rb +313 -0
  62. data/lib/depager/plugins/rie.dr +725 -0
  63. data/lib/depager/plugins/rie.rb +1614 -0
  64. data/lib/depager/{ruby/plugins → plugins}/slex.dr +201 -200
  65. data/lib/depager/plugins/slex.rb +769 -0
  66. data/lib/depager/plugins/srp.rb +46 -0
  67. data/lib/depager/ruby/templates/extension_lalr_master.erb +40 -51
  68. data/lib/depager/ruby/templates/extension_lalr_slave.erb +113 -107
  69. data/lib/depager/ruby/templates/single_lalr_parser.erb +124 -117
  70. data/lib/depager/utils.rb +158 -318
  71. data/lib/depager/version.rb +3 -3
  72. data/lib/depager.rb +572 -670
  73. metadata +77 -80
  74. data/ChangeLog +0 -16
  75. data/data/depager/pre-setup.rb +0 -3
  76. data/examples/c89/c89.tab.rb +0 -7127
  77. data/examples/pl0d/pl0ds.tab.rb +0 -2698
  78. data/examples/sample_calc/calc.action.tab.rb +0 -457
  79. data/examples/sample_calc/calc.ast.action.tab.rb +0 -749
  80. data/examples/sample_calc/calc.ast.tab.rb +0 -665
  81. data/examples/sample_calc/calc.astdf.dr +0 -54
  82. data/examples/sample_calc/calc.astdf.tab.rb +0 -672
  83. data/examples/sample_calc/calc.atree.tab.rb +0 -451
  84. data/examples/sample_calc/calc.cst.dr +0 -45
  85. data/examples/sample_calc/calc.cst.tab.rb +0 -644
  86. data/examples/sample_calc/calc.lex.tab.rb +0 -374
  87. data/examples/sample_calc/calc.nvaction.tab.rb +0 -465
  88. data/examples/sample_calc/calc.tab.rb +0 -365
  89. data/examples/sample_calc/calc_prec.nvaction.tab.rb +0 -431
  90. data/examples/slex_test/divreg.slex.tab.rb +0 -303
  91. data/examples/slex_test/ljoin.slex.tab.rb +0 -370
  92. data/lib/depager/ruby/plugins/_ast_tmpl.rb +0 -73
  93. data/lib/depager/ruby/plugins/action.rb +0 -43
  94. data/lib/depager/ruby/plugins/ast.dr +0 -269
  95. data/lib/depager/ruby/plugins/ast.rb +0 -1308
  96. data/lib/depager/ruby/plugins/astdf.rb +0 -6
  97. data/lib/depager/ruby/plugins/atree.dr +0 -55
  98. data/lib/depager/ruby/plugins/atree.rb +0 -347
  99. data/lib/depager/ruby/plugins/cst.rb +0 -626
  100. data/lib/depager/ruby/plugins/lex.rb +0 -336
  101. data/lib/depager/ruby/plugins/nvaction.rb +0 -19
  102. data/lib/depager/ruby/plugins/slex.rb +0 -817
  103. data/lib/depager/ruby/plugins/srp.rb +0 -51
  104. data/lib/depager/ruby/templates/simple.erb +0 -23
  105. data/setup.rb +0 -1585
  106. /data/examples/{sample_calc → tiny_calc}/test.calc +0 -0
@@ -1,200 +1,201 @@
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 ('depager/plugins/lex.rb')
3
+ %extend Depager::Depager::Action ('depager/plugins/action.rb')
4
+ %decorate @Action
5
+ #%decorate Depager::LALR::ShiftReducePrinter ('depager/plugins/srp.rb')
6
+ %inner{
7
+ attr_accessor :ins, :code, :optval
8
+ def init_extension
9
+ @ins = []
10
+ @action_code = ''
11
+ @on_reduce = []
12
+ @addition = []
13
+ end
14
+
15
+ def term_extension
16
+ @action_code << <<-CODE
17
+ def after_error
18
+ warn "StatefulLex: lex_state==\#{@basis.lex_state}" if Depager.debug_mode?
19
+ end
20
+ CODE
21
+ g_parser.outer_code <<
22
+ generate_action_decorator_code(@on_reduce, @action_code)
23
+ end
24
+
25
+ def post_rhs
26
+ j = 0
27
+ rhs = g_parser.rhs
28
+ @ins.each do |i, option_list, debug|
29
+ state_name = "#{g_parser.lhs_name}_#{g_parser.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.insert_sym_to_rhs(i + j, isym, nt_name)
35
+ @addition << [ isym, m_name ]
36
+ j += 1
37
+ else
38
+ @on_reduce[g_parser.rules.size-1] = ':'+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
+ @action_code << <<-CODE
56
+ def #{m_name} val
57
+ #{codes.join("\n ")}
58
+ end
59
+ CODE
60
+ end
61
+ @ins.clear
62
+ end
63
+
64
+ def post_rhs_list
65
+ @addition.each do |isym, m_name|
66
+ g_parser.add_rule isym, []
67
+ @on_reduce[g_parser.rules.size-1] = ':'+m_name
68
+ end
69
+ @addition.clear
70
+ end
71
+ %}
72
+ ######################################################################
73
+ # Define Tokens
74
+ ######################################################################
75
+ %hook pre_rule_list /%LEX\{\s*\Z/ skip
76
+ %banner '%LEX{ ... }'
77
+ %%
78
+ %LEX{
79
+ /\s+/, /#.*\Z/ { }
80
+ /[A-Z]+/ { yield token(:ID, $&) }
81
+ /\%\}\s*\Z/ { yield nil,nil }
82
+ /\/(([^\/\\]+|\\.)*)\// { yield token(:LEX, "/\\A#{$1}/") }
83
+ /'([^'\\]+|\\.)*'/,
84
+ /"([^"\\]+|\\.)*"/
85
+ {
86
+ yield token(:LEX, "/\\A#{Regexp.escape($1).gsub('/', '\/')}/")
87
+ }
88
+ '{' !
89
+ {
90
+ lineno = file.lineno
91
+ yield token(:ACTION, parse_block, lineno)
92
+ }
93
+ /./ { yield token($&, $&) }
94
+ %}
95
+ #begin-rule
96
+ start:
97
+ mode_list
98
+ {
99
+ ll = ''
100
+ _mode_list.each do |m, s, l|
101
+ else_code = if s
102
+ "lex_#{s}(&block)"
103
+ else
104
+ 'raise RuntimeError, "must not happen #{@line}"'
105
+ end
106
+ ll << <<-CODE
107
+ def lex_#{m}(&block)
108
+ case @line
109
+ #{l}
110
+ else
111
+ #{else_code}
112
+ end
113
+ end
114
+ CODE
115
+ end
116
+ g_parser.inner_code << ll << <<-CODE
117
+ attr_accessor :lex_state, :lex_context
118
+ def lex(&block)
119
+ @lex_state ||= :START
120
+ @lex_context ||= {}
121
+ begin
122
+ until @line.empty?
123
+ self.send "lex_\#{@lex_state}", &block
124
+ end
125
+ end while @original_line = @line = file.gets
126
+ yield nil, nil
127
+ end
128
+ CODE
129
+ }
130
+ ;
131
+ mode_list:
132
+ { [ ] }
133
+ | mode_list mode lexactlist { _mode_list << [_mode[0], _mode[1], _lexactlist] }
134
+ ;
135
+ mode:
136
+ '<' ID opt_super '>' { [ _ID.value, _opt_super ] }
137
+ ;
138
+ opt_super:
139
+ { nil }
140
+ | ':' ID { _ID.value }
141
+ ;
142
+ lexactlist:
143
+ lexact { _lexact }
144
+ | lexactlist lexact { _lexactlist << _lexact }
145
+ ;
146
+ lexact:
147
+ lexlist opt_noskip ACTION
148
+ {
149
+ <<-CODE
150
+ when #{_lexlist.join(', ')}
151
+ #{ _opt_noskip ? '#' : "@line = $'" }
152
+ #{ _ACTION.value }
153
+ CODE
154
+ }
155
+ ;
156
+ opt_noskip:
157
+ { false }
158
+ | '!' { true }
159
+ ;
160
+ lexlist:
161
+ LEX { [ _LEX.value ] }
162
+ | lexlist ',' LEX { _lexlist.push _LEX.value }
163
+ ;
164
+ #end-rule
165
+ %%
166
+ ######################################################################
167
+ # Change State
168
+ ######################################################################
169
+ %hook pre_rhs post_symbol /\[/
170
+ %banner '[> ...]'
171
+ %%
172
+ %LEX{
173
+ /\s+/ { }
174
+ /:[a-zA-Z_]+\??/ { yield token(:SYMBOL, $&) }
175
+ /\]/ { yield token($&, $&); @line = $'; yield nil, nil }
176
+ /./ { yield token($&, $&) }
177
+ %}
178
+
179
+ #begin-rule
180
+ start:
181
+ '[' option_list ']'
182
+ {
183
+ master.ins.push [g_parser.rhs.size, _option_list, false]
184
+ }
185
+ | '[' option_list '?' ']'
186
+ {
187
+ master.ins.push [g_parser.rhs.size, _option_list, true]
188
+ }
189
+
190
+ ;
191
+ option_list:
192
+ option { [_option] }
193
+ | option_list option { _option_list << _option }
194
+ ;
195
+ option:
196
+ '>' SYMBOL { [:GOTO, _SYMBOL.value] }
197
+ | '+' SYMBOL { [:ADD, _SYMBOL.value] }
198
+ | '-' SYMBOL { [:SUB, _SYMBOL.value] }
199
+ ;
200
+ #end-rule
201
+ %%