使用Antlr V3树解析器生成if-then-else评估器

时间:2011-12-14 11:21:33

标签: if-statement antlr interpreter

我正在为一个简单的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();}.)
;

这是有效的,但我并不是真的很满意。还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

我会将逻辑与树语法分开,并创建负责评估输入的自定义节点类。如果你把它全部保留在语法中,它很快就会成为一大堆意大利面,很难维持,IMO。特别是当你扩展语言时。

有关如何执行此操作的示例,请参阅先前的问与答:if then else conditional evaluation

更多相关链接: