RubyAST
RubyAST is a small library on top of jrubyparser. The library works with ALL VERSIONS OF RUBY. YOU DON'T NEED TO USE JRUBY (but why not, it's awesome!).
#parse
Parsing a file:
source = File.read(file_name)
ast = RubyAST.parse(file_name, source)
Parsing a string:
ast = RubyAST.parse("(string)", "x = 1")
You can set a starting line number (by default it's 0):
ast = RubyAST.parse("(string)", "x = 1", :line_number => 100)
You can set ruby version (by default it's RUBY1_9):
ast = RubyAST.parse("(string)", "x = 1", :ruby_version => "RUBY1_9")
#to_source
Just pass AST:
source = RubyAST.to_source(ast)
If you want to keep quotes and heredocs, pass the original source:
original_source = File.read(file_name)
ast = RubyAST.parse(file_name, original_source)
new_source = RubyAST.to_source(ast, original_source)
AST Nodes
ast = RubyAST.parse("(string)", "x = 1")
new_line_node = ast.body_node
assignment = new_line_node.next_node
fixnum_node = assignment.value_node
assignment.name.should == "x"
fixnum_node.value.should == 1
Check out jruby-parser for additoinal information about different types of nodes.