If statement 使用Antlr V3树解析器生成if-then-else计算器

If statement 使用Antlr V3树解析器生成if-then-else计算器,if-statement,antlr,interpreter,If Statement,Antlr,Interpreter,我正在为一个简单的DSL编写一个解释器,并想知道如何优雅地实现if-then-else evaluator。我在antlr.org在线找到了一个示例,但它实际上使用了CommonTreeNodesTeam中的getNodeIndex(),它受到保护,因此没有任何用处。我只能做到以下几点: ifblock @init { int t = 0; int f = 0; } @after { if(c) stream.push(t); else stream.push(f

我正在为一个简单的DSL编写一个解释器,并想知道如何优雅地实现if-then-else evaluator。我在antlr.org在线找到了一个示例,但它实际上使用了CommonTreeNodesTeam中的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();}.)
;

这是可行的,但不知怎的,我并不是很满意。有更好的方法吗?

我将把逻辑从树语法中分离出来,创建负责评估输入的自定义节点类。如果你把它都放在语法里,它很快就会变成一大堆意大利面,我认为这很难维持,特别是当你扩展语言的时候

有关如何执行此操作的示例,请参见前面的问答:

更多相关链接:

  • Scott Stanchfield优秀的ANTLR v3视频博客系列:
  • 关于使用ANTLR创建小型动态语言的我的博客:

我会将逻辑与树语法分离,并创建负责评估输入的自定义节点类。如果你把它都放在语法里,它很快就会变成一大堆意大利面,我认为这很难维持,特别是当你扩展语言的时候

有关如何执行此操作的示例,请参见前面的问答:

更多相关链接:

  • Scott Stanchfield优秀的ANTLR v3视频博客系列:
  • 关于使用ANTLR创建小型动态语言的我的博客:

谢谢。实际上,我一开始就使用访问者模式编写了自己的评估器,但决定尝试使用树语法,只是为了看看它是否真的可行。我现在可以更清楚地看到利弊。很多“如何正确地执行X”都是惯例,而不是硬性规定,我肯定需要通过Antlr了解这一点:)谢谢。实际上,我一开始就使用访问者模式编写了自己的评估器,但决定尝试使用树语法,只是为了看看它是否真的可行。我现在可以更清楚地看到利弊。很多“如何正确地执行X”都是惯例,而不是硬性规定,我肯定需要通过Antlr了解这一点:)