diff options
Diffstat (limited to 'ext/ripper/tools')
-rwxr-xr-x | ext/ripper/tools/preproc.rb | 84 |
1 files changed, 60 insertions, 24 deletions
diff --git a/ext/ripper/tools/preproc.rb b/ext/ripper/tools/preproc.rb index a2dba36e02..4b26c5bcb0 100755 --- a/ext/ripper/tools/preproc.rb +++ b/ext/ripper/tools/preproc.rb @@ -1,56 +1,92 @@ +# $Id$ + +require 'stringio' +require 'optparse' + def main - prelude - grammar - usercode + output = nil + parser = OptionParser.new + parser.banner = "Usage: #{File.basename($0)} [--output=PATH] <parse.y>" + parser.on('--output=PATH', 'An output file.') {|path| + output = path + } + parser.on('--help', 'Prints this message and quit.') { + puts parser.help + exit 0 + } + begin + parser.parse! + rescue OptionParser::ParseError => err + $stderr.puts err.message + $stderr.puts parser.help + exit 1 + end + unless ARGV.size == 1 + $stderr.puts "wrong number of arguments (#{ARGV.size} for 1)" + exit 1 + end + out = StringIO.new + File.open(ARGV[0]) {|f| + prelude f, out + grammar f, out + usercode f, out + } + if output + File.open(output, 'w') {|f| + f.write out.string + } + else + print out.string + end end -def prelude - while line = ARGF.gets +def prelude(f, out) + while line = f.gets case line when %r</\*%%%\*/> - puts '/*' + out.puts '/*' when %r</\*%> - puts '*/' + out.puts '*/' when %r<%\*/> - puts + out.puts when /\A%%/ - puts '%%' + out.puts '%%' return when /\A%token/ - puts line.sub(/<\w+>/, '<val>') + out.puts line.sub(/<\w+>/, '<val>') when /\A%type/ - puts line.sub(/<\w+>/, '<val>') + out.puts line.sub(/<\w+>/, '<val>') else - print line + out.print line end end end -def grammar - while line = ARGF.gets +def grammar(f, out) + while line = f.gets case line when %r</\*%%%\*/> - puts '#if 0' + out.puts '#if 0' when %r</\*%c%\*/> - puts '/*' + out.puts '/*' when %r</\*%c> - puts '*/' + out.puts '*/' when %r</\*%> - puts '#endif' + out.puts '#endif' when %r<%\*/> - puts + out.puts when /\A%%/ - puts '%%' + out.puts '%%' return else - print line + out.print line end end end -def usercode - while line = ARGF.gets - print line +def usercode(f, out) + while line = f.gets + out.print line end end |