我的语言很简单:
funa X ( X+3*funb(1) ) ;
funb Y ( 2*Y ) ;
main ( 2+func(func(1)) ) ;
func A ( funa(A) ) ;
我使用CFG解析上面的:
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>
令牌识别:
<main_keyword> -> "main"
<idl> -> (["a"-"z"])+
<idu> -> (["A"-"Z"])+
<lparan> -> "("
<rparan> -> ")"
<semicolon> -> ";"
<number> -> (["0"-"9"])+
<plus> -> "+"
<multiplication> -> "*"
我能够使用javaCC解析上面,但我不知道如何用解析器评估上面这样的程序。上面的程序应该评估为15.如何在javaCC中实现这个,是否可以使用扩充解析器生成?在通话前或通话后,功能可以出现在任何地方。
由于
答案 0 :(得分:3)
您可以通过让JavaCC为您创建一个AST 1 ,然后在遍历树时创建自定义节点来实现此目的。构建树后,调用根节点的eval(...)
方法来计算整个表达式/树。
如何使用JavaCC + JJTree评估简单表达式的演示:http://www.cs.nmsu.edu/~rth/cs/cs471/InterpretersJavaCC.html
更广泛的示例,包括函数:https://github.com/bkiers/Curta