4

我有简单的语言,如:

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 中实现这样的,是否可以使用扩充解析器产生?函数可以出现在任何地方,调用前或调用后。

谢谢

4

1 回答 1

3

您可以通过让 JavaCC 为您创建一个 AST 来做到这一点1,然后在您遍历树时创建自定义节点。构建树后,调用根节点的eval(...)方法来评估整个表达式/树。

如何使用 JavaCC + JJTree 评估简单表达式的演示:http ://www.cs.nmsu.edu/~rth​​/cs/cs471/InterpretersJavaCC.html

一个更广泛的例子,包括函数:https ://github.com/bkiers/Curta


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

于 2013-04-24T11:46:28.637 回答