10
fn = File.expand_path( fn )
21
def sr_conflict( *args )
22
bug! 'sr conflict in build'
24
def rr_conflict( *args )
25
bug! 'sr conflict in build'
35
def filename() '(build)' end
37
def debug_parser() @dflag end
38
def convert_line() true end
39
def omit_action() true end
40
def result_var() true end
43
def d_parse() false end
44
def d_rule() false end
45
def d_token() false end
46
def d_state() false end
48
def d_prec() false end
51
def r( targ, symlist, act )
52
targ = @symboltable.get( targ ) if targ
54
symlist.collect! do |i|
55
bug! 'nil in symlist' unless i
58
act.sub!( /\A\s*\n/, '' )
59
act.sub!( /\s+\z/, '' )
61
/:(\d+)(?:\z|:)/ === caller(1)[0]
63
symlist.push UserAction.new( act, lineno )
65
@ruletable.register_rule( targ, symlist )
69
def build( debugflag )
72
@symboltable = SymbolTable.new( self )
73
@ruletable = RuleTable.new( self )
74
@statetable = StateTable.new( self )
78
r :xclass, [ :XCLASS, :class, :params, :XRULE, :rules, :XEND ], %{
79
@ruletable.end_register_rule
82
r :class, [ :rubyconst ], %{
85
r nil, [ :rubyconst, '<', :rubyconst ], %{
90
r :rubyconst, [ :XSYMBOL ], %{
91
result = result.id2name
93
r nil, [ :rubyconst, ':', ':', :XSYMBOL ], %{
94
result << '::' << val[3].id2name
100
r nil, [ :params, :param_seg ], ''
103
r :param_seg, [ :XCONV, :convdefs, :XEND ], %{
104
@symboltable.end_register_conv
107
r nil, [ :xprec ], ''
109
r nil, [ :XSTART, :symbol ], %{
110
@ruletable.register_start val[1]
113
r nil, [ :XTOKEN, :symbol_list ], %{
114
@symboltable.register_token val[1]
117
r nil, [ :XOPTION, :bare_symlist ], %{
119
@ruletable.register_option s.to_s
122
r nil, [ :XEXPECT, :DIGIT ], %{
123
@ruletable.expect val[1]
127
r :convdefs, [ :symbol, :STRING ], %{
128
@symboltable.register_conv( val[0], val[1] )
131
r nil, [ :convdefs, :symbol, :STRING ], %{
132
@symboltable.register_conv( val[1], val[2] )
136
r :xprec, [ :XPRECHIGH, :preclines, :XPRECLOW ], %{
137
@symboltable.end_register_prec( true )
140
r nil, [ :XPRECLOW, :preclines, :XPRECHIGH ], %{
141
@symboltable.end_register_prec( false )
145
r :preclines, [ :precline ], ''
147
r nil, [ :preclines, :precline ], ''
150
r :precline, [ :XLEFT, :symbol_list ], %{
151
@symboltable.register_prec( :Left, val[1] )
154
r nil, [ :XRIGHT, :symbol_list ], %{
155
@symboltable.register_prec( :Right, val[1] )
158
r nil, [ :XNONASSOC, :symbol_list ], %{
159
@symboltable.register_prec( :Nonassoc, val[1] )
163
r :symbol_list, [ :symbol ], %{
167
r nil, [ :symbol_list, :symbol ], %{
170
r nil, [ :symbol_list, '|' ], ''
173
r :symbol, [ :XSYMBOL ], %{
174
result = @symboltable.get( result )
177
r nil, [ :STRING ], %{
178
result = @symboltable.get( eval '"' + val[0] + '"' )
182
r :rules, [ :rules_core ], %{
183
unless result.empty? then
184
@ruletable.register_rule_from_array result
191
r :rules_core, [ :symbol ], %{
195
r nil, [ :rules_core, :rule_item ], %{
199
r nil, [ :rules_core, ';' ], %{
200
unless result.empty? then
201
@ruletable.register_rule_from_array result
206
r nil, [ :rules_core, ':' ], %{
208
unless result.empty? then
209
@ruletable.register_rule_from_array result
215
r :rule_item, [ :symbol ], ''
218
result = OrMark.new( @scanner.lineno )
221
r nil, [ '=', :symbol ], %{
222
result = Prec.new( val[1], @scanner.lineno )
225
r nil, [ :ACTION ], %{
226
result = UserAction.new( *result )
229
r :bare_symlist, [ :XSYMBOL ], %{
230
result = [ result.id2name ]
232
r nil, [ :bare_symlist, :XSYMBOL ], %{
233
result.push val[1].id2name
239
@statetable.determine
241
File.open( 'raccp.rb', 'w' ) do |f|
242
f.write <<'HEADER_END'
244
# This file is automatically generated. DO NOT MODIFY!!
248
# Copyright (c) 1999-2001 Minero Aoki <aamine@loveruby.net>
250
# This program is free software.
251
# You can distribute/modify this program under the terms of
252
# the GNU Lesser General Public License version 2.
255
require 'racc/parser'
257
require 'racc/ucodep'
262
class GrammarFileParser < Parser
264
def initialize( racc )
265
@yydebug = racc.d_parse && Racc_debug_parser
266
@ruletable = racc.ruletable
267
@symboltable = racc.symboltable
277
@scanner = GrammarFileScanner.new( str )
278
@scanner.debug = @yydebug
290
def on_error( tok, val, _values )
291
if val.respond_to? :id2name then
293
elsif String === val then
298
raise ParseError, "#{@scanner.lineno}: unexpected token '#{v}'"
302
fmt = CodeGenerator.new( self )
304
f.write <<'FOOTER_END'
311
ver = VerboseOutputter.new( self )
312
File.open( 'b.output', 'w' ) do |f|
325
when '-g' then de = true
328
Racc::Compiler.new.build de