[antlr-interest] Another beginner question
Trevor John Thompson
tijet at mac.com
Sat May 28 11:22:14 PDT 2011
Pseudocode:
method evaluate
takes tree
switch
tree.token
case BODY is
foreach kid in tree.children
evaluate kid
case If is
evaluate tree.children[0]
if tree.children[0].result==True then
evaluate tree.children[1]
else for
index := 2
while
index < tree.children.length
loop
switch
tree.children[index].token
case Elseif is
evaluate tree.chldren[index+1]
if tree.children[index+1].result==True then
evaluate tree.children[index+2]
index :+= 3
case Else is
evaluate tree.children[index+1]
index :+= 2
default
error "internal error: unexpected token " tree.children[index].token
case While is
by
evaluate tree.children[0]
while
tree[0].result==True
loop
evaluate tree.children[1]
case '=' is
evaluate tree.children[1]
assign(lookup(tree.children[0]), tree.children[1].result)
tree.result := tree.children[1].result
case ID is
tree.result := lookup(tree).value
case '+' is
evaluate tree.children[0]
evaluate tree.children[1]
tree.result := tree.children[0].result+tree.children[1].result
case '<' is
evaluate tree.children[0]
evaluate tree.children[1]
tree.result := tree.children[0].result<tree.children[1].result
case For is
# I do not know the syntax of your for loop, but you get the idea.
Obviously you need a case for each valid token in the tree, and to take care of types if you distinguish Boolean from Integer and so on; but the direct answer to the question of how to execute each statement of a BODY node is: simply recursively evaluate each child of that node.
On 2011 May 28, at 07:29, David Smith wrote:
> I need to "wrap" a collection of statements as a code body in order
> to mechanize if, for and while loops. In my tree generator, this
> works great as:
>
> prog: body EOF! {if($body.tree!=null)
> System.out.println($body.tree.toStringTree());}
> ;
>
> body : parts -> ^(BODY parts)
> ;
>
> parts:
> ( (stat
> | ifStat) )*
> ;
>
> This produces, for example, [I inserted some newlines to make it legible]
> (BODY (= a 3)
> (= b 4)
> (if (> a b) (BODY (= a (+ b 1)))
> elseif (< a b) (BODY (= b (- a b)) (= c 42) (= d 4))
> else (BODY (= b 4) (= c (- a b)))
> end)
> )
> I intend the Java code that implements 'if' to receive the "children"
> bodies as sub-trees and invoke the original tree walker on the
> appropriate tree. However, I have no idea how the tree walker should
> parse ^(BODY parts) to execute each statement in that body.
> Any ideas?
>
> DMS
>
> David M. Smith http://www.cc.gatech.edu/fac/David.Smith
> Georgia Institute of Technology, College of Computing
> Sent from my ASR-33 Teletype
>
>
> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address
--
Trevor John Thompson (425) 246-4023
net: tijet at me.com
Quidquid Latine dictum sit, altum videtur.
More information about the antlr-interest
mailing list