# http://ananelson.com/blog/2008/06/jruby-wrapping-for-antlr def write_to_file(section_name) Dir.mkdir("output") unless File.exist?("output") puts "warning! about to redirect stdout to #{section_name}, if I don't come back come look for me..." begin sys_stdout = $stdout.clone File.open("output/" + section_name + ".txt", "w") do |f| $stdout.reopen(f) yield end ensure $stdout.reopen(sys_stdout) sys_stdout.close end puts "...okay stdout is back." end # Uncomment this if you just want to print to STDOUT: # def write_to_file(ignore_me) # yield # end ### @export "setup" require 'antlr_velvet' class Expr include AntlrVelvet end ### @export "init" parser = Expr.string_parser("1 + 1") ### @end write_to_file("prog-output") do begin ### @export "prog" puts parser.prog ### @end rescue AntlrError => e puts e.to_s end end write_to_file("prog-valid-output") do ### @export "prog-valid" parser = Expr.string_parser("1 + 1\n") puts parser.prog ### @end end write_to_file("expr-output") do ### @export "expr" parser = Expr.string_parser("1 + 1") puts parser.expr ### @end end write_to_file("stat-output") do ### @export "stat" parser = Expr.string_parser("1 + 1\n") parser.stat puts parser.output.inspect ### @end end write_to_file("prog-multi-output") do ### @export "prog-multi" parser = Expr.string_parser(" 1 + 1 x = 1 y = 2 3*(x+y) ") parser.prog puts parser.output.inspect ### @end end write_to_file("complex-expr-output") do ### @export "complex-expr" puts Expr.string_parser("1 + 2 * (3 + 4 * (5 + 6 * (7 + 8 * 9)))").expr ### @end end write_to_file("explicit-output") do ### @export "explicit" class Expr def atom puts "Your atom is " + @parser.atom.to_s end end Expr.string_parser("99").atom ### @end end def java_methods(methods) methods.reject! {|m| Object.instance_methods.include?(m) } # boring methods.reject! {|m| m =~ /^(g|s)et[_A-Z]/} # Java getters/setters and their Ruby versions methods.reject! {|m| m =~ /=$/} # Ruby setters methods.reject! {|m| m =~ /^__/} # e.g. __jcreate! __jsend! duplicate_methods = methods.collect {|m| m.downcase.gsub("_", "")} methods.reject! {|m| m != m.downcase && duplicate_methods.grep(m.downcase.gsub("_", "")).length == 2 } methods.uniq.sort end write_to_file("parser-inspect-output") do ### @export "parser-inspect" puts java_methods(parser.parser.methods) ### @end end write_to_file("tokens-inspect-output") do ### @export "tokens-inspect" puts java_methods(parser.token_stream.methods) ### @end end write_to_file("lexer-inspect-output") do ### @export "lexer-inspect" puts java_methods(parser.lexer.methods) ### @end end