我正在为一个简单的DSL编写一个解释器,并想知道如何优雅地实现if-then-else评估器。我在antlr.org网上找到了一个例子,但它实际上使用了CommonTreeNodeStream中的getNodeIndex(),它受到保护,所以没用。我能做的最好的事情如下:
ifblock
@init
{
int t = 0;
int f = 0;
}
@after
{
if(c)
stream.push(t);
else
stream.push(f);
statements(); // handle the statements in then or else branch
stream.pop()
}
: ^(IF c=condition {t = input.mark();}. {f = input.mark();}.)
;
这是有效的,但我并不是真的很满意。还有更好的方法吗?
答案 0 :(得分:1)
我会将逻辑与树语法分开,并创建负责评估输入的自定义节点类。如果你把它全部保留在语法中,它很快就会成为一大堆意大利面,很难维持,IMO。特别是当你扩展语言时。
有关如何执行此操作的示例,请参阅先前的问与答:if then else conditional evaluation
更多相关链接: