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