lrama 0.5.6 → 0.5.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/lrama/parser.rb CHANGED
@@ -1,293 +1,1802 @@
1
- require "lrama/report/duration"
2
- require "lrama/parser/token_scanner"
1
+ #
2
+ # DO NOT MODIFY!!!!
3
+ # This file is automatically generated by Racc 1.7.1
4
+ # from Racc grammar file "".
5
+ #
6
+
7
+ ###### racc/parser.rb begin
8
+ unless $".find {|p| p.end_with?('/racc/parser.rb')}
9
+ $".push "#{__dir__}/racc/parser.rb"
10
+ self.class.module_eval(<<'...end racc/parser.rb/module_eval...', 'racc/parser.rb', 1)
11
+ # frozen_string_literal: false
12
+ #--
13
+ # Copyright (c) 1999-2006 Minero Aoki
14
+ #
15
+ # This program is free software.
16
+ # You can distribute/modify this program under the same terms of ruby.
17
+ #
18
+ # As a special exception, when this code is copied by Racc
19
+ # into a Racc output file, you may use that output file
20
+ # without restriction.
21
+ #++
22
+
23
+ unless $".find {|p| p.end_with?('/racc/info.rb')}
24
+ $".push "#{__dir__}/racc/info.rb"
25
+ #--
26
+ #
27
+ #
28
+ #
29
+ # Copyright (c) 1999-2006 Minero Aoki
30
+ #
31
+ # This program is free software.
32
+ # You can distribute/modify this program under the same terms of ruby.
33
+ # see the file "COPYING".
34
+ #
35
+ #++
36
+
37
+ module Racc
38
+ VERSION = '1.7.1'
39
+ Version = VERSION
40
+ Copyright = 'Copyright (c) 1999-2006 Minero Aoki'
41
+ end
42
+
43
+ end
44
+
45
+
46
+ unless defined?(NotImplementedError)
47
+ NotImplementedError = NotImplementError # :nodoc:
48
+ end
49
+
50
+ module Racc
51
+ class ParseError < StandardError; end
52
+ end
53
+ unless defined?(::ParseError)
54
+ ParseError = Racc::ParseError # :nodoc:
55
+ end
56
+
57
+ # Racc is a LALR(1) parser generator.
58
+ # It is written in Ruby itself, and generates Ruby programs.
59
+ #
60
+ # == Command-line Reference
61
+ #
62
+ # racc [-o<var>filename</var>] [--output-file=<var>filename</var>]
63
+ # [-e<var>rubypath</var>] [--executable=<var>rubypath</var>]
64
+ # [-v] [--verbose]
65
+ # [-O<var>filename</var>] [--log-file=<var>filename</var>]
66
+ # [-g] [--debug]
67
+ # [-E] [--embedded]
68
+ # [-l] [--no-line-convert]
69
+ # [-c] [--line-convert-all]
70
+ # [-a] [--no-omit-actions]
71
+ # [-C] [--check-only]
72
+ # [-S] [--output-status]
73
+ # [--version] [--copyright] [--help] <var>grammarfile</var>
74
+ #
75
+ # [+grammarfile+]
76
+ # Racc grammar file. Any extension is permitted.
77
+ # [-o+outfile+, --output-file=+outfile+]
78
+ # A filename for output. default is <+filename+>.tab.rb
79
+ # [-O+filename+, --log-file=+filename+]
80
+ # Place logging output in file +filename+.
81
+ # Default log file name is <+filename+>.output.
82
+ # [-e+rubypath+, --executable=+rubypath+]
83
+ # output executable file(mode 755). where +path+ is the Ruby interpreter.
84
+ # [-v, --verbose]
85
+ # verbose mode. create +filename+.output file, like yacc's y.output file.
86
+ # [-g, --debug]
87
+ # add debug code to parser class. To display debuggin information,
88
+ # use this '-g' option and set @yydebug true in parser class.
89
+ # [-E, --embedded]
90
+ # Output parser which doesn't need runtime files (racc/parser.rb).
91
+ # [-C, --check-only]
92
+ # Check syntax of racc grammar file and quit.
93
+ # [-S, --output-status]
94
+ # Print messages time to time while compiling.
95
+ # [-l, --no-line-convert]
96
+ # turns off line number converting.
97
+ # [-c, --line-convert-all]
98
+ # Convert line number of actions, inner, header and footer.
99
+ # [-a, --no-omit-actions]
100
+ # Call all actions, even if an action is empty.
101
+ # [--version]
102
+ # print Racc version and quit.
103
+ # [--copyright]
104
+ # Print copyright and quit.
105
+ # [--help]
106
+ # Print usage and quit.
107
+ #
108
+ # == Generating Parser Using Racc
109
+ #
110
+ # To compile Racc grammar file, simply type:
111
+ #
112
+ # $ racc parse.y
113
+ #
114
+ # This creates Ruby script file "parse.tab.y". The -o option can change the output filename.
115
+ #
116
+ # == Writing A Racc Grammar File
117
+ #
118
+ # If you want your own parser, you have to write a grammar file.
119
+ # A grammar file contains the name of your parser class, grammar for the parser,
120
+ # user code, and anything else.
121
+ # When writing a grammar file, yacc's knowledge is helpful.
122
+ # If you have not used yacc before, Racc is not too difficult.
123
+ #
124
+ # Here's an example Racc grammar file.
125
+ #
126
+ # class Calcparser
127
+ # rule
128
+ # target: exp { print val[0] }
129
+ #
130
+ # exp: exp '+' exp
131
+ # | exp '*' exp
132
+ # | '(' exp ')'
133
+ # | NUMBER
134
+ # end
135
+ #
136
+ # Racc grammar files resemble yacc files.
137
+ # But (of course), this is Ruby code.
138
+ # yacc's $$ is the 'result', $0, $1... is
139
+ # an array called 'val', and $-1, $-2... is an array called '_values'.
140
+ #
141
+ # See the {Grammar File Reference}[rdoc-ref:lib/racc/rdoc/grammar.en.rdoc] for
142
+ # more information on grammar files.
143
+ #
144
+ # == Parser
145
+ #
146
+ # Then you must prepare the parse entry method. There are two types of
147
+ # parse methods in Racc, Racc::Parser#do_parse and Racc::Parser#yyparse
148
+ #
149
+ # Racc::Parser#do_parse is simple.
150
+ #
151
+ # It's yyparse() of yacc, and Racc::Parser#next_token is yylex().
152
+ # This method must returns an array like [TOKENSYMBOL, ITS_VALUE].
153
+ # EOF is [false, false].
154
+ # (TOKENSYMBOL is a Ruby symbol (taken from String#intern) by default.
155
+ # If you want to change this, see the grammar reference.
156
+ #
157
+ # Racc::Parser#yyparse is little complicated, but useful.
158
+ # It does not use Racc::Parser#next_token, instead it gets tokens from any iterator.
159
+ #
160
+ # For example, <code>yyparse(obj, :scan)</code> causes
161
+ # calling +obj#scan+, and you can return tokens by yielding them from +obj#scan+.
162
+ #
163
+ # == Debugging
164
+ #
165
+ # When debugging, "-v" or/and the "-g" option is helpful.
166
+ #
167
+ # "-v" creates verbose log file (.output).
168
+ # "-g" creates a "Verbose Parser".
169
+ # Verbose Parser prints the internal status when parsing.
170
+ # But it's _not_ automatic.
171
+ # You must use -g option and set +@yydebug+ to +true+ in order to get output.
172
+ # -g option only creates the verbose parser.
173
+ #
174
+ # === Racc reported syntax error.
175
+ #
176
+ # Isn't there too many "end"?
177
+ # grammar of racc file is changed in v0.10.
178
+ #
179
+ # Racc does not use '%' mark, while yacc uses huge number of '%' marks..
180
+ #
181
+ # === Racc reported "XXXX conflicts".
182
+ #
183
+ # Try "racc -v xxxx.y".
184
+ # It causes producing racc's internal log file, xxxx.output.
185
+ #
186
+ # === Generated parsers does not work correctly
187
+ #
188
+ # Try "racc -g xxxx.y".
189
+ # This command let racc generate "debugging parser".
190
+ # Then set @yydebug=true in your parser.
191
+ # It produces a working log of your parser.
192
+ #
193
+ # == Re-distributing Racc runtime
194
+ #
195
+ # A parser, which is created by Racc, requires the Racc runtime module;
196
+ # racc/parser.rb.
197
+ #
198
+ # Ruby 1.8.x comes with Racc runtime module,
199
+ # you need NOT distribute Racc runtime files.
200
+ #
201
+ # If you want to include the Racc runtime module with your parser.
202
+ # This can be done by using '-E' option:
203
+ #
204
+ # $ racc -E -omyparser.rb myparser.y
205
+ #
206
+ # This command creates myparser.rb which `includes' Racc runtime.
207
+ # Only you must do is to distribute your parser file (myparser.rb).
208
+ #
209
+ # Note: parser.rb is ruby license, but your parser is not.
210
+ # Your own parser is completely yours.
211
+ module Racc
212
+
213
+ unless defined?(Racc_No_Extensions)
214
+ Racc_No_Extensions = false # :nodoc:
215
+ end
3
216
 
4
- module Lrama
5
- # Parser for parse.y, generates a grammar
6
217
  class Parser
7
- include Lrama::Report::Duration
8
218
 
9
- T = Lrama::Lexer::Token
219
+ Racc_Runtime_Version = ::Racc::VERSION
220
+ Racc_Runtime_Core_Version_R = ::Racc::VERSION
221
+
222
+ begin
223
+ if Object.const_defined?(:RUBY_ENGINE) and RUBY_ENGINE == 'jruby'
224
+ require 'jruby'
225
+ require 'racc/cparse-jruby.jar'
226
+ com.headius.racc.Cparse.new.load(JRuby.runtime, false)
227
+ else
228
+ require 'racc/cparse'
229
+ end
230
+
231
+ unless new.respond_to?(:_racc_do_parse_c, true)
232
+ raise LoadError, 'old cparse.so'
233
+ end
234
+ if Racc_No_Extensions
235
+ raise LoadError, 'selecting ruby version of racc runtime core'
236
+ end
237
+
238
+ Racc_Main_Parsing_Routine = :_racc_do_parse_c # :nodoc:
239
+ Racc_YY_Parse_Method = :_racc_yyparse_c # :nodoc:
240
+ Racc_Runtime_Core_Version = Racc_Runtime_Core_Version_C # :nodoc:
241
+ Racc_Runtime_Type = 'c' # :nodoc:
242
+ rescue LoadError
243
+ Racc_Main_Parsing_Routine = :_racc_do_parse_rb
244
+ Racc_YY_Parse_Method = :_racc_yyparse_rb
245
+ Racc_Runtime_Core_Version = Racc_Runtime_Core_Version_R
246
+ Racc_Runtime_Type = 'ruby'
247
+ end
10
248
 
11
- def initialize(text)
12
- @text = text
249
+ def Parser.racc_runtime_type # :nodoc:
250
+ Racc_Runtime_Type
13
251
  end
14
252
 
15
- def parse
16
- report_duration(:parse) do
17
- lexer = Lexer.new(@text)
18
- grammar = Grammar.new
19
- process_prologue(grammar, lexer)
20
- parse_bison_declarations(TokenScanner.new(lexer.bison_declarations_tokens), grammar)
21
- parse_grammar_rules(TokenScanner.new(lexer.grammar_rules_tokens), grammar)
22
- process_epilogue(grammar, lexer)
23
- grammar.prepare
24
- grammar.compute_nullable
25
- grammar.compute_first_set
26
- grammar.validate!
27
-
28
- grammar
253
+ def _racc_setup
254
+ @yydebug = false unless self.class::Racc_debug_parser
255
+ @yydebug = false unless defined?(@yydebug)
256
+ if @yydebug
257
+ @racc_debug_out = $stderr unless defined?(@racc_debug_out)
258
+ @racc_debug_out ||= $stderr
29
259
  end
260
+ arg = self.class::Racc_arg
261
+ arg[13] = true if arg.size < 14
262
+ arg
30
263
  end
31
264
 
32
- private
265
+ def _racc_init_sysvars
266
+ @racc_state = [0]
267
+ @racc_tstack = []
268
+ @racc_vstack = []
33
269
 
34
- def process_prologue(grammar, lexer)
35
- grammar.prologue_first_lineno = lexer.prologue.first[1] if lexer.prologue.first
36
- grammar.prologue = lexer.prologue.map(&:first).join
270
+ @racc_t = nil
271
+ @racc_val = nil
272
+
273
+ @racc_read_next = true
274
+
275
+ @racc_user_yyerror = false
276
+ @racc_error_status = 0
277
+ end
278
+
279
+ # The entry point of the parser. This method is used with #next_token.
280
+ # If Racc wants to get token (and its value), calls next_token.
281
+ #
282
+ # Example:
283
+ # def parse
284
+ # @q = [[1,1],
285
+ # [2,2],
286
+ # [3,3],
287
+ # [false, '$']]
288
+ # do_parse
289
+ # end
290
+ #
291
+ # def next_token
292
+ # @q.shift
293
+ # end
294
+ class_eval <<~RUBY, __FILE__, __LINE__ + 1
295
+ def do_parse
296
+ #{Racc_Main_Parsing_Routine}(_racc_setup(), false)
37
297
  end
298
+ RUBY
38
299
 
39
- def process_epilogue(grammar, lexer)
40
- grammar.epilogue_first_lineno = lexer.epilogue.first[1] if lexer.epilogue.first
41
- grammar.epilogue = lexer.epilogue.map(&:first).join
300
+ # The method to fetch next token.
301
+ # If you use #do_parse method, you must implement #next_token.
302
+ #
303
+ # The format of return value is [TOKEN_SYMBOL, VALUE].
304
+ # +token-symbol+ is represented by Ruby's symbol by default, e.g. :IDENT
305
+ # for 'IDENT'. ";" (String) for ';'.
306
+ #
307
+ # The final symbol (End of file) must be false.
308
+ def next_token
309
+ raise NotImplementedError, "#{self.class}\#next_token is not defined"
42
310
  end
43
311
 
44
- def parse_bison_declarations(ts, grammar)
45
- precedence_number = 0
46
-
47
- while !ts.eots? do
48
- case ts.current_type
49
- when T::P_expect
50
- ts.next
51
- grammar.expect = ts.consume!(T::Number).s_value
52
- when T::P_define
53
- ts.next
54
- # Ignore
55
- ts.consume_multi(T::Ident)
56
- when T::P_printer
57
- lineno = ts.current_token.line
58
- ts.next
59
- code = ts.consume!(T::User_code)
60
- code = grammar.build_code(:printer, code)
61
- ident_or_tags = ts.consume_multi(T::Ident, T::Tag)
62
- grammar.add_printer(ident_or_tags: ident_or_tags, code: code, lineno: lineno)
63
- when T::P_error_token
64
- lineno = ts.current_token.line
65
- ts.next
66
- code = ts.consume!(T::User_code)
67
- code = grammar.build_code(:printer, code)
68
- ident_or_tags = ts.consume_multi(T::Ident, T::Tag)
69
- grammar.add_error_token(ident_or_tags: ident_or_tags, code: code, lineno: lineno)
70
- when T::P_lex_param
71
- ts.next
72
- code = ts.consume!(T::User_code)
73
- code = grammar.build_code(:lex_param, code)
74
- grammar.lex_param = code.token_code.s_value
75
- when T::P_parse_param
76
- ts.next
77
- code = ts.consume!(T::User_code)
78
- code = grammar.build_code(:parse_param, code)
79
- grammar.parse_param = code.token_code.s_value
80
- when T::P_initial_action
81
- ts.next
82
- code = ts.consume!(T::User_code)
83
- code = grammar.build_code(:initial_action, code)
84
- ts.consume(T::Semicolon)
85
- grammar.initial_action = code
86
- when T::P_union
87
- lineno = ts.current_token.line
88
- ts.next
89
- code = ts.consume!(T::User_code)
90
- code = grammar.build_code(:union, code)
91
- ts.consume(T::Semicolon)
92
- grammar.set_union(code, lineno)
93
- when T::P_token
94
- # %token tag? (ident number? string?)+
95
- #
96
- # * ident can be char, e.g. '\\', '\t', '\13'
97
- # * number is a token_id for term
98
- #
99
- # These are valid token declaration (from CRuby parse.y)
100
- #
101
- # %token END_OF_INPUT 0 "end-of-input"
102
- # %token <id> '\\' "backslash"
103
- # %token tSP "escaped space"
104
- # %token tUPLUS 132 "unary+"
105
- # %token tCOLON3 ":: at EXPR_BEG"
106
- # %token tSTRING_DBEG tSTRING_DVAR tLAMBEG tLABEL_END
107
- #
108
- #
109
- # See: https://www.gnu.org/software/bison/manual/html_node/Symbol-Decls.html
110
- ts.next
111
- opt_tag = ts.consume(T::Tag)
112
-
113
- while (id = ts.consume(T::Ident, T::Char)) do
114
- opt_number = ts.consume(T::Number)
115
- opt_string = ts.consume(T::String)
116
- # Can replace 0 (EOF)
117
- grammar.add_term(
118
- id: id,
119
- alias_name: opt_string && opt_string.s_value,
120
- token_id: opt_number && opt_number.s_value,
121
- tag: opt_tag,
122
- replace: true,
123
- )
312
+ def _racc_do_parse_rb(arg, in_debug)
313
+ action_table, action_check, action_default, action_pointer,
314
+ _, _, _, _,
315
+ _, _, token_table, * = arg
316
+
317
+ _racc_init_sysvars
318
+ tok = act = i = nil
319
+
320
+ catch(:racc_end_parse) {
321
+ while true
322
+ if i = action_pointer[@racc_state[-1]]
323
+ if @racc_read_next
324
+ if @racc_t != 0 # not EOF
325
+ tok, @racc_val = next_token()
326
+ unless tok # EOF
327
+ @racc_t = 0
328
+ else
329
+ @racc_t = (token_table[tok] or 1) # error token
330
+ end
331
+ racc_read_token(@racc_t, tok, @racc_val) if @yydebug
332
+ @racc_read_next = false
333
+ end
334
+ end
335
+ i += @racc_t
336
+ unless i >= 0 and
337
+ act = action_table[i] and
338
+ action_check[i] == @racc_state[-1]
339
+ act = action_default[@racc_state[-1]]
340
+ end
341
+ else
342
+ act = action_default[@racc_state[-1]]
124
343
  end
125
- when T::P_type
126
- # %type tag? (ident|char|string)+
127
- #
128
- # See: https://www.gnu.org/software/bison/manual/html_node/Symbol-Decls.html
129
- ts.next
130
- opt_tag = ts.consume(T::Tag)
131
-
132
- while (id = ts.consume(T::Ident, T::Char, T::String)) do
133
- grammar.add_type(
134
- id: id,
135
- tag: opt_tag
136
- )
344
+ while act = _racc_evalact(act, arg)
345
+ ;
137
346
  end
138
- when T::P_nonassoc
139
- # %nonassoc (ident|char|string)+
140
- ts.next
141
- while (id = ts.consume(T::Ident, T::Char, T::String)) do
142
- sym = grammar.add_term(id: id)
143
- grammar.add_nonassoc(sym, precedence_number)
347
+ end
348
+ }
349
+ end
350
+
351
+ # Another entry point for the parser.
352
+ # If you use this method, you must implement RECEIVER#METHOD_ID method.
353
+ #
354
+ # RECEIVER#METHOD_ID is a method to get next token.
355
+ # It must 'yield' the token, which format is [TOKEN-SYMBOL, VALUE].
356
+ class_eval <<~RUBY, __FILE__, __LINE__ + 1
357
+ def yyparse(recv, mid)
358
+ #{Racc_YY_Parse_Method}(recv, mid, _racc_setup(), false)
359
+ end
360
+ RUBY
361
+
362
+ def _racc_yyparse_rb(recv, mid, arg, c_debug)
363
+ action_table, action_check, action_default, action_pointer,
364
+ _, _, _, _,
365
+ _, _, token_table, * = arg
366
+
367
+ _racc_init_sysvars
368
+
369
+ catch(:racc_end_parse) {
370
+ until i = action_pointer[@racc_state[-1]]
371
+ while act = _racc_evalact(action_default[@racc_state[-1]], arg)
372
+ ;
144
373
  end
145
- precedence_number += 1
146
- when T::P_left
147
- # %left (ident|char|string)+
148
- ts.next
149
- while (id = ts.consume(T::Ident, T::Char, T::String)) do
150
- sym = grammar.add_term(id: id)
151
- grammar.add_left(sym, precedence_number)
374
+ end
375
+ recv.__send__(mid) do |tok, val|
376
+ unless tok
377
+ @racc_t = 0
378
+ else
379
+ @racc_t = (token_table[tok] or 1) # error token
152
380
  end
153
- precedence_number += 1
154
- when T::P_right
155
- # %right (ident|char|string)+
156
- ts.next
157
- while (id = ts.consume(T::Ident, T::Char, T::String)) do
158
- sym = grammar.add_term(id: id)
159
- grammar.add_right(sym, precedence_number)
381
+ @racc_val = val
382
+ @racc_read_next = false
383
+
384
+ i += @racc_t
385
+ unless i >= 0 and
386
+ act = action_table[i] and
387
+ action_check[i] == @racc_state[-1]
388
+ act = action_default[@racc_state[-1]]
160
389
  end
161
- precedence_number += 1
162
- when T::P_precedence
163
- # %precedence (ident|char|string)+
164
- ts.next
165
- while (id = ts.consume(T::Ident, T::Char, T::String)) do
166
- sym = grammar.add_term(id: id)
167
- grammar.add_precedence(sym, precedence_number)
390
+ while act = _racc_evalact(act, arg)
391
+ ;
392
+ end
393
+
394
+ while !(i = action_pointer[@racc_state[-1]]) ||
395
+ ! @racc_read_next ||
396
+ @racc_t == 0 # $
397
+ unless i and i += @racc_t and
398
+ i >= 0 and
399
+ act = action_table[i] and
400
+ action_check[i] == @racc_state[-1]
401
+ act = action_default[@racc_state[-1]]
402
+ end
403
+ while act = _racc_evalact(act, arg)
404
+ ;
405
+ end
168
406
  end
169
- precedence_number += 1
170
- when nil
171
- # end of input
172
- raise "Reach to end of input within declarations"
173
- else
174
- raise "Unexpected token: #{ts.current_token}"
175
407
  end
176
- end
408
+ }
177
409
  end
178
410
 
179
- def parse_grammar_rules(ts, grammar)
180
- while !ts.eots? do
181
- parse_grammar_rule(ts, grammar)
411
+ ###
412
+ ### common
413
+ ###
414
+
415
+ def _racc_evalact(act, arg)
416
+ action_table, action_check, _, action_pointer,
417
+ _, _, _, _,
418
+ _, _, _, shift_n,
419
+ reduce_n, * = arg
420
+ nerr = 0 # tmp
421
+
422
+ if act > 0 and act < shift_n
423
+ #
424
+ # shift
425
+ #
426
+ if @racc_error_status > 0
427
+ @racc_error_status -= 1 unless @racc_t <= 1 # error token or EOF
428
+ end
429
+ @racc_vstack.push @racc_val
430
+ @racc_state.push act
431
+ @racc_read_next = true
432
+ if @yydebug
433
+ @racc_tstack.push @racc_t
434
+ racc_shift @racc_t, @racc_tstack, @racc_vstack
435
+ end
436
+
437
+ elsif act < 0 and act > -reduce_n
438
+ #
439
+ # reduce
440
+ #
441
+ code = catch(:racc_jump) {
442
+ @racc_state.push _racc_do_reduce(arg, act)
443
+ false
444
+ }
445
+ if code
446
+ case code
447
+ when 1 # yyerror
448
+ @racc_user_yyerror = true # user_yyerror
449
+ return -reduce_n
450
+ when 2 # yyaccept
451
+ return shift_n
452
+ else
453
+ raise '[Racc Bug] unknown jump code'
454
+ end
455
+ end
456
+
457
+ elsif act == shift_n
458
+ #
459
+ # accept
460
+ #
461
+ racc_accept if @yydebug
462
+ throw :racc_end_parse, @racc_vstack[0]
463
+
464
+ elsif act == -reduce_n
465
+ #
466
+ # error
467
+ #
468
+ case @racc_error_status
469
+ when 0
470
+ unless arg[21] # user_yyerror
471
+ nerr += 1
472
+ on_error @racc_t, @racc_val, @racc_vstack
473
+ end
474
+ when 3
475
+ if @racc_t == 0 # is $
476
+ # We're at EOF, and another error occurred immediately after
477
+ # attempting auto-recovery
478
+ throw :racc_end_parse, nil
479
+ end
480
+ @racc_read_next = true
481
+ end
482
+ @racc_user_yyerror = false
483
+ @racc_error_status = 3
484
+ while true
485
+ if i = action_pointer[@racc_state[-1]]
486
+ i += 1 # error token
487
+ if i >= 0 and
488
+ (act = action_table[i]) and
489
+ action_check[i] == @racc_state[-1]
490
+ break
491
+ end
492
+ end
493
+ throw :racc_end_parse, nil if @racc_state.size <= 1
494
+ @racc_state.pop
495
+ @racc_vstack.pop
496
+ if @yydebug
497
+ @racc_tstack.pop
498
+ racc_e_pop @racc_state, @racc_tstack, @racc_vstack
499
+ end
500
+ end
501
+ return act
502
+
503
+ else
504
+ raise "[Racc Bug] unknown action #{act.inspect}"
182
505
  end
506
+
507
+ racc_next_state(@racc_state[-1], @racc_state) if @yydebug
508
+
509
+ nil
183
510
  end
184
511
 
185
- # TODO: Take care of %prec of rule.
186
- # If %prec exists, user code before %prec
187
- # is NOT an action. For example "{ code 3 }" is NOT an action.
188
- #
189
- # keyword_class { code 2 } tSTRING '!' keyword_end { code 3 } %prec "="
190
- def parse_grammar_rule(ts, grammar)
191
- # LHS
192
- lhs = ts.consume!(T::Ident_Colon) # class:
193
- lhs.type = T::Ident
194
- if named_ref = ts.consume(T::Named_Ref)
195
- lhs.alias = named_ref.s_value
512
+ def _racc_do_reduce(arg, act)
513
+ _, _, _, _,
514
+ goto_table, goto_check, goto_default, goto_pointer,
515
+ nt_base, reduce_table, _, _,
516
+ _, use_result, * = arg
517
+
518
+ state = @racc_state
519
+ vstack = @racc_vstack
520
+ tstack = @racc_tstack
521
+
522
+ i = act * -3
523
+ len = reduce_table[i]
524
+ reduce_to = reduce_table[i+1]
525
+ method_id = reduce_table[i+2]
526
+ void_array = []
527
+
528
+ tmp_t = tstack[-len, len] if @yydebug
529
+ tmp_v = vstack[-len, len]
530
+ tstack[-len, len] = void_array if @yydebug
531
+ vstack[-len, len] = void_array
532
+ state[-len, len] = void_array
533
+
534
+ # tstack must be updated AFTER method call
535
+ if use_result
536
+ vstack.push __send__(method_id, tmp_v, vstack, tmp_v[0])
537
+ else
538
+ vstack.push __send__(method_id, tmp_v, vstack)
196
539
  end
540
+ tstack.push reduce_to
197
541
 
198
- rhs = parse_grammar_rule_rhs(ts, grammar, lhs)
199
-
200
- grammar.add_rule(lhs: lhs, rhs: rhs, lineno: rhs.first ? rhs.first.line : lhs.line)
201
-
202
- while true do
203
- case ts.current_type
204
- when T::Bar
205
- # |
206
- bar_lineno = ts.current_token.line
207
- ts.next
208
- rhs = parse_grammar_rule_rhs(ts, grammar, lhs)
209
- grammar.add_rule(lhs: lhs, rhs: rhs, lineno: rhs.first ? rhs.first.line : bar_lineno)
210
- when T::Semicolon
211
- # ;
212
- ts.next
213
- break
214
- when T::Ident_Colon
215
- # Next lhs can be here because ";" is optional.
216
- # Do not consume next token.
217
- break
218
- when nil
219
- # end of input can be here when ";" is omitted
220
- break
221
- else
222
- raise "Unexpected token: #{ts.current_token}"
542
+ racc_reduce(tmp_t, reduce_to, tstack, vstack) if @yydebug
543
+
544
+ k1 = reduce_to - nt_base
545
+ if i = goto_pointer[k1]
546
+ i += state[-1]
547
+ if i >= 0 and (curstate = goto_table[i]) and goto_check[i] == k1
548
+ return curstate
223
549
  end
224
550
  end
551
+ goto_default[k1]
225
552
  end
226
553
 
227
- def parse_grammar_rule_rhs(ts, grammar, lhs)
228
- a = []
229
- prec_seen = false
230
- code_after_prec = false
231
-
232
- while true do
233
- # TODO: String can be here
234
- case ts.current_type
235
- when T::Ident
236
- # keyword_class
237
-
238
- raise "Ident after %prec" if prec_seen
239
- a << ts.current_token
240
- ts.next
241
- when T::Char
242
- # '!'
243
-
244
- raise "Char after %prec" if prec_seen
245
- a << ts.current_token
246
- ts.next
247
- when T::P_prec
248
- # %prec tPLUS
249
- #
250
- # See: https://www.gnu.org/software/bison/manual/html_node/Contextual-Precedence.html
251
-
252
- ts.next
253
- prec_seen = true
254
- precedence_id = ts.consume!(T::Ident, T::String, T::Char)
255
- precedence_sym = grammar.find_symbol_by_id!(precedence_id)
256
- a << precedence_sym
257
- when T::User_code
258
- # { code } in the middle of rhs
259
-
260
- if prec_seen
261
- raise "Multiple User_code after %prec" if code_after_prec
262
- code_after_prec = true
263
- end
554
+ # This method is called when a parse error is found.
555
+ #
556
+ # ERROR_TOKEN_ID is an internal ID of token which caused error.
557
+ # You can get string representation of this ID by calling
558
+ # #token_to_str.
559
+ #
560
+ # ERROR_VALUE is a value of error token.
561
+ #
562
+ # value_stack is a stack of symbol values.
563
+ # DO NOT MODIFY this object.
564
+ #
565
+ # This method raises ParseError by default.
566
+ #
567
+ # If this method returns, parsers enter "error recovering mode".
568
+ def on_error(t, val, vstack)
569
+ raise ParseError, sprintf("\nparse error on value %s (%s)",
570
+ val.inspect, token_to_str(t) || '?')
571
+ end
264
572
 
265
- code = ts.current_token
266
- code.numberize_references(lhs, a)
267
- grammar.build_references(code)
268
- a << code
269
- ts.next
270
- when T::Named_Ref
271
- ts.previous_token.alias = ts.current_token.s_value
272
- ts.next
273
- when T::Bar
274
- # |
275
- break
276
- when T::Semicolon
277
- # ;
278
- break
279
- when T::Ident_Colon
280
- # Next lhs can be here because ";" is optional.
281
- break
282
- when nil
283
- # end of input can be here when ";" is omitted
284
- break
285
- else
286
- raise "Unexpected token: #{ts.current_token}"
287
- end
573
+ # Enter error recovering mode.
574
+ # This method does not call #on_error.
575
+ def yyerror
576
+ throw :racc_jump, 1
577
+ end
578
+
579
+ # Exit parser.
580
+ # Return value is +Symbol_Value_Stack[0]+.
581
+ def yyaccept
582
+ throw :racc_jump, 2
583
+ end
584
+
585
+ # Leave error recovering mode.
586
+ def yyerrok
587
+ @racc_error_status = 0
588
+ end
589
+
590
+ # For debugging output
591
+ def racc_read_token(t, tok, val)
592
+ @racc_debug_out.print 'read '
593
+ @racc_debug_out.print tok.inspect, '(', racc_token2str(t), ') '
594
+ @racc_debug_out.puts val.inspect
595
+ @racc_debug_out.puts
596
+ end
597
+
598
+ def racc_shift(tok, tstack, vstack)
599
+ @racc_debug_out.puts "shift #{racc_token2str tok}"
600
+ racc_print_stacks tstack, vstack
601
+ @racc_debug_out.puts
602
+ end
603
+
604
+ def racc_reduce(toks, sim, tstack, vstack)
605
+ out = @racc_debug_out
606
+ out.print 'reduce '
607
+ if toks.empty?
608
+ out.print ' <none>'
609
+ else
610
+ toks.each {|t| out.print ' ', racc_token2str(t) }
611
+ end
612
+ out.puts " --> #{racc_token2str(sim)}"
613
+ racc_print_stacks tstack, vstack
614
+ @racc_debug_out.puts
615
+ end
616
+
617
+ def racc_accept
618
+ @racc_debug_out.puts 'accept'
619
+ @racc_debug_out.puts
620
+ end
621
+
622
+ def racc_e_pop(state, tstack, vstack)
623
+ @racc_debug_out.puts 'error recovering mode: pop token'
624
+ racc_print_states state
625
+ racc_print_stacks tstack, vstack
626
+ @racc_debug_out.puts
627
+ end
628
+
629
+ def racc_next_state(curstate, state)
630
+ @racc_debug_out.puts "goto #{curstate}"
631
+ racc_print_states state
632
+ @racc_debug_out.puts
633
+ end
634
+
635
+ def racc_print_stacks(t, v)
636
+ out = @racc_debug_out
637
+ out.print ' ['
638
+ t.each_index do |i|
639
+ out.print ' (', racc_token2str(t[i]), ' ', v[i].inspect, ')'
288
640
  end
641
+ out.puts ' ]'
642
+ end
643
+
644
+ def racc_print_states(s)
645
+ out = @racc_debug_out
646
+ out.print ' ['
647
+ s.each {|st| out.print ' ', st }
648
+ out.puts ' ]'
649
+ end
289
650
 
290
- return a
651
+ def racc_token2str(tok)
652
+ self.class::Racc_token_to_s_table[tok] or
653
+ raise "[Racc Bug] can't convert token #{tok} to string"
291
654
  end
655
+
656
+ # Convert internal ID of token symbol to the string.
657
+ def token_to_str(t)
658
+ self.class::Racc_token_to_s_table[t]
659
+ end
660
+
661
+ end
662
+
663
+ end
664
+
665
+ ...end racc/parser.rb/module_eval...
666
+ end
667
+ ###### racc/parser.rb end
668
+ module Lrama
669
+ class Parser < Racc::Parser
670
+
671
+ module_eval(<<'...end parser.y/module_eval...', 'parser.y', 388)
672
+
673
+ include Lrama::Report::Duration
674
+
675
+ def initialize(text, path)
676
+ @text = text
677
+ @path = path
678
+ end
679
+
680
+ def parse
681
+ report_duration(:parse) do
682
+ @lexer = Lrama::Lexer.new(@text)
683
+ @grammar = Lrama::Grammar.new
684
+ @precedence_number = 0
685
+ do_parse
686
+ @grammar.extract_references
687
+ @grammar.prepare
688
+ @grammar.compute_nullable
689
+ @grammar.compute_first_set
690
+ @grammar.validate!
691
+ @grammar
692
+ end
693
+ end
694
+
695
+ def next_token
696
+ @lexer.next_token
697
+ end
698
+
699
+ def on_error(error_token_id, error_value, value_stack)
700
+ source = @text.split("\n")[error_value.line - 1]
701
+ raise ParseError, <<~ERROR
702
+ #{@path}:#{@lexer.line}:#{@lexer.column}: parse error on value #{error_value.inspect} (#{token_to_str(error_token_id) || '?'})
703
+ #{source}
704
+ #{' ' * @lexer.column}^
705
+ ERROR
706
+ end
707
+ ...end parser.y/module_eval...
708
+ ##### State transition tables begin ###
709
+
710
+ racc_action_table = [
711
+ 82, 132, 83, 42, 42, 41, 41, 65, 65, 42,
712
+ 42, 41, 41, 131, 56, 68, 3, 8, 38, 134,
713
+ 134, 42, 42, 41, 41, 65, 61, 68, 38, 6,
714
+ 32, 7, 84, 77, 135, 135, 20, 22, 23, 24,
715
+ 25, 26, 27, 28, 29, 30, 20, 22, 23, 24,
716
+ 25, 26, 27, 28, 29, 30, 9, 39, 44, 14,
717
+ 12, 13, 15, 16, 17, 18, 46, 46, 19, 20,
718
+ 22, 23, 24, 25, 26, 27, 28, 29, 30, 42,
719
+ 42, 41, 41, 46, 68, 68, 42, 42, 41, 41,
720
+ 65, 153, 42, 42, 41, 41, 65, 153, 42, 42,
721
+ 41, 41, 65, 153, 42, 42, 41, 41, 65, 153,
722
+ 42, 42, 41, 41, 65, 153, 42, 42, 41, 41,
723
+ 65, 153, 42, 42, 41, 41, 65, 65, 42, 42,
724
+ 41, 41, 65, 65, 42, 42, 41, 41, 65, 65,
725
+ 42, 42, 41, 41, 42, 42, 41, 41, 42, 42,
726
+ 41, 41, 42, 42, 41, 41, 49, 50, 51, 52,
727
+ 53, 74, 78, 80, 85, 85, 85, 92, 96, 97,
728
+ 105, 106, 108, 109, 110, 111, 112, 113, 116, 118,
729
+ 119, 122, 123, 124, 138, 139, 140, 141, 142, 143,
730
+ 122, 80, 148, 149, 156, 160, 161, 80, 80 ]
731
+
732
+ racc_action_check = [
733
+ 40, 120, 40, 121, 144, 121, 144, 121, 144, 25,
734
+ 27, 25, 27, 120, 25, 27, 1, 3, 9, 121,
735
+ 144, 26, 28, 26, 28, 26, 26, 28, 33, 2,
736
+ 7, 2, 40, 33, 121, 144, 9, 9, 9, 9,
737
+ 9, 9, 9, 9, 9, 9, 33, 33, 33, 33,
738
+ 33, 33, 33, 33, 33, 33, 4, 12, 14, 4,
739
+ 4, 4, 4, 4, 4, 4, 15, 16, 4, 4,
740
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 29,
741
+ 30, 29, 30, 17, 29, 30, 141, 13, 141, 13,
742
+ 141, 141, 142, 55, 142, 55, 142, 142, 143, 56,
743
+ 143, 56, 143, 143, 150, 66, 150, 66, 150, 150,
744
+ 154, 67, 154, 67, 154, 154, 155, 68, 155, 68,
745
+ 155, 155, 60, 61, 60, 61, 60, 61, 97, 99,
746
+ 97, 99, 97, 99, 117, 135, 117, 135, 117, 135,
747
+ 71, 72, 71, 72, 73, 92, 73, 92, 94, 100,
748
+ 94, 100, 102, 114, 102, 114, 18, 20, 22, 23,
749
+ 24, 31, 36, 37, 45, 47, 48, 54, 58, 59,
750
+ 79, 80, 86, 87, 88, 89, 90, 91, 95, 103,
751
+ 104, 105, 106, 107, 125, 126, 127, 128, 129, 130,
752
+ 131, 133, 136, 137, 146, 157, 159, 160, 161 ]
753
+
754
+ racc_action_pointer = [
755
+ nil, 16, 19, 17, 47, nil, nil, 23, nil, 14,
756
+ nil, nil, 51, 84, 51, 47, 48, 64, 137, nil,
757
+ 138, nil, 139, 140, 141, 6, 18, 7, 19, 76,
758
+ 77, 159, nil, 24, nil, nil, 141, 128, nil, nil,
759
+ -5, nil, nil, nil, nil, 145, nil, 146, 147, nil,
760
+ nil, nil, nil, nil, 159, 90, 96, nil, 162, 161,
761
+ 119, 120, nil, nil, nil, nil, 102, 108, 114, nil,
762
+ nil, 137, 138, 141, nil, nil, nil, nil, nil, 138,
763
+ 166, nil, nil, nil, nil, nil, 170, 171, 172, 173,
764
+ 174, 175, 142, nil, 145, 171, nil, 125, nil, 126,
765
+ 146, nil, 149, 168, 178, 162, 146, 181, nil, nil,
766
+ nil, nil, nil, nil, 150, nil, nil, 131, nil, nil,
767
+ -20, 0, nil, nil, nil, 164, 165, 166, 167, 168,
768
+ 169, 171, nil, 156, nil, 132, 190, 173, nil, nil,
769
+ nil, 83, 89, 95, 1, nil, 192, nil, nil, nil,
770
+ 101, nil, nil, nil, 107, 113, nil, 175, nil, 176,
771
+ 162, 163, nil, nil ]
772
+
773
+ racc_action_default = [
774
+ -2, -104, -8, -104, -104, -3, -4, -104, 164, -104,
775
+ -9, -10, -104, -104, -104, -104, -104, -104, -104, -20,
776
+ -104, -24, -104, -104, -104, -104, -104, -104, -104, -104,
777
+ -104, -104, -7, -91, -71, -73, -104, -88, -90, -11,
778
+ -95, -69, -70, -94, -13, -14, -60, -15, -16, -17,
779
+ -21, -25, -28, -31, -34, -40, -104, -43, -46, -35,
780
+ -50, -104, -53, -55, -56, -103, -36, -63, -104, -66,
781
+ -68, -37, -38, -39, -5, -1, -72, -92, -74, -104,
782
+ -104, -12, -96, -97, -98, -57, -104, -104, -104, -104,
783
+ -104, -104, -104, -44, -41, -48, -47, -104, -54, -51,
784
+ -65, -67, -64, -104, -104, -79, -104, -104, -61, -18,
785
+ -22, -26, -29, -32, -42, -45, -49, -52, -6, -93,
786
+ -75, -76, -84, -89, -58, -104, -104, -104, -104, -104,
787
+ -104, -79, -78, -88, -81, -104, -104, -104, -62, -19,
788
+ -23, -104, -104, -104, -77, -80, -104, -87, -85, -59,
789
+ -27, -99, -101, -102, -30, -33, -82, -104, -100, -104,
790
+ -88, -88, -86, -83 ]
791
+
792
+ racc_goto_table = [
793
+ 79, 43, 62, 60, 55, 121, 93, 101, 34, 66,
794
+ 71, 72, 73, 58, 1, 70, 70, 70, 70, 100,
795
+ 2, 102, 4, 158, 100, 100, 100, 158, 158, 33,
796
+ 75, 144, 76, 5, 31, 94, 98, 62, 99, 103,
797
+ 101, 10, 101, 58, 58, 93, 45, 47, 48, 150,
798
+ 154, 155, 11, 40, 70, 70, 70, 81, 87, 70,
799
+ 70, 70, 126, 88, 127, 93, 89, 128, 90, 129,
800
+ 91, 114, 130, 62, 117, 98, 54, 59, 95, 115,
801
+ 58, 107, 58, 137, 86, 125, 120, 146, 70, 159,
802
+ 70, 136, 157, 98, 104, nil, 145, 133, nil, nil,
803
+ nil, nil, 58, nil, nil, nil, nil, nil, nil, nil,
804
+ nil, 147, nil, nil, nil, nil, nil, nil, nil, nil,
805
+ 133, nil, nil, 162, 163 ]
806
+
807
+ racc_goto_check = [
808
+ 46, 31, 35, 34, 29, 48, 30, 42, 43, 28,
809
+ 28, 28, 28, 31, 1, 31, 31, 31, 31, 41,
810
+ 2, 41, 3, 54, 41, 41, 41, 54, 54, 4,
811
+ 5, 48, 43, 6, 7, 29, 35, 35, 34, 8,
812
+ 42, 9, 42, 31, 31, 30, 13, 13, 13, 17,
813
+ 17, 17, 10, 11, 31, 31, 31, 12, 14, 31,
814
+ 31, 31, 15, 18, 19, 30, 20, 21, 22, 23,
815
+ 24, 29, 25, 35, 34, 35, 26, 27, 32, 33,
816
+ 31, 37, 31, 38, 39, 40, 47, 49, 31, 50,
817
+ 31, 51, 52, 35, 53, nil, 46, 35, nil, nil,
818
+ nil, nil, 31, nil, nil, nil, nil, nil, nil, nil,
819
+ nil, 35, nil, nil, nil, nil, nil, nil, nil, nil,
820
+ 35, nil, nil, 46, 46 ]
821
+
822
+ racc_goto_pointer = [
823
+ nil, 14, 20, 20, 20, -3, 31, 28, -35, 37,
824
+ 48, 40, 17, 31, 9, -47, nil, -92, 13, -46,
825
+ 15, -44, 16, -43, 17, -41, 51, 51, -18, -21,
826
+ -49, -12, 20, -16, -23, -24, nil, -4, -41, 38,
827
+ -23, -47, -60, -1, nil, nil, -37, -19, -100, -47,
828
+ -67, -31, -56, 17, -127 ]
829
+
830
+ racc_goto_default = [
831
+ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
832
+ 36, nil, nil, nil, nil, nil, 21, nil, nil, nil,
833
+ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
834
+ 57, 63, nil, nil, nil, 152, 64, nil, nil, nil,
835
+ nil, 67, 69, nil, 35, 37, nil, nil, nil, nil,
836
+ nil, nil, nil, nil, 151 ]
837
+
838
+ racc_reduce_table = [
839
+ 0, 0, :racc_error,
840
+ 5, 39, :_reduce_none,
841
+ 0, 40, :_reduce_none,
842
+ 2, 40, :_reduce_none,
843
+ 0, 45, :_reduce_4,
844
+ 0, 46, :_reduce_5,
845
+ 5, 44, :_reduce_6,
846
+ 2, 44, :_reduce_none,
847
+ 0, 41, :_reduce_8,
848
+ 2, 41, :_reduce_none,
849
+ 1, 47, :_reduce_none,
850
+ 2, 47, :_reduce_11,
851
+ 3, 47, :_reduce_none,
852
+ 2, 47, :_reduce_none,
853
+ 2, 47, :_reduce_none,
854
+ 2, 47, :_reduce_15,
855
+ 2, 47, :_reduce_16,
856
+ 0, 52, :_reduce_17,
857
+ 0, 53, :_reduce_18,
858
+ 6, 47, :_reduce_19,
859
+ 1, 47, :_reduce_none,
860
+ 0, 56, :_reduce_21,
861
+ 0, 57, :_reduce_22,
862
+ 6, 48, :_reduce_23,
863
+ 1, 48, :_reduce_none,
864
+ 0, 58, :_reduce_25,
865
+ 0, 59, :_reduce_26,
866
+ 7, 48, :_reduce_none,
867
+ 0, 60, :_reduce_28,
868
+ 0, 61, :_reduce_29,
869
+ 7, 48, :_reduce_30,
870
+ 0, 62, :_reduce_31,
871
+ 0, 63, :_reduce_32,
872
+ 7, 48, :_reduce_33,
873
+ 2, 54, :_reduce_none,
874
+ 2, 54, :_reduce_35,
875
+ 2, 54, :_reduce_36,
876
+ 2, 54, :_reduce_37,
877
+ 2, 54, :_reduce_38,
878
+ 2, 54, :_reduce_39,
879
+ 1, 64, :_reduce_40,
880
+ 2, 64, :_reduce_41,
881
+ 3, 64, :_reduce_42,
882
+ 1, 67, :_reduce_43,
883
+ 2, 67, :_reduce_44,
884
+ 3, 68, :_reduce_45,
885
+ 0, 70, :_reduce_none,
886
+ 1, 70, :_reduce_none,
887
+ 0, 71, :_reduce_none,
888
+ 1, 71, :_reduce_none,
889
+ 1, 65, :_reduce_50,
890
+ 2, 65, :_reduce_51,
891
+ 3, 65, :_reduce_52,
892
+ 1, 72, :_reduce_53,
893
+ 2, 72, :_reduce_54,
894
+ 1, 73, :_reduce_none,
895
+ 1, 73, :_reduce_none,
896
+ 0, 75, :_reduce_57,
897
+ 0, 76, :_reduce_58,
898
+ 6, 51, :_reduce_59,
899
+ 0, 77, :_reduce_60,
900
+ 0, 78, :_reduce_61,
901
+ 5, 51, :_reduce_62,
902
+ 1, 66, :_reduce_63,
903
+ 2, 66, :_reduce_64,
904
+ 2, 66, :_reduce_65,
905
+ 1, 79, :_reduce_66,
906
+ 2, 79, :_reduce_67,
907
+ 1, 80, :_reduce_none,
908
+ 1, 69, :_reduce_69,
909
+ 1, 69, :_reduce_70,
910
+ 1, 42, :_reduce_none,
911
+ 2, 42, :_reduce_none,
912
+ 1, 81, :_reduce_none,
913
+ 2, 81, :_reduce_none,
914
+ 4, 82, :_reduce_75,
915
+ 1, 85, :_reduce_76,
916
+ 3, 85, :_reduce_77,
917
+ 2, 85, :_reduce_none,
918
+ 0, 86, :_reduce_79,
919
+ 3, 86, :_reduce_80,
920
+ 0, 87, :_reduce_81,
921
+ 0, 88, :_reduce_82,
922
+ 7, 86, :_reduce_83,
923
+ 0, 89, :_reduce_84,
924
+ 0, 90, :_reduce_85,
925
+ 6, 86, :_reduce_86,
926
+ 3, 86, :_reduce_87,
927
+ 0, 84, :_reduce_none,
928
+ 3, 84, :_reduce_89,
929
+ 1, 83, :_reduce_none,
930
+ 0, 43, :_reduce_none,
931
+ 0, 91, :_reduce_92,
932
+ 3, 43, :_reduce_93,
933
+ 1, 49, :_reduce_none,
934
+ 0, 50, :_reduce_none,
935
+ 1, 50, :_reduce_none,
936
+ 1, 50, :_reduce_none,
937
+ 1, 50, :_reduce_none,
938
+ 1, 55, :_reduce_99,
939
+ 2, 55, :_reduce_100,
940
+ 1, 92, :_reduce_none,
941
+ 1, 92, :_reduce_none,
942
+ 1, 74, :_reduce_103 ]
943
+
944
+ racc_reduce_n = 104
945
+
946
+ racc_shift_n = 164
947
+
948
+ racc_token_table = {
949
+ false => 0,
950
+ :error => 1,
951
+ :C_DECLARATION => 2,
952
+ :CHARACTER => 3,
953
+ :IDENT_COLON => 4,
954
+ :IDENTIFIER => 5,
955
+ :INTEGER => 6,
956
+ :STRING => 7,
957
+ :TAG => 8,
958
+ "%%" => 9,
959
+ "%{" => 10,
960
+ "%}" => 11,
961
+ "%require" => 12,
962
+ "%expect" => 13,
963
+ "%define" => 14,
964
+ "%param" => 15,
965
+ "%lex-param" => 16,
966
+ "%parse-param" => 17,
967
+ "%initial-action" => 18,
968
+ "{" => 19,
969
+ "}" => 20,
970
+ ";" => 21,
971
+ "%union" => 22,
972
+ "%destructor" => 23,
973
+ "%printer" => 24,
974
+ "%error-token" => 25,
975
+ "%token" => 26,
976
+ "%type" => 27,
977
+ "%left" => 28,
978
+ "%right" => 29,
979
+ "%precedence" => 30,
980
+ "%nonassoc" => 31,
981
+ ":" => 32,
982
+ "|" => 33,
983
+ "%prec" => 34,
984
+ "[" => 35,
985
+ "]" => 36,
986
+ "{...}" => 37 }
987
+
988
+ racc_nt_base = 38
989
+
990
+ racc_use_result_var = true
991
+
992
+ Racc_arg = [
993
+ racc_action_table,
994
+ racc_action_check,
995
+ racc_action_default,
996
+ racc_action_pointer,
997
+ racc_goto_table,
998
+ racc_goto_check,
999
+ racc_goto_default,
1000
+ racc_goto_pointer,
1001
+ racc_nt_base,
1002
+ racc_reduce_table,
1003
+ racc_token_table,
1004
+ racc_shift_n,
1005
+ racc_reduce_n,
1006
+ racc_use_result_var ]
1007
+ Ractor.make_shareable(Racc_arg) if defined?(Ractor)
1008
+
1009
+ Racc_token_to_s_table = [
1010
+ "$end",
1011
+ "error",
1012
+ "C_DECLARATION",
1013
+ "CHARACTER",
1014
+ "IDENT_COLON",
1015
+ "IDENTIFIER",
1016
+ "INTEGER",
1017
+ "STRING",
1018
+ "TAG",
1019
+ "\"%%\"",
1020
+ "\"%{\"",
1021
+ "\"%}\"",
1022
+ "\"%require\"",
1023
+ "\"%expect\"",
1024
+ "\"%define\"",
1025
+ "\"%param\"",
1026
+ "\"%lex-param\"",
1027
+ "\"%parse-param\"",
1028
+ "\"%initial-action\"",
1029
+ "\"{\"",
1030
+ "\"}\"",
1031
+ "\";\"",
1032
+ "\"%union\"",
1033
+ "\"%destructor\"",
1034
+ "\"%printer\"",
1035
+ "\"%error-token\"",
1036
+ "\"%token\"",
1037
+ "\"%type\"",
1038
+ "\"%left\"",
1039
+ "\"%right\"",
1040
+ "\"%precedence\"",
1041
+ "\"%nonassoc\"",
1042
+ "\":\"",
1043
+ "\"|\"",
1044
+ "\"%prec\"",
1045
+ "\"[\"",
1046
+ "\"]\"",
1047
+ "\"{...}\"",
1048
+ "$start",
1049
+ "input",
1050
+ "prologue_declarations",
1051
+ "bison_declarations",
1052
+ "grammar",
1053
+ "epilogue_opt",
1054
+ "prologue_declaration",
1055
+ "@1",
1056
+ "@2",
1057
+ "bison_declaration",
1058
+ "grammar_declaration",
1059
+ "variable",
1060
+ "value",
1061
+ "params",
1062
+ "@3",
1063
+ "@4",
1064
+ "symbol_declaration",
1065
+ "generic_symlist",
1066
+ "@5",
1067
+ "@6",
1068
+ "@7",
1069
+ "@8",
1070
+ "@9",
1071
+ "@10",
1072
+ "@11",
1073
+ "@12",
1074
+ "token_declarations",
1075
+ "symbol_declarations",
1076
+ "token_declarations_for_precedence",
1077
+ "token_declaration_list",
1078
+ "token_declaration",
1079
+ "id",
1080
+ "int_opt",
1081
+ "alias",
1082
+ "symbol_declaration_list",
1083
+ "symbol",
1084
+ "string_as_id",
1085
+ "@13",
1086
+ "@14",
1087
+ "@15",
1088
+ "@16",
1089
+ "token_declaration_list_for_precedence",
1090
+ "token_declaration_for_precedence",
1091
+ "rules_or_grammar_declaration",
1092
+ "rules",
1093
+ "id_colon",
1094
+ "named_ref_opt",
1095
+ "rhs_list",
1096
+ "rhs",
1097
+ "@17",
1098
+ "@18",
1099
+ "@19",
1100
+ "@20",
1101
+ "@21",
1102
+ "generic_symlist_item" ]
1103
+ Ractor.make_shareable(Racc_token_to_s_table) if defined?(Ractor)
1104
+
1105
+ Racc_debug_parser = false
1106
+
1107
+ ##### State transition tables end #####
1108
+
1109
+ # reduce 0 omitted
1110
+
1111
+ # reduce 1 omitted
1112
+
1113
+ # reduce 2 omitted
1114
+
1115
+ # reduce 3 omitted
1116
+
1117
+ module_eval(<<'.,.,', 'parser.y', 10)
1118
+ def _reduce_4(val, _values, result)
1119
+ @lexer.status = :c_declaration
1120
+ @lexer.end_symbol = '%}'
1121
+ @grammar.prologue_first_lineno = @lexer.line
1122
+
1123
+ result
1124
+ end
1125
+ .,.,
1126
+
1127
+ module_eval(<<'.,.,', 'parser.y', 16)
1128
+ def _reduce_5(val, _values, result)
1129
+ @lexer.status = :initial
1130
+ @lexer.end_symbol = nil
1131
+
1132
+ result
1133
+ end
1134
+ .,.,
1135
+
1136
+ module_eval(<<'.,.,', 'parser.y', 21)
1137
+ def _reduce_6(val, _values, result)
1138
+ @grammar.prologue = val[2].s_value
1139
+
1140
+ result
1141
+ end
1142
+ .,.,
1143
+
1144
+ # reduce 7 omitted
1145
+
1146
+ module_eval(<<'.,.,', 'parser.y', 25)
1147
+ def _reduce_8(val, _values, result)
1148
+ result = ""
1149
+ result
1150
+ end
1151
+ .,.,
1152
+
1153
+ # reduce 9 omitted
1154
+
1155
+ # reduce 10 omitted
1156
+
1157
+ module_eval(<<'.,.,', 'parser.y', 29)
1158
+ def _reduce_11(val, _values, result)
1159
+ @grammar.expect = val[1]
1160
+ result
1161
+ end
1162
+ .,.,
1163
+
1164
+ # reduce 12 omitted
1165
+
1166
+ # reduce 13 omitted
1167
+
1168
+ # reduce 14 omitted
1169
+
1170
+ module_eval(<<'.,.,', 'parser.y', 35)
1171
+ def _reduce_15(val, _values, result)
1172
+ val[1].each {|token|
1173
+ token.references = []
1174
+ @grammar.lex_param = @grammar.build_code(:lex_param, token).token_code.s_value
1175
+ }
1176
+
1177
+ result
1178
+ end
1179
+ .,.,
1180
+
1181
+ module_eval(<<'.,.,', 'parser.y', 42)
1182
+ def _reduce_16(val, _values, result)
1183
+ val[1].each {|token|
1184
+ token.references = []
1185
+ @grammar.parse_param = @grammar.build_code(:parse_param, token).token_code.s_value
1186
+ }
1187
+
1188
+ result
1189
+ end
1190
+ .,.,
1191
+
1192
+ module_eval(<<'.,.,', 'parser.y', 49)
1193
+ def _reduce_17(val, _values, result)
1194
+ @lexer.status = :c_declaration
1195
+ @lexer.end_symbol = '}'
1196
+
1197
+ result
1198
+ end
1199
+ .,.,
1200
+
1201
+ module_eval(<<'.,.,', 'parser.y', 54)
1202
+ def _reduce_18(val, _values, result)
1203
+ @lexer.status = :initial
1204
+ @lexer.end_symbol = nil
1205
+
1206
+ result
1207
+ end
1208
+ .,.,
1209
+
1210
+ module_eval(<<'.,.,', 'parser.y', 59)
1211
+ def _reduce_19(val, _values, result)
1212
+ @grammar.initial_action = @grammar.build_code(:initial_action, val[3])
1213
+
1214
+ result
1215
+ end
1216
+ .,.,
1217
+
1218
+ # reduce 20 omitted
1219
+
1220
+ module_eval(<<'.,.,', 'parser.y', 65)
1221
+ def _reduce_21(val, _values, result)
1222
+ @lexer.status = :c_declaration
1223
+ @lexer.end_symbol = '}'
1224
+
1225
+ result
1226
+ end
1227
+ .,.,
1228
+
1229
+ module_eval(<<'.,.,', 'parser.y', 70)
1230
+ def _reduce_22(val, _values, result)
1231
+ @lexer.status = :initial
1232
+ @lexer.end_symbol = nil
1233
+
1234
+ result
292
1235
  end
1236
+ .,.,
1237
+
1238
+ module_eval(<<'.,.,', 'parser.y', 75)
1239
+ def _reduce_23(val, _values, result)
1240
+ @grammar.set_union(@grammar.build_code(:union, val[3]), val[3].line)
1241
+
1242
+ result
1243
+ end
1244
+ .,.,
1245
+
1246
+ # reduce 24 omitted
1247
+
1248
+ module_eval(<<'.,.,', 'parser.y', 80)
1249
+ def _reduce_25(val, _values, result)
1250
+ @lexer.status = :c_declaration
1251
+ @lexer.end_symbol = '}'
1252
+
1253
+ result
1254
+ end
1255
+ .,.,
1256
+
1257
+ module_eval(<<'.,.,', 'parser.y', 85)
1258
+ def _reduce_26(val, _values, result)
1259
+ @lexer.status = :initial
1260
+ @lexer.end_symbol = nil
1261
+
1262
+ result
1263
+ end
1264
+ .,.,
1265
+
1266
+ # reduce 27 omitted
1267
+
1268
+ module_eval(<<'.,.,', 'parser.y', 91)
1269
+ def _reduce_28(val, _values, result)
1270
+ @lexer.status = :c_declaration
1271
+ @lexer.end_symbol = '}'
1272
+
1273
+ result
1274
+ end
1275
+ .,.,
1276
+
1277
+ module_eval(<<'.,.,', 'parser.y', 96)
1278
+ def _reduce_29(val, _values, result)
1279
+ @lexer.status = :initial
1280
+ @lexer.end_symbol = nil
1281
+
1282
+ result
1283
+ end
1284
+ .,.,
1285
+
1286
+ module_eval(<<'.,.,', 'parser.y', 101)
1287
+ def _reduce_30(val, _values, result)
1288
+ @grammar.add_printer(ident_or_tags: val[6], code: @grammar.build_code(:printer, val[3]), lineno: val[3].line)
1289
+
1290
+ result
1291
+ end
1292
+ .,.,
1293
+
1294
+ module_eval(<<'.,.,', 'parser.y', 105)
1295
+ def _reduce_31(val, _values, result)
1296
+ @lexer.status = :c_declaration
1297
+ @lexer.end_symbol = '}'
1298
+
1299
+ result
1300
+ end
1301
+ .,.,
1302
+
1303
+ module_eval(<<'.,.,', 'parser.y', 110)
1304
+ def _reduce_32(val, _values, result)
1305
+ @lexer.status = :initial
1306
+ @lexer.end_symbol = nil
1307
+
1308
+ result
1309
+ end
1310
+ .,.,
1311
+
1312
+ module_eval(<<'.,.,', 'parser.y', 115)
1313
+ def _reduce_33(val, _values, result)
1314
+ @grammar.add_error_token(ident_or_tags: val[6], code: @grammar.build_code(:error_token, val[3]), lineno: val[3].line)
1315
+
1316
+ result
1317
+ end
1318
+ .,.,
1319
+
1320
+ # reduce 34 omitted
1321
+
1322
+ module_eval(<<'.,.,', 'parser.y', 121)
1323
+ def _reduce_35(val, _values, result)
1324
+ val[1].each {|hash|
1325
+ hash[:tokens].each {|id|
1326
+ @grammar.add_type(id: id, tag: hash[:tag])
1327
+ }
1328
+ }
1329
+
1330
+ result
1331
+ end
1332
+ .,.,
1333
+
1334
+ module_eval(<<'.,.,', 'parser.y', 129)
1335
+ def _reduce_36(val, _values, result)
1336
+ val[1].each {|hash|
1337
+ hash[:tokens].each {|id|
1338
+ sym = @grammar.add_term(id: id)
1339
+ @grammar.add_left(sym, @precedence_number)
1340
+ }
1341
+ }
1342
+ @precedence_number += 1
1343
+
1344
+ result
1345
+ end
1346
+ .,.,
1347
+
1348
+ module_eval(<<'.,.,', 'parser.y', 139)
1349
+ def _reduce_37(val, _values, result)
1350
+ val[1].each {|hash|
1351
+ hash[:tokens].each {|id|
1352
+ sym = @grammar.add_term(id: id)
1353
+ @grammar.add_right(sym, @precedence_number)
1354
+ }
1355
+ }
1356
+ @precedence_number += 1
1357
+
1358
+ result
1359
+ end
1360
+ .,.,
1361
+
1362
+ module_eval(<<'.,.,', 'parser.y', 149)
1363
+ def _reduce_38(val, _values, result)
1364
+ val[1].each {|hash|
1365
+ hash[:tokens].each {|id|
1366
+ sym = @grammar.add_term(id: id)
1367
+ @grammar.add_precedence(sym, @precedence_number)
1368
+ }
1369
+ }
1370
+ @precedence_number += 1
1371
+
1372
+ result
1373
+ end
1374
+ .,.,
1375
+
1376
+ module_eval(<<'.,.,', 'parser.y', 159)
1377
+ def _reduce_39(val, _values, result)
1378
+ val[1].each {|hash|
1379
+ hash[:tokens].each {|id|
1380
+ sym = @grammar.add_term(id: id)
1381
+ @grammar.add_nonassoc(sym, @precedence_number)
1382
+ }
1383
+ }
1384
+ @precedence_number += 1
1385
+
1386
+ result
1387
+ end
1388
+ .,.,
1389
+
1390
+ module_eval(<<'.,.,', 'parser.y', 170)
1391
+ def _reduce_40(val, _values, result)
1392
+ val[0].each {|token_declaration|
1393
+ @grammar.add_term(id: token_declaration[0], alias_name: token_declaration[2], token_id: token_declaration[1], tag: nil, replace: true)
1394
+ }
1395
+
1396
+ result
1397
+ end
1398
+ .,.,
1399
+
1400
+ module_eval(<<'.,.,', 'parser.y', 176)
1401
+ def _reduce_41(val, _values, result)
1402
+ val[1].each {|token_declaration|
1403
+ @grammar.add_term(id: token_declaration[0], alias_name: token_declaration[2], token_id: token_declaration[1], tag: val[0], replace: true)
1404
+ }
1405
+
1406
+ result
1407
+ end
1408
+ .,.,
1409
+
1410
+ module_eval(<<'.,.,', 'parser.y', 182)
1411
+ def _reduce_42(val, _values, result)
1412
+ val[2].each {|token_declaration|
1413
+ @grammar.add_term(id: token_declaration[0], alias_name: token_declaration[2], token_id: token_declaration[1], tag: val[1], replace: true)
1414
+ }
1415
+
1416
+ result
1417
+ end
1418
+ .,.,
1419
+
1420
+ module_eval(<<'.,.,', 'parser.y', 187)
1421
+ def _reduce_43(val, _values, result)
1422
+ result = [val[0]]
1423
+ result
1424
+ end
1425
+ .,.,
1426
+
1427
+ module_eval(<<'.,.,', 'parser.y', 188)
1428
+ def _reduce_44(val, _values, result)
1429
+ result = val[0].append(val[1])
1430
+ result
1431
+ end
1432
+ .,.,
1433
+
1434
+ module_eval(<<'.,.,', 'parser.y', 190)
1435
+ def _reduce_45(val, _values, result)
1436
+ result = val
1437
+ result
1438
+ end
1439
+ .,.,
1440
+
1441
+ # reduce 46 omitted
1442
+
1443
+ # reduce 47 omitted
1444
+
1445
+ # reduce 48 omitted
1446
+
1447
+ # reduce 49 omitted
1448
+
1449
+ module_eval(<<'.,.,', 'parser.y', 200)
1450
+ def _reduce_50(val, _values, result)
1451
+ result = [{tag: nil, tokens: val[0]}]
1452
+
1453
+ result
1454
+ end
1455
+ .,.,
1456
+
1457
+ module_eval(<<'.,.,', 'parser.y', 204)
1458
+ def _reduce_51(val, _values, result)
1459
+ result = [{tag: val[0], tokens: val[1]}]
1460
+
1461
+ result
1462
+ end
1463
+ .,.,
1464
+
1465
+ module_eval(<<'.,.,', 'parser.y', 208)
1466
+ def _reduce_52(val, _values, result)
1467
+ result = val[0].append({tag: val[1], tokens: val[2]})
1468
+
1469
+ result
1470
+ end
1471
+ .,.,
1472
+
1473
+ module_eval(<<'.,.,', 'parser.y', 211)
1474
+ def _reduce_53(val, _values, result)
1475
+ result = [val[0]]
1476
+ result
1477
+ end
1478
+ .,.,
1479
+
1480
+ module_eval(<<'.,.,', 'parser.y', 212)
1481
+ def _reduce_54(val, _values, result)
1482
+ result = val[0].append(val[1])
1483
+ result
1484
+ end
1485
+ .,.,
1486
+
1487
+ # reduce 55 omitted
1488
+
1489
+ # reduce 56 omitted
1490
+
1491
+ module_eval(<<'.,.,', 'parser.y', 219)
1492
+ def _reduce_57(val, _values, result)
1493
+ @lexer.status = :c_declaration
1494
+ @lexer.end_symbol = '}'
1495
+
1496
+ result
1497
+ end
1498
+ .,.,
1499
+
1500
+ module_eval(<<'.,.,', 'parser.y', 224)
1501
+ def _reduce_58(val, _values, result)
1502
+ @lexer.status = :initial
1503
+ @lexer.end_symbol = nil
1504
+
1505
+ result
1506
+ end
1507
+ .,.,
1508
+
1509
+ module_eval(<<'.,.,', 'parser.y', 229)
1510
+ def _reduce_59(val, _values, result)
1511
+ result = val[0].append(val[3])
1512
+
1513
+ result
1514
+ end
1515
+ .,.,
1516
+
1517
+ module_eval(<<'.,.,', 'parser.y', 233)
1518
+ def _reduce_60(val, _values, result)
1519
+ @lexer.status = :c_declaration
1520
+ @lexer.end_symbol = '}'
1521
+
1522
+ result
1523
+ end
1524
+ .,.,
1525
+
1526
+ module_eval(<<'.,.,', 'parser.y', 238)
1527
+ def _reduce_61(val, _values, result)
1528
+ @lexer.status = :initial
1529
+ @lexer.end_symbol = nil
1530
+
1531
+ result
1532
+ end
1533
+ .,.,
1534
+
1535
+ module_eval(<<'.,.,', 'parser.y', 243)
1536
+ def _reduce_62(val, _values, result)
1537
+ result = [val[2]]
1538
+
1539
+ result
1540
+ end
1541
+ .,.,
1542
+
1543
+ module_eval(<<'.,.,', 'parser.y', 248)
1544
+ def _reduce_63(val, _values, result)
1545
+ result = [{tag: nil, tokens: val[0]}]
1546
+
1547
+ result
1548
+ end
1549
+ .,.,
1550
+
1551
+ module_eval(<<'.,.,', 'parser.y', 252)
1552
+ def _reduce_64(val, _values, result)
1553
+ result = [{tag: val[0], tokens: val[1]}]
1554
+
1555
+ result
1556
+ end
1557
+ .,.,
1558
+
1559
+ module_eval(<<'.,.,', 'parser.y', 256)
1560
+ def _reduce_65(val, _values, result)
1561
+ result = val[0].append({tag: nil, tokens: val[1]})
1562
+
1563
+ result
1564
+ end
1565
+ .,.,
1566
+
1567
+ module_eval(<<'.,.,', 'parser.y', 259)
1568
+ def _reduce_66(val, _values, result)
1569
+ result = [val[0]]
1570
+ result
1571
+ end
1572
+ .,.,
1573
+
1574
+ module_eval(<<'.,.,', 'parser.y', 260)
1575
+ def _reduce_67(val, _values, result)
1576
+ result = val[0].append(val[1])
1577
+ result
1578
+ end
1579
+ .,.,
1580
+
1581
+ # reduce 68 omitted
1582
+
1583
+ module_eval(<<'.,.,', 'parser.y', 264)
1584
+ def _reduce_69(val, _values, result)
1585
+ raise "Ident after %prec" if @prec_seen
1586
+ result
1587
+ end
1588
+ .,.,
1589
+
1590
+ module_eval(<<'.,.,', 'parser.y', 265)
1591
+ def _reduce_70(val, _values, result)
1592
+ raise "Char after %prec" if @prec_seen
1593
+ result
1594
+ end
1595
+ .,.,
1596
+
1597
+ # reduce 71 omitted
1598
+
1599
+ # reduce 72 omitted
1600
+
1601
+ # reduce 73 omitted
1602
+
1603
+ # reduce 74 omitted
1604
+
1605
+ module_eval(<<'.,.,', 'parser.y', 275)
1606
+ def _reduce_75(val, _values, result)
1607
+ lhs = val[0]
1608
+ lhs.alias = val[1]
1609
+ val[3].each {|hash|
1610
+ @grammar.add_rule(lhs: lhs, rhs: hash[:rhs], lineno: hash[:lineno])
1611
+ }
1612
+
1613
+ result
1614
+ end
1615
+ .,.,
1616
+
1617
+ module_eval(<<'.,.,', 'parser.y', 284)
1618
+ def _reduce_76(val, _values, result)
1619
+ result = [{rhs: val[0], lineno: val[0].first&.line || @lexer.line - 1}]
1620
+
1621
+ result
1622
+ end
1623
+ .,.,
1624
+
1625
+ module_eval(<<'.,.,', 'parser.y', 288)
1626
+ def _reduce_77(val, _values, result)
1627
+ result = val[0].append({rhs: val[2], lineno: val[2].first&.line || @lexer.line - 1})
1628
+
1629
+ result
1630
+ end
1631
+ .,.,
1632
+
1633
+ # reduce 78 omitted
1634
+
1635
+ module_eval(<<'.,.,', 'parser.y', 294)
1636
+ def _reduce_79(val, _values, result)
1637
+ result = []
1638
+ @prec_seen = false
1639
+ @code_after_prec = false
1640
+
1641
+ result
1642
+ end
1643
+ .,.,
1644
+
1645
+ module_eval(<<'.,.,', 'parser.y', 300)
1646
+ def _reduce_80(val, _values, result)
1647
+ token = val[1]
1648
+ token.alias = val[2]
1649
+ result = val[0].append(token)
1650
+
1651
+ result
1652
+ end
1653
+ .,.,
1654
+
1655
+ module_eval(<<'.,.,', 'parser.y', 306)
1656
+ def _reduce_81(val, _values, result)
1657
+ if @prec_seen
1658
+ raise "Multiple User_code after %prec" if @code_after_prec
1659
+ @code_after_prec = true
1660
+ end
1661
+ @lexer.status = :c_declaration
1662
+ @lexer.end_symbol = '}'
1663
+
1664
+ result
1665
+ end
1666
+ .,.,
1667
+
1668
+ module_eval(<<'.,.,', 'parser.y', 315)
1669
+ def _reduce_82(val, _values, result)
1670
+ @lexer.status = :initial
1671
+ @lexer.end_symbol = nil
1672
+
1673
+ result
1674
+ end
1675
+ .,.,
1676
+
1677
+ module_eval(<<'.,.,', 'parser.y', 320)
1678
+ def _reduce_83(val, _values, result)
1679
+ token = val[3]
1680
+ token.alias = val[6]
1681
+ result = val[0].append(token)
1682
+
1683
+ result
1684
+ end
1685
+ .,.,
1686
+
1687
+ module_eval(<<'.,.,', 'parser.y', 326)
1688
+ def _reduce_84(val, _values, result)
1689
+ if @prec_seen
1690
+ raise "Multiple User_code after %prec" if @code_after_prec
1691
+ @code_after_prec = true
1692
+ end
1693
+ @lexer.status = :c_declaration
1694
+ @lexer.end_symbol = '}'
1695
+
1696
+ result
1697
+ end
1698
+ .,.,
1699
+
1700
+ module_eval(<<'.,.,', 'parser.y', 335)
1701
+ def _reduce_85(val, _values, result)
1702
+ @lexer.status = :initial
1703
+ @lexer.end_symbol = nil
1704
+
1705
+ result
1706
+ end
1707
+ .,.,
1708
+
1709
+ module_eval(<<'.,.,', 'parser.y', 340)
1710
+ def _reduce_86(val, _values, result)
1711
+ token = val[2]
1712
+ token.alias = val[5]
1713
+ result = [token]
1714
+
1715
+ result
1716
+ end
1717
+ .,.,
1718
+
1719
+ module_eval(<<'.,.,', 'parser.y', 346)
1720
+ def _reduce_87(val, _values, result)
1721
+ sym = @grammar.find_symbol_by_id!(val[2])
1722
+ result = val[0].append(sym)
1723
+ @prec_seen = true
1724
+
1725
+ result
1726
+ end
1727
+ .,.,
1728
+
1729
+ # reduce 88 omitted
1730
+
1731
+ module_eval(<<'.,.,', 'parser.y', 352)
1732
+ def _reduce_89(val, _values, result)
1733
+ result = val[1].s_value
1734
+ result
1735
+ end
1736
+ .,.,
1737
+
1738
+ # reduce 90 omitted
1739
+
1740
+ # reduce 91 omitted
1741
+
1742
+ module_eval(<<'.,.,', 'parser.y', 359)
1743
+ def _reduce_92(val, _values, result)
1744
+ @lexer.status = :c_declaration
1745
+ @lexer.end_symbol = '\Z'
1746
+ @grammar.epilogue_first_lineno = @lexer.line + 1
1747
+
1748
+ result
1749
+ end
1750
+ .,.,
1751
+
1752
+ module_eval(<<'.,.,', 'parser.y', 365)
1753
+ def _reduce_93(val, _values, result)
1754
+ @lexer.status = :initial
1755
+ @lexer.end_symbol = nil
1756
+ @grammar.epilogue = val[2].s_value
1757
+
1758
+ result
1759
+ end
1760
+ .,.,
1761
+
1762
+ # reduce 94 omitted
1763
+
1764
+ # reduce 95 omitted
1765
+
1766
+ # reduce 96 omitted
1767
+
1768
+ # reduce 97 omitted
1769
+
1770
+ # reduce 98 omitted
1771
+
1772
+ module_eval(<<'.,.,', 'parser.y', 377)
1773
+ def _reduce_99(val, _values, result)
1774
+ result = [val[0]]
1775
+ result
1776
+ end
1777
+ .,.,
1778
+
1779
+ module_eval(<<'.,.,', 'parser.y', 378)
1780
+ def _reduce_100(val, _values, result)
1781
+ result = val[0].append(val[1])
1782
+ result
1783
+ end
1784
+ .,.,
1785
+
1786
+ # reduce 101 omitted
1787
+
1788
+ # reduce 102 omitted
1789
+
1790
+ module_eval(<<'.,.,', 'parser.y', 383)
1791
+ def _reduce_103(val, _values, result)
1792
+ result = Lrama::Lexer::Token.new(type: Lrama::Lexer::Token::Ident, s_value: val[0])
1793
+ result
1794
+ end
1795
+ .,.,
1796
+
1797
+ def _reduce_none(val, _values, result)
1798
+ val[0]
293
1799
  end
1800
+
1801
+ end # class Parser
1802
+ end # module Lrama