I've been playing with TreeTop for a while now as well...
I would suggest that you use tt to generate the parser and then take a
look at the resulting code:

tt t1.treetop

Resulting code will be in t1.rb

I think you'll find that the call to wrrd.toxml  doesn't work there
because wrrd is not in scope.  Not sure how to fix it, though, maybe
you could use elements[0].wrrd?

Phil

On 1/27/08, Phrogz <phrogz / mac.com> wrote:
> An additional Treetop question that has me stumped:
>
> I have a simple grammar as listed at the end of this post. In the
> following code, why can I not get the 'to_xml' method to flow through
> the 'inline_atom' rule, to use the to_xml of the underlying wrrd and
> numz classes? Why does inline_atom not provide the #wrrd and #numz
> SyntaxNode methods inside the handlers for inline_atom? How can I
> rewrite inline_atom to allow the flow through?
>
>
> require 'rubygems'
> require 'treetop'
>
> Treetop.load "t1.treetop"
> @parser = T1Parser.new
> @root = @parser.parse( "Hi 123\n\n" )
> p @root
> #=>SyntaxNode+Paragraph1+Paragraph0 offset=0, "Hi 123\n
> \n" (inline_content,to_xml):
> #=>  SyntaxNode+InlineContent2+InlineContent1 offset=0, "Hi
> 123" (all_items,to_xml,items,last_item):
> #=>    SyntaxNode offset=0, "Hi ":
> #=>      SyntaxNode+InlineContent0 offset=0, "Hi " (wspace,item):
> #=>        SyntaxNode+InlineAtom1+Wrrd0 offset=0, "Hi" (to_xml):
> #=>          SyntaxNode offset=0, "H"
> #=>          SyntaxNode offset=1, "i"
> #=>        SyntaxNode offset=2, " ":
> #=>          SyntaxNode offset=2, " "
> #=>    SyntaxNode+InlineAtom0+Numz0 offset=3, "123" (to_xml):
> #=>      SyntaxNode offset=3, "1"
> #=>      SyntaxNode offset=4, "2"
> #=>      SyntaxNode offset=5, "3"
> #=>  SyntaxNode offset=6, "\n\n"
>
> p @root.to_xml
> #=> NameError: undefined local variable or method 'wrrd' for
> #<Treetop::Runtime::SyntaxNode:0x5c7808>
>
>
> -_- t1.treetop -_-
>
> grammar T1
>   rule paragraph
>     inline_content "\n\n" {
>       def to_xml
>         "<p>#{inline_content.to_xml}</p>\n"
>       end
>     }
>   end
>
>   rule inline_content
>     items:( item:inline_atom wspace )* last_item:inline_atom {
>       def to_xml
>         all_items.map{ |atom| atom.to_xml }.join( ' ' )
>       end
>       def all_items
>         all = []
>         all << first_item if methods.include?( 'first_item' )
>         all.concat items.elements.map{ |el| el.item }
>         all << last_item if methods.include?( 'last_item' )
>         all
>       end
>     }
>   end
>
>   rule inline_atom
>     numz {
>       def to_xml
>         numz.to_xml
>       end
>     }
>     /
>     wrrd {
>       def to_xml
>         wrrd.to_xml
>       end
>     }
>   end
>
>   rule wrrd
>     [A-Za-z]+ {
>       def to_xml
>         "<word>#{text_value}</word>"
>       end
>     }
>   end
>
>   rule numz
>     ([1-9]+ / '0') {
>       def to_xml
>         "<i>#{text_value}</i>"
>       end
>     }
>   end
>
>   rule wspace
>     [ \t]+
>   end
>
> end
>
>