| Class | Racc::Parser |
| In: |
lib/racc/parser.rb
|
| Parent: | Object |
| Racc_Runtime_Version | = | '1.4.5' | ||
| Racc_Runtime_Revision | = | '$originalRevision: 1.8 $'.split[1] | ||
| Racc_Runtime_Core_Version_R | = | '1.4.5' | ||
| Racc_Runtime_Core_Revision_R | = | '$originalRevision: 1.8 $'.split[1] | ||
| Racc_Runtime_Core_Revision_C | = | Racc_Runtime_Core_Id_C.split[2] | Racc_Runtime_Core_Version_C = (defined in extention) | |
| Racc_Main_Parsing_Routine | = | :_racc_do_parse_c | ||
| Racc_YY_Parse_Method | = | :_racc_yyparse_c | ||
| Racc_Runtime_Core_Version | = | Racc_Runtime_Core_Version_C | ||
| Racc_Runtime_Core_Revision | = | Racc_Runtime_Core_Revision_C | ||
| Racc_Runtime_Type | = | 'c' | ||
| Racc_Main_Parsing_Routine | = | :_racc_do_parse_rb | ||
| Racc_YY_Parse_Method | = | :_racc_yyparse_rb | ||
| Racc_Runtime_Core_Version | = | Racc_Runtime_Core_Version_R | ||
| Racc_Runtime_Core_Revision | = | Racc_Runtime_Core_Revision_R | ||
| Racc_Runtime_Type | = | 'ruby' |
# File lib/racc/parser.rb, line 106
106: def _racc_do_parse_rb(arg, in_debug)
107: action_table, action_check, action_default, action_pointer,
108: goto_table, goto_check, goto_default, goto_pointer,
109: nt_base, reduce_table, token_table, shift_n,
110: reduce_n, use_result, * = arg
111:
112: _racc_init_sysvars
113: tok = act = i = nil
114: nerr = 0
115:
116: catch(:racc_end_parse) {
117: while true
118: if i = action_pointer[@racc_state[-1]]
119: if @racc_read_next
120: if @racc_t != 0 # not EOF
121: tok, @racc_val = next_token()
122: unless tok # EOF
123: @racc_t = 0
124: else
125: @racc_t = (token_table[tok] or 1) # error token
126: end
127: racc_read_token(@racc_t, tok, @racc_val) if @yydebug
128: @racc_read_next = false
129: end
130: end
131: i += @racc_t
132: unless i >= 0 and
133: act = action_table[i] and
134: action_check[i] == @racc_state[-1]
135: act = action_default[@racc_state[-1]]
136: end
137: else
138: act = action_default[@racc_state[-1]]
139: end
140: while act = _racc_evalact(act, arg)
141: ;
142: end
143: end
144: }
145: end
# File lib/racc/parser.rb, line 308
308: def _racc_do_reduce(arg, act)
309: action_table, action_check, action_default, action_pointer,
310: goto_table, goto_check, goto_default, goto_pointer,
311: nt_base, reduce_table, token_table, shift_n,
312: reduce_n, use_result, * = arg
313: state = @racc_state
314: vstack = @racc_vstack
315: tstack = @racc_tstack
316:
317: i = act * -3
318: len = reduce_table[i]
319: reduce_to = reduce_table[i+1]
320: method_id = reduce_table[i+2]
321: void_array = []
322:
323: tmp_t = tstack[-len, len] if @yydebug
324: tmp_v = vstack[-len, len]
325: tstack[-len, len] = void_array if @yydebug
326: vstack[-len, len] = void_array
327: state[-len, len] = void_array
328:
329: # tstack must be updated AFTER method call
330: if use_result
331: vstack.push __send__(method_id, tmp_v, vstack, tmp_v[0])
332: else
333: vstack.push __send__(method_id, tmp_v, vstack)
334: end
335: tstack.push reduce_to
336:
337: racc_reduce(tmp_t, reduce_to, tstack, vstack) if @yydebug
338:
339: k1 = reduce_to - nt_base
340: if i = goto_pointer[k1]
341: i += state[-1]
342: if i >= 0 and (curstate = goto_table[i]) and goto_check[i] == k1
343: return curstate
344: end
345: end
346: goto_default[k1]
347: end
common
# File lib/racc/parser.rb, line 213
213: def _racc_evalact(act, arg)
214: action_table, action_check, action_default, action_pointer,
215: goto_table, goto_check, goto_default, goto_pointer,
216: nt_base, reduce_table, token_table, shift_n,
217: reduce_n, use_result, * = arg
218: nerr = 0 # tmp
219:
220: if act > 0 and act < shift_n
221: #
222: # shift
223: #
224: if @racc_error_status > 0
225: @racc_error_status -= 1 unless @racc_t == 1 # error token
226: end
227: @racc_vstack.push @racc_val
228: @racc_state.push act
229: @racc_read_next = true
230: if @yydebug
231: @racc_tstack.push @racc_t
232: racc_shift @racc_t, @racc_tstack, @racc_vstack
233: end
234:
235: elsif act < 0 and act > -reduce_n
236: #
237: # reduce
238: #
239: code = catch(:racc_jump) {
240: @racc_state.push _racc_do_reduce(arg, act)
241: false
242: }
243: if code
244: case code
245: when 1 # yyerror
246: @racc_user_yyerror = true # user_yyerror
247: return -reduce_n
248: when 2 # yyaccept
249: return shift_n
250: else
251: raise '[Racc Bug] unknown jump code'
252: end
253: end
254:
255: elsif act == shift_n
256: #
257: # accept
258: #
259: racc_accept if @yydebug
260: throw :racc_end_parse, @racc_vstack[0]
261:
262: elsif act == -reduce_n
263: #
264: # error
265: #
266: case @racc_error_status
267: when 0
268: unless arg[21] # user_yyerror
269: nerr += 1
270: on_error @racc_t, @racc_val, @racc_vstack
271: end
272: when 3
273: if @racc_t == 0 # is $
274: throw :racc_end_parse, nil
275: end
276: @racc_read_next = true
277: end
278: @racc_user_yyerror = false
279: @racc_error_status = 3
280: while true
281: if i = action_pointer[@racc_state[-1]]
282: i += 1 # error token
283: if i >= 0 and
284: (act = action_table[i]) and
285: action_check[i] == @racc_state[-1]
286: break
287: end
288: end
289: throw :racc_end_parse, nil if @racc_state.size <= 1
290: @racc_state.pop
291: @racc_vstack.pop
292: if @yydebug
293: @racc_tstack.pop
294: racc_e_pop @racc_state, @racc_tstack, @racc_vstack
295: end
296: end
297: return act
298:
299: else
300: raise "[Racc Bug] unknown action #{act.inspect}"
301: end
302:
303: racc_next_state(@racc_state[-1], @racc_state) if @yydebug
304:
305: nil
306: end
# File lib/racc/parser.rb, line 80
80: def _racc_init_sysvars
81: @racc_state = [0]
82: @racc_tstack = []
83: @racc_vstack = []
84:
85: @racc_t = nil
86: @racc_val = nil
87:
88: @racc_read_next = true
89:
90: @racc_user_yyerror = false
91: @racc_error_status = 0
92: end
# File lib/racc/parser.rb, line 68
68: def _racc_setup
69: @yydebug = false unless self.class::Racc_debug_parser
70: @yydebug = false unless defined?(@yydebug)
71: if @yydebug
72: @racc_debug_out = $stderr unless defined?(@racc_debug_out)
73: @racc_debug_out ||= $stderr
74: end
75: arg = self.class::Racc_arg
76: arg[13] = true if arg.size < 14
77: arg
78: end
# File lib/racc/parser.rb, line 155
155: def _racc_yyparse_rb(recv, mid, arg, c_debug)
156: action_table, action_check, action_default, action_pointer,
157: goto_table, goto_check, goto_default, goto_pointer,
158: nt_base, reduce_table, token_table, shift_n,
159: reduce_n, use_result, * = arg
160:
161: _racc_init_sysvars
162: tok = nil
163: act = nil
164: i = nil
165: nerr = 0
166:
167: catch(:racc_end_parse) {
168: until i = action_pointer[@racc_state[-1]]
169: while act = _racc_evalact(action_default[@racc_state[-1]], arg)
170: ;
171: end
172: end
173: recv.__send__(mid) do |tok, val|
174: unless tok
175: @racc_t = 0
176: else
177: @racc_t = (token_table[tok] or 1) # error token
178: end
179: @racc_val = val
180: @racc_read_next = false
181:
182: i += @racc_t
183: unless i >= 0 and
184: act = action_table[i] and
185: action_check[i] == @racc_state[-1]
186: act = action_default[@racc_state[-1]]
187: end
188: while act = _racc_evalact(act, arg)
189: ;
190: end
191:
192: while not (i = action_pointer[@racc_state[-1]]) or
193: not @racc_read_next or
194: @racc_t == 0 # $
195: unless i and i += @racc_t and
196: i >= 0 and
197: act = action_table[i] and
198: action_check[i] == @racc_state[-1]
199: act = action_default[@racc_state[-1]]
200: end
201: while act = _racc_evalact(act, arg)
202: ;
203: end
204: end
205: end
206: }
207: end
# File lib/racc/parser.rb, line 102
102: def next_token
103: raise NotImplementedError, "#{self.class}\#next_token is not defined"
104: end
# File lib/racc/parser.rb, line 349
349: def on_error(t, val, vstack)
350: raise ParseError, sprintf("\nparse error on value %s (%s)",
351: val.inspect, token_to_str(t) || '?')
352: end
# File lib/racc/parser.rb, line 397
397: def racc_accept
398: @racc_debug_out.puts 'accept'
399: @racc_debug_out.puts
400: end
# File lib/racc/parser.rb, line 402
402: def racc_e_pop(state, tstack, vstack)
403: @racc_debug_out.puts 'error recovering mode: pop token'
404: racc_print_states state
405: racc_print_stacks tstack, vstack
406: @racc_debug_out.puts
407: end
# File lib/racc/parser.rb, line 409
409: def racc_next_state(curstate, state)
410: @racc_debug_out.puts "goto #{curstate}"
411: racc_print_states state
412: @racc_debug_out.puts
413: end
# File lib/racc/parser.rb, line 415
415: def racc_print_stacks(t, v)
416: out = @racc_debug_out
417: out.print ' ['
418: t.each_index do |i|
419: out.print ' (', racc_token2str(t[i]), ' ', v[i].inspect, ')'
420: end
421: out.puts ' ]'
422: end
# File lib/racc/parser.rb, line 424
424: def racc_print_states(s)
425: out = @racc_debug_out
426: out.print ' ['
427: s.each {|st| out.print ' ', st }
428: out.puts ' ]'
429: end
for debugging output
# File lib/racc/parser.rb, line 370
370: def racc_read_token(t, tok, val)
371: @racc_debug_out.print 'read '
372: @racc_debug_out.print tok.inspect, '(', racc_token2str(t), ') '
373: @racc_debug_out.puts val.inspect
374: @racc_debug_out.puts
375: end
# File lib/racc/parser.rb, line 383
383: def racc_reduce(toks, sim, tstack, vstack)
384: out = @racc_debug_out
385: out.print 'reduce '
386: if toks.empty?
387: out.print ' <none>'
388: else
389: toks.each {|t| out.print ' ', racc_token2str(t) }
390: end
391: out.puts " --> #{racc_token2str(sim)}"
392:
393: racc_print_stacks tstack, vstack
394: @racc_debug_out.puts
395: end
# File lib/racc/parser.rb, line 377
377: def racc_shift(tok, tstack, vstack)
378: @racc_debug_out.puts "shift #{racc_token2str tok}"
379: racc_print_stacks tstack, vstack
380: @racc_debug_out.puts
381: end
# File lib/racc/parser.rb, line 431
431: def racc_token2str(tok)
432: self.class::Racc_token_to_s_table[tok] or
433: raise "[Racc Bug] can't convert token #{tok} to string"
434: end
# File lib/racc/parser.rb, line 436
436: def token_to_str(t)
437: self.class::Racc_token_to_s_table[t]
438: end