在使用antlr 3时,如何从解析器表达式中获得求值结果?
我使用的是ANTLR3.5。我想建立一个计算布尔表达式的语法,比如在使用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
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()引用表达式列表,其中一些表达式可以返回值。您想只获取最后一个还是所有结果?