2011-12-14 49 views
1

我正在写一个解释一个简单的DSL,不知道如何优雅地实现IF-THEN-ELSE评估。我从antlr.org网上找到了一个例子,但它实际上使用了CommonTreeNodeStream中的getNodeIndex(),它受到保护,所以没用。我能做的最好的是以下几点:生成的if-then-else的评估ANTLR的V3树分析器

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

我的逻辑从树语法分开并创建自定义节点类是负责评估的输入。如果你把它全部放在语法中,它很快就会变成一堆意大利面,这很难维护,国际海事组织。特别是当你扩展语言时。

有关如何做到这一点的例子,请参阅thie之前常见&答:if then else conditional evaluation

一些更相关链接:

+0

感谢。我实际上使用访问者模式编写了自己的评估者,但是他决定用树语法去分析一下,看看它是否可行。我现在可以更清楚地看到利弊。很多“如何正确地做X”是惯例而不是硬性规则,我肯定需要用Antlr来学习:) – ntrolls 2011-12-14 14:42:40