当使用antlr时,如何从解析器表达式获得评估结果



我使用的是ANTLR 3.5。我想构建一个语法来计算布尔表达式,如

x=true;
b=false;
c=true;
a=x&&b||c;

并通过Java调用返回计算结果(如上面条目的ExprParser.eval()将返回true)

你可以这样做(使用我在问题的评论中链接到的语法上下文):

首先,声明一个成员来存储最新的求值结果:

@members {
    private int __value;
}

然后,当你计算一些东西时设置它

stat:   expr NEWLINE { __value = $expr.value; } | // rest of the stat entry

最后,在计算完所有stat时返回它:

// will return 0 if no expr blocks were evaluated
public prog returns [int value]:   stat+ {$value = __value;};

在c#中,我使用了稍微不同的方法——我向解析器中添加了一个事件,并在可以计算表达式结果时引发它。客户机可以订阅此事件并接收所有计算结果。

@members
{ 
    public event Action<int> Computed;
}
stat:   expr NEWLINE  { Computed($expr.value); }

最新更新