2011-12-14 78 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