If statement 使用Antlr V3树解析器生成if-then-else计算器
我正在为一个简单的DSL编写一个解释器,并想知道如何优雅地实现if-then-else evaluator。我在antlr.org在线找到了一个示例,但它实际上使用了CommonTreeNodesTeam中的getNodeIndex(),它受到保护,因此没有任何用处。我只能做到以下几点: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
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创建小型动态语言的我的博客: