3
# r2yacc -- racc to yacc converter
5
# Copyright (c) 1999-2003 Minero Aoki <aamine@loveruby.net>
7
# This program is feee software.
8
# You can distribute/modify this program under the terms of
9
# the GNU Lesser General Public License version 2 or later.
13
require 'racc/compiler'
16
RACC2Y_VERSION = '1.1.1'
19
op = OptionParser.new do |op|
20
op.banner = 'Usage: racc2y [-AHIF] [-o outfile] raccfile'
22
op.on('-o <file>', 'output file name [y.<inputfile>]') do |file|
25
op.on('-A', 'did not output actions') do
28
op.on('-H', 'output \'header\'') do
31
op.on('-I', 'output \'inner\'') do
34
op.on('-F', 'output \'footer\'') do
38
op.on('--help', 'print this message and quit') do
42
op.on('--version', 'print version and quit') do
43
puts "racc2y version #{RACC2Y_VERSION}"
46
op.on('--copyright', 'print copyright and quit') do
47
puts 'Copyright (c) 1999-2003 Minero Aoki'
54
$stderr.puts 'wrong option'
61
$stderr.puts 'wrong option'
67
outf = $OPT_o || 'y.' + File.basename(fname)
70
File.open(fname) {|f| str = f.read }
72
$stderr.puts "#{File.basename $0}: no such file: #{fname}"
77
File.open(outf, 'w') {|f|
86
@symboltable = Racc::SymbolTable.new(self)
87
@ruletable = Racc::RuleTable.new(self)
88
@parser = Racc::GrammarFileParser.new(self)
92
attr_reader :ruletable
93
attr_reader :symboltable
96
attr_accessor :result_var
99
def verbose() false end
100
def d_parse() false end
101
def d_token() false end
102
def d_rule() false end
103
def d_state() false end
109
def parse( str, fname )
113
u = Racc::GrammarFileParser.get_usercode(fname)
114
@header, = *u['header']
115
@inner, = *u['inner']
116
@footer, = *u['footer']
129
generated from #{@fname} by racc2y version #{RACC2Y_VERSION}
134
if $OPT_H and @header
136
f.puts '/*---- header ----*/'
147
f.puts '/*---- inner ----*/'
151
if $OPT_F and @footer
153
f.puts '/*---- footer ----*/'
168
def output_token( f )
169
f.puts '/* tokens */'
170
anc = @symboltable.anchor
171
err = @symboltable.error
174
@symboltable.each do |t|
175
next unless t.terminal?
180
unless String === t.value
185
total += f.write(" #{tok t}")
193
@symboltable.each do |t|
198
prec[t.prec] = [t.assoc, t]
205
def output_prec( f, tab )
206
f.puts '/* precedance table */'
209
f.printf '%%%-8s', a.shift.id2name.downcase
220
def output_grammer( f )
228
@ruletable.each do |rule|
229
if rule.target.dummy?
230
emb.push rule.action if rule.action
234
if rule.target == targ
235
f.print ' ' * indent, '|'
238
f.printf fmt, tok(targ)
240
rule.symbols.each do |t|
241
if t.dummy? # target of dummy rule for embedded action
246
f.print ' ' * (indent + 1)
251
if rule.specified_prec
252
f.print ' %prec ', tok(rule.specified_prec)
256
output_act f, rule.action, indent
263
def output_act( f, str, indent )
264
f.print ' ' * (indent + 4), "{\n"
265
f.print ' ' * (indent + 6), str, "\n" unless $OPT_A
266
f.print ' ' * (indent + 4), "}\n"