1# $Id: preproc.rb 25189 2009-10-02 12:04:37Z akr $
2
3require 'optparse'
4
5def main
6  output = nil
7  parser = OptionParser.new
8  parser.banner = "Usage: #{File.basename($0)} [--output=PATH] <parse.y>"
9  parser.on('--output=PATH', 'An output file.') {|path|
10    output = path
11  }
12  parser.on('--help', 'Prints this message and quit.') {
13    puts parser.help
14    exit true
15  }
16  begin
17    parser.parse!
18  rescue OptionParser::ParseError => err
19    $stderr.puts err.message
20    $stderr.puts parser.help
21    exit false
22  end
23  unless ARGV.size == 1
24    abort "wrong number of arguments (#{ARGV.size} for 1)"
25  end
26  out = ""
27  File.open(ARGV[0]) {|f|
28    prelude f, out
29    grammar f, out
30    usercode f, out
31  }
32  if output
33    File.open(output, 'w') {|f|
34      f.write out
35    }
36  else
37    print out
38  end
39end
40
41def prelude(f, out)
42  while line = f.gets
43    case line
44    when %r</\*%%%\*/>
45      out << '/*' << $/
46    when %r</\*%>
47      out << '*/' << $/
48    when %r<%\*/>
49      out << $/
50    when /\A%%/
51      out << '%%' << $/
52      return
53    when /\A%token/
54      out << line.sub(/<\w+>/, '<val>')
55    when /\A%type/
56      out << line.sub(/<\w+>/, '<val>')
57    else
58      out << line
59    end
60  end
61end
62
63def grammar(f, out)
64  while line = f.gets
65    case line
66    when %r</\*%%%\*/>
67      out << '#if 0' << $/
68    when %r</\*%c%\*/>
69      out << '/*' << $/
70    when %r</\*%c>
71      out << '*/' << $/
72    when %r</\*%>
73      out << '#endif' << $/
74    when %r<%\*/>
75      out << $/
76    when /\A%%/
77      out << '%%' << $/
78      return
79    else
80      out << line
81    end
82  end
83end
84
85def usercode(f, out)
86  while line = f.gets
87    out << line
88  end
89end
90
91main
92