在使用antlr 3时,如何从解析器表达式中获得求值结果?

在使用antlr 3时,如何从解析器表达式中获得求值结果?,antlr,antlr3,expression-evaluation,Antlr,Antlr3,Expression Evaluation,我使用的是ANTLR3.5。我想建立一个计算布尔表达式的语法,比如 x=true; b=false; c=true; a=x&&b||c; 并通过Java调用返回计算结果(如上述条目的ExprParser.eval()将返回true) 我将期待一个示例。您可以执行以下操作(使用的上下文): 首先,声明一个成员以存储最新的评估结果: @members { private int __value; } 然后,在计算某个东西时设置它 stat: expr NEWLINE

我使用的是ANTLR3.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
s时返回它:

// 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); }
@成员
{ 
公共事件行动;
}
stat:expr新行{Computed($expr.value);}

请查看此示例。它将结果打印到控制台,而不是返回结果,并使用不同的运算符,但想法大致相同。@Iaroslav感谢您的回答。我遵循了这个示例,但仍然不知道如何从Java调用中检索计算结果。基本上,从这个示例中,我希望调用
parser.prog()
返回表达式含义的计算
int result=parser.prog()
prog()引用表达式列表,其中一些表达式可以返回值。您想只获取最后一个还是所有结果?