# ParseTree 2.0.0 Released

**URL:** <https://www.ruby-forum.com/t/parsetree-2-0-0-released/110993>\
**Category:** Ruby\
**Created:** [August 1, 2007, 7:50pm UTC](https://www.ruby-forum.com/t/parsetree-2-0-0-released/110993 "2007-08-01T19:50:02Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![aguynamedryan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/43a26b/32.png) [@aguynamedryan](https://www.ruby-forum.com/u/aguynamedryan)\
**Post date:** [August 1, 2007, 7:50pm UTC](https://www.ruby-forum.com/t/parsetree-2-0-0-released/110993/1 "2007-08-01T19:50:02Z")

</div>

ParseTree version 2.0.0 has been released!

- [http://www.zenspider.com/ZSS/Products/ParseTree/](http://www.zenspider.com/ZSS/Products/ParseTree/)

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#parse\_tree\_for\_string lets you parse arbitrary strings of  
ruby.
- Includes parse\_tree\_show, which lets you quickly snoop code.
  - echo “1+1” | parse\_tree\_show -f for quick snippet output.

- Includes parse\_tree\_abc, which lets you get abc metrics on code.
  - abc metrics = numbers of assignments, branches, and calls.
  - whitespace independent metric for method complexity.

- Includes parse\_tree\_deps, which shows you basic class level  
dependencies.
- Does not work on the core classes, as they are not ruby (yet).

Changes:

- 2 major enhancements:

- 5 minor enhancements:

- 6 bug fixes:

- [http://www.zenspider.com/ZSS/Products/ParseTree/](http://www.zenspider.com/ZSS/Products/ParseTree/)

---

<div class="post-metadata">

**Author:** ![aguynamedryan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/43a26b/32.png) [@aguynamedryan](https://www.ruby-forum.com/u/aguynamedryan)\
**Post date:** [August 1, 2007, 9:57pm UTC](https://www.ruby-forum.com/t/parsetree-2-0-0-released/110993/2 "2007-08-01T21:57:22Z")

</div>

2007/8/1, Ryan D. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> ParseTree version 2.0.0 has been released!  
> (…)

Ryan, thank you for your continuous work on those libraries. I have a  
question concerning Ruby’s ASTs: do you know a way to get at the parse  
tree of the calling method / block and at the node of the call? For  
example:

def look\_at\_callers\_parse\_tree  
# what to do here?  
end

def calling\_from\_method  
look\_at\_callers\_parse\_tree # should get this node…  
end

def calling\_from\_block  
yield  
end

calling\_from\_block { look\_at\_callers\_parse\_tree } # …and the one  
in this block

Regards,  
Pit

---

<div class="post-metadata">

**Author:** ![aguynamedryan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/43a26b/32.png) [@aguynamedryan](https://www.ruby-forum.com/u/aguynamedryan)\
**Post date:** [August 1, 2007, 10:08pm UTC](https://www.ruby-forum.com/t/parsetree-2-0-0-released/110993/3 "2007-08-01T22:08:22Z")

</div>

On Aug 1, 2007, at 12:55 , Pit C. wrote:

> ```
> # what to do here?
> 
> ```
> 
> calling\_from\_block { look\_at\_callers\_parse\_tree } # …and the one  
> in this block

not without doing the usual caller() manipulation stuffs, no.  
Rubinius might be easier in that regard tho.

---

<div class="post-metadata">

**Author:** ![aguynamedryan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/43a26b/32.png) [@aguynamedryan](https://www.ruby-forum.com/u/aguynamedryan)\
**Post date:** [August 1, 2007, 10:19pm UTC](https://www.ruby-forum.com/t/parsetree-2-0-0-released/110993/4 "2007-08-01T22:19:24Z")

</div>

2007/8/1, Ryan D. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> On Aug 1, 2007, at 12:55 , Pit C. wrote:
> 
> > (…) do you know a way to get at the parse  
> > tree of the calling method / block and at the node of the call?
> 
> not without doing the usual caller() manipulation stuffs, no.  
> Rubinius might be easier in that regard tho.

OK. Thanks.

Regards,  
Pit

---

<div class="post-metadata">

**Author:** ![aguynamedryan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/43a26b/32.png) [@aguynamedryan](https://www.ruby-forum.com/u/aguynamedryan)\
**Post date:** [August 2, 2007, 1:29pm UTC](https://www.ruby-forum.com/t/parsetree-2-0-0-released/110993/5 "2007-08-02T13:29:15Z")

</div>

May I kindly ask if you could give an example for how to use  
parse\_tree\_for\_method? Is there an example available for how to parse a  
method, modify the sexpr and feed the result back to the ruby  
interpreter, thereby replacing the original method with the patched  
version?

Regards,  
Thomas.

---

<div class="post-metadata">

**Author:** ![aguynamedryan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/43a26b/32.png) [@aguynamedryan](https://www.ruby-forum.com/u/aguynamedryan)\
**Post date:** [August 4, 2007, 10:09am UTC](https://www.ruby-forum.com/t/parsetree-2-0-0-released/110993/6 "2007-08-04T10:09:56Z")

</div>

On Aug 1, 2007, at 12:55, Pit C. wrote:

> ```
> # what to do here?
> 
> ```
> 
> calling\_from\_block { look\_at\_callers\_parse\_tree } # …and the one  
> in this block

SuperCaller can do this. It was waiting on a release of PT, because  
add\_to\_parse\_tree was static.

I need to polish the documentation a bit before I can release.

---

<div class="post-metadata">

**Author:** ![aguynamedryan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/43a26b/32.png) [@aguynamedryan](https://www.ruby-forum.com/u/aguynamedryan)\
**Post date:** [August 4, 2007, 4:34pm UTC](https://www.ruby-forum.com/t/parsetree-2-0-0-released/110993/7 "2007-08-04T16:34:28Z")

</div>

2007/8/4, Eric H. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> SuperCaller can do this. It was waiting on a release of PT, because  
> add\_to\_parse\_tree was static.
> 
> I need to polish the documentation a bit before I can release.

Thanks Eric, I’m looking forward to the relase. But maybe I don’t need  
it anymore, because, while searching the web for SuperCaller, I’ve  
seen on your blog that you seem to work on some of the same ideas as I  
do with your inliner experiments 🙂

Regards,  
Pit

---

<div class="post-metadata">

**Author:** ![aguynamedryan](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/43a26b/32.png) [@aguynamedryan](https://www.ruby-forum.com/u/aguynamedryan)\
**Post date:** [August 3, 2007, 2:50am UTC](https://www.ruby-forum.com/t/parsetree-2-0-0-released/110993/8 "2007-08-03T02:50:39Z")

</div>

On Aug 2, 2007, at 04:29 , Tom L. wrote:

> May I kindly ask if you could give an example for how to use  
> parse\_tree\_for\_method? Is there an example available for how to  
> parse a  
> method, modify the sexpr and feed the result back to the ruby  
> interpreter, thereby replacing the original method with the patched  
> version?

ParseTree is one way. You have to use ruby2ruby + eval to feed the  
results back in.
