ParseTree: December 2007 Archives

Thanks to Luis Lavena, ParseTree now has gems precompiled for windows! This makes things like ruby2ruby, heckle, and much more that much more accessible to the OS-challenged!

ParseTree is a C extension (using RubyInline) that extracts the parse tree for an entire class or a specific method and returns it as a s-expression (aka sexp) using ruby's arrays, strings, symbols, and integers.

As an example:

def conditional1(arg1) if arg1 == 0 then return 1 end return 0 end

becomes:

[:defn, :conditional1, [:scope, [:block, [:args, :arg1], [:if, [:call, [:lvar, :arg1], :==, [:array, [:lit, 0]]], [:return, [:lit, 1]], nil], [:return, [:lit, 0]]]]]

  • Uses RubyInline, so it just drops in.
  • Includes SexpProcessor and CompositeSexpProcessor.
    • Allows you to write very clean filters.
  • Includes UnifiedRuby, allowing you to automatically rewrite ruby quirks.
  • ParseTree#parsetreefor_string lets you parse arbitrary strings of ruby.
  • Includes parsetreeshow, which lets you quickly snoop code.
    • echo "1+1" | parsetreeshow -f for quick snippet output.
  • Includes parsetreeabc, which lets you get abc metrics on code.
    • abc metrics = numbers of assignments, branches, and calls.
    • whitespace independent metric for method complexity.
  • Includes parsetreedeps, which shows you basic class level dependencies.
  • Does not work on the core classes, as they are not ruby (yet).

Changes:

2.1.1 / 2007-12-22

ruby_parser (RP) is a ruby parser written in pure ruby (utilizing racc--which does by default use a C extension). RP's output is the same as ParseTree's output: s-expressions using ruby's arrays and base types.

FEATURES/PROBLEMS:

  • Pure ruby, no compiles.
  • Incredibly simple interface.
  • Output is 100% equivalent to ParseTree.
    • Can utilize PT's SexpProcessor and UnifiedRuby for language processing.
  • Known Issue: Speed sucks currently. 5500 tests currently run in 21 min.
  • Known Issue: Code is waaay ugly. Port of a port. Not my fault. Will fix RSN.
  • Known Issue: I don't currently support newline nodes.
  • Known Issue: Totally awesome.
  • Known Issue: dasgn_curr decls can be out of order from ParseTree's.
  • TODO: Add comment nodes.

SYNOPSIS:

RubyParser.new.parse "1+1"
# => s(:call, s(:lit, 1), :+, s(:array, s(:lit, 1)))

Changes:

1.0.0 / 2007-12-20

ruby2ruby provides a means of generating pure ruby code easily from ParseTree's Sexps. This makes making dynamic language processors much easier in ruby than ever before.

Changes:

1.1.8 / 2007-08-21

  • 6 minor enhancements:

    • Added super awesome .autotest file. YAY!
    • Removed nil.method_missing... too many ppl bitching about it.
    • Renamed RubyToRuby (the class name) to Ruby2Ruby.
    • Restructured self-translation tests so they were friendlier when dying.
    • Strings are now always one line long only.
    • Fully in sync with ParseTree and ruby_parser.
  • 2 bug fixes:

    • Fixed a number of issues/bugs discovered via ruby_parser.
    • Cleaned out some dead code and hacks we don't need anymore.
  • http://seattlerb.rubyforge.org/

  • http://rubyforge.org/projects/seattlerb

ParseTree is a C extension (using RubyInline) that extracts the parse tree for an entire class or a specific method and returns it as a s-expression (aka sexp) using ruby's arrays, strings, symbols, and integers.

As an example:

def conditional1(arg1) if arg1 == 0 then return 1 end return 0 end

becomes:

[:defn, :conditional1, [:scope, [:block, [:args, :arg1], [:if, [:call, [:lvar, :arg1], :==, [:array, [:lit, 0]]], [:return, [:lit, 1]], nil], [:return, [:lit, 0]]]]]

  • Uses RubyInline, so it just drops in.
  • Includes SexpProcessor and CompositeSexpProcessor.
    • Allows you to write very clean filters.
  • Includes UnifiedRuby, allowing you to automatically rewrite ruby quirks.
  • ParseTree#parsetreefor_string lets you parse arbitrary strings of ruby.
  • Includes parsetreeshow, which lets you quickly snoop code.
    • echo "1+1" | parsetreeshow -f for quick snippet output.
  • Includes parsetreeabc, which lets you get abc metrics on code.
    • abc metrics = numbers of assignments, branches, and calls.
    • whitespace independent metric for method complexity.
  • Includes parsetreedeps, which shows you basic class level dependencies.
  • Does not work on the core classes, as they are not ruby (yet).

Changes:

  • 13 minor enhancements:

    • Added (partial) regexp flag support, currently numerical. ugh.
    • Added -a flag to parsetreeshow to turn on newline (all) nodes.
    • Added -r to parsetreeshow for raw arrays instead of sexps.
    • Added Unifier (SexpProcessor) class to unified_ruby.rb.
    • Added a ton of tests while working on ruby_parser.
    • Added ability to tell proc {} (nil arg slot) from proc {||} (0 arg slot)
    • Added context tracking to rewriting phase... slightly broken.
    • Added evstr support. (I hate evan)
    • Added usage for parsetreeshow.
    • Changed verbose to be true all the time in parsetreefor_string.
    • Removed process_level from SexpProcessor... just look at context size instead.
    • Revamped ParseTree. No more passing around newline. Pass around self instead.
    • I'm starting to dislike ruby's AST. It is REALLY inconsistent.
  • 6 bug fix:

    • SexpProcessor#assert_type now a bit safer with bad values.
    • Uncovered a bug in ruby (AST changes when -v used), added handler code.
    • Fixed NODE_BLOCK and massively simplified in the process.
    • Fixed rewrite_defs to deal with non-block asts.
    • Fixed test/unit hack so it does not die under miniunit.
    • Found a bug in PT where parsetreefor_string had some shadowed variables.
  • http://www.zenspider.com/ZSS/Products/ParseTree/

No Longer Secret

| | Comments (7)

I'm currently on a plane flying home from the bay area. I just spent the last two days participating in the latest rubinius sprint. (I had to go hem early to teach my ruby class).

So, we got the go ahead/mandate to drop the secrecy. Eric Hodel and I are joining Evan Phoenix at Engine Yard to work on rubinius. This is just about the most bad-ass job I could possibly get (my dreams of becoming an astronaut long-dashed against the rocks of horrible vision and only marginally better grades).

I'm only just digging in. Last night I made some changes to autotest that will make it possible to be used with mspec (rubinius' mini version of rspec). This should help accelerate development.

I'm also feverishly working on a new ruby parser written in pure ruby (+ racc) that outputs the same as ParseTree. I'm 99% done (measuring against my tests + dynamic tests generated from stdlib+all my rubygems). I hope to have a release soon. It does have a long way to go after correctness has been addressed. Namely, it is a port of a port and could use a lot of clean-up esp now that we have the true power of ruby behind it.

Anyhow. I'm terribly excited by this. I can't wait to see where we go next.

About this Archive

This page is a archive of entries in the ParseTree category from December 2007.

ParseTree: November 2007 is the previous archive.

Find recent content on the main index or look in the archives to find all content.

Pages

Powered by Movable Type 4.1