~ubuntu-branches/ubuntu/intrepid/racc/intrepid

« back to all changes in this revision

Viewing changes to packages/racc/bin/racc2y

  • Committer: Bazaar Package Importer
  • Author(s): akira yamada
  • Date: 2005-04-09 17:54:44 UTC
  • mfrom: (1.2.1 upstream) (2.1.1 warty)
  • Revision ID: james.westby@ubuntu.com-20050409175444-fvtir838ypkn7a58
Tags: 1.4.4-1
* new upstream version.  (closes: #301768)
* added racc2y.1 and y2racc.1.
* modified racc2y and y2racc to use optparse instead of deprecated getopts.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/ruby1.8
 
2
#
 
3
# r2yacc  --  racc to yacc converter
 
4
#
 
5
# Copyright (c) 1999-2003 Minero Aoki <aamine@loveruby.net>
 
6
#
 
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.
 
10
#
 
11
 
 
12
require 'optparse'
 
13
require 'racc/compiler'
 
14
 
 
15
 
 
16
RACC2Y_VERSION = '1.1.1'
 
17
 
 
18
def main
 
19
  op = OptionParser.new do |op|
 
20
    op.banner = 'Usage: racc2y [-AHIF] [-o outfile] raccfile'
 
21
 
 
22
    op.on('-o <file>', 'output file name  [y.<inputfile>]') do |file|
 
23
      $OPT_o = file
 
24
    end
 
25
    op.on('-A', 'did not output actions') do
 
26
      $OPT_A = true
 
27
    end
 
28
    op.on('-H', 'output \'header\'') do
 
29
      $OPT_H = true
 
30
    end
 
31
    op.on('-I', 'output \'inner\'') do
 
32
      $OPT_I = true
 
33
    end
 
34
    op.on('-F', 'output \'footer\'') do
 
35
      $OPT_F = true
 
36
    end
 
37
 
 
38
    op.on('--help', 'print this message and quit') do
 
39
      print op
 
40
      exit 0
 
41
    end
 
42
    op.on('--version', 'print version and quit') do
 
43
      puts "racc2y version #{RACC2Y_VERSION}"
 
44
      exit 0
 
45
    end
 
46
    op.on('--copyright', 'print copyright and quit') do
 
47
      puts 'Copyright (c) 1999-2003 Minero Aoki'
 
48
      exit 0
 
49
    end
 
50
 
 
51
    begin
 
52
      op.parse!
 
53
    rescue
 
54
      $stderr.puts 'wrong option'
 
55
      print op
 
56
      exit 1
 
57
    end
 
58
  end
 
59
 
 
60
  unless ARGV.size == 1
 
61
    $stderr.puts 'wrong option'
 
62
    print op
 
63
    exit 1
 
64
  end
 
65
 
 
66
  fname = ARGV[0]
 
67
  outf = $OPT_o || 'y.' + File.basename(fname)
 
68
  begin
 
69
    str = nil
 
70
    File.open(fname) {|f| str = f.read }
 
71
  rescue Errno::ENOENT
 
72
    $stderr.puts "#{File.basename $0}: no such file: #{fname}"
 
73
    exit 1
 
74
  end
 
75
  conv = Converter.new
 
76
  conv.parse str, fname
 
77
  File.open(outf, 'w') {|f|
 
78
    conv.output(f)
 
79
  }
 
80
end
 
81
 
 
82
 
 
83
class Converter
 
84
 
 
85
  def initialize
 
86
    @symboltable = Racc::SymbolTable.new(self)
 
87
    @ruletable   = Racc::RuleTable.new(self)
 
88
    @parser      = Racc::GrammarFileParser.new(self)
 
89
    @result_var = true
 
90
  end
 
91
 
 
92
  attr_reader :ruletable
 
93
  attr_reader :symboltable
 
94
  attr_reader :parser
 
95
 
 
96
  attr_accessor :result_var
 
97
 
 
98
  def debug()   false end
 
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
 
104
 
 
105
  ###
 
106
  ### parse
 
107
  ###
 
108
 
 
109
  def parse( str, fname )
 
110
    @fname = fname
 
111
    @parser.parse str
 
112
    @ruletable.init
 
113
    u = Racc::GrammarFileParser.get_usercode(fname)
 
114
    @header, = *u['header']
 
115
    @inner,  = *u['inner']
 
116
    @footer, = *u['footer']
 
117
  end
 
118
 
 
119
  ###
 
120
  ### output
 
121
  ###
 
122
 
 
123
  def output( f )
 
124
    rule = t = nil
 
125
 
 
126
    f.print(<<EOS)
 
127
/*
 
128
 
 
129
    generated from #{@fname} by racc2y version #{RACC2Y_VERSION}
 
130
 
 
131
*/
 
132
 
 
133
EOS
 
134
    if $OPT_H and @header
 
135
      f.puts '%{'
 
136
      f.puts '/*---- header ----*/'
 
137
      f.puts @header
 
138
      f.puts '%}'
 
139
      f.puts
 
140
    end
 
141
 
 
142
    output_defs f
 
143
    output_grammer f
 
144
 
 
145
    if $OPT_I and @inner
 
146
      f.puts
 
147
      f.puts '/*---- inner ----*/'
 
148
      f.puts
 
149
      f.puts @inner
 
150
    end
 
151
    if $OPT_F and @footer
 
152
      f.puts
 
153
      f.puts '/*---- footer ----*/'
 
154
      f.puts
 
155
      f.puts @footer
 
156
    end
 
157
  end
 
158
 
 
159
  def output_defs( f )
 
160
    output_token f
 
161
    f.puts
 
162
    prec = getprecs
 
163
    unless prec.empty?
 
164
      output_prec f, prec
 
165
    end
 
166
  end
 
167
 
 
168
  def output_token( f )
 
169
    f.puts '/* tokens */'
 
170
    anc = @symboltable.anchor
 
171
    err = @symboltable.error
 
172
    total = 6
 
173
    f.print '%token'
 
174
    @symboltable.each do |t|
 
175
      next unless t.terminal?
 
176
      next if t.dummy?
 
177
      next if t == err
 
178
      next if t == anc
 
179
 
 
180
      unless String === t.value
 
181
        if total > 60
 
182
          f.print "\n     "
 
183
          total = 0
 
184
        end
 
185
        total += f.write(" #{tok t}")
 
186
      end
 
187
    end
 
188
    f.puts
 
189
  end
 
190
 
 
191
  def getprecs
 
192
    prec = []
 
193
    @symboltable.each do |t|
 
194
      next unless t.prec
 
195
      if a = prec[t.prec]
 
196
        a.push t
 
197
      else
 
198
        prec[t.prec] = [t.assoc, t]
 
199
      end
 
200
    end
 
201
 
 
202
    prec
 
203
  end
 
204
 
 
205
  def output_prec( f, tab )
 
206
    f.puts '/* precedance table */'
 
207
    tab.each do |a|
 
208
      if a
 
209
        f.printf '%%%-8s', a.shift.id2name.downcase
 
210
        a.each do |t|
 
211
          f.print ' ', tok(t)
 
212
        end
 
213
        f.puts
 
214
      end
 
215
    end
 
216
    f.puts
 
217
  end
 
218
 
 
219
 
 
220
  def output_grammer( f )
 
221
    f.puts '%%'
 
222
 
 
223
    targ   = nil
 
224
    indent = 10
 
225
    fmt    = "\n%-10s:"
 
226
    emb    = []
 
227
 
 
228
    @ruletable.each do |rule|
 
229
      if rule.target.dummy?
 
230
        emb.push rule.action if rule.action
 
231
        next
 
232
      end
 
233
 
 
234
      if rule.target == targ
 
235
        f.print ' ' * indent, '|'
 
236
      else
 
237
        targ = rule.target
 
238
        f.printf fmt, tok(targ)
 
239
      end
 
240
      rule.symbols.each do |t|
 
241
        if t.dummy?   # target of dummy rule for embedded action
 
242
          f.puts
 
243
          output_act f,
 
244
                     emb.shift,
 
245
                     indent
 
246
          f.print ' ' * (indent + 1)
 
247
        else
 
248
          f.print ' ', tok(t)
 
249
        end
 
250
      end
 
251
      if rule.specified_prec
 
252
        f.print ' %prec ', tok(rule.specified_prec)
 
253
      end
 
254
      f.puts
 
255
      if rule.action
 
256
        output_act f, rule.action, indent
 
257
      end
 
258
    end
 
259
 
 
260
    f.puts "\n%%"
 
261
  end
 
262
 
 
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"
 
267
  end
 
268
 
 
269
  def tok( t )
 
270
    s = t.to_s
 
271
    s.gsub '"', "'"
 
272
  end
 
273
 
 
274
end   # class R
 
275
 
 
276
 
 
277
main