我使用的是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); }