parsing and evaluating simple language using javac

2019-05-16 04:06发布

I have simple language like:

funa X ( X+3*funb(1) ) ;
funb Y ( 2*Y ) ;
main ( 2+func(func(1)) ) ;
func A ( funa(A) ) ;

I used CFG to parse above as:

program    => (statement)+
statement  => (<main_keyword> | <idl> <idu>) <lparan> expression <rparan> <semicolon>
expression => T(<plus> T)*
T          => P(<multipliation>P)*
P          => <idu> | <idl> <lparan> expression <rparan> | <number>

And token recognizing:

<main_keyword>   -> "main"
<idl>            -> (["a"-"z"])+
<idu>            -> (["A"-"Z"])+
<lparan>         -> "("
<rparan>         -> ")"
<semicolon>      -> ";"
<number>         -> (["0"-"9"])+
<plus>           -> "+"
<multiplication> -> "*"

I am able to parse above using javaCC, but I dont have idea, how to evaluate above such programs with parser. Above program should evaluate to 15. How to implement such in javaCC, will it be possible using augmenting parser productions? Functions can appear at any place, before call or after call.

Thanks

1条回答
爱情/是我丢掉的垃圾
2楼-- · 2019-05-16 04:39

You can do this by letting JavaCC create an AST for you 1, and then creating custom nodes while you walk the tree. Once your tree is constructed, you invoke the root node's eval(...) method to evaluate the entire expression/tree.

A demo of how to evaluate simple expressions with JavaCC + JJTree: http://www.cs.nmsu.edu/~rth/cs/cs471/InterpretersJavaCC.html

A more extensive example, including functions: https://github.com/bkiers/Curta


1 https://javacc.java.net/doc/JJTree.html

查看更多
登录 后发表回答