使用javacc解析和评估简单语言

时间:2013-04-24 10:45:49

标签: java parsing compiler-construction javacc

我的语言很简单:

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中实现这个,是否可以使用扩充解析器生成?在通话前或通话后,功能可以出现在任何地方。

由于

1 个答案:

答案 0 :(得分: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