2012-08-23 56 views
1

我寫了一個ANTLR語法,現在正在從它構建AST的過程中。現在的問題是,根據上下文,不同的子樹應該根據規則生成。 Googeling給了我這個:ANTLR3,上下文敏感的重寫規則

http://www.antlr.org/wiki/display/~admin/2008/04/11/Rewrite+rules#Rewriterules-Grammaticalcontext

但我不能從這些例子得到語法正確。所以問題是:在ANTRL3.4中使用上下文敏感重寫的正確語法是什麼(使用C-target,如果這些信息有用)?

一個小例子,在這裏,我不工作的一項試驗,以得到它的工作:

grammar foo; 

tokens { 
    A; 
    B; 
} 

start 
    : a 
    | b 
    ; 

a 
    : foo 
    ; 

b : foo 
    ; 

foo 
    : 
    [... a foo]: 'x' -> ^(A 'x') 
    [... b foo]: 'x' -> ^(B 'x') 
    ; 

感謝, 約斯特

回答

2

這是從維基條目不是太清楚,但多數的語法是無效的:他們是一些想法的一部分,它們中有一些不是(...沒有)。

要確定從哪個規則foo,你可以將參數添加到foo和檢查參數在重寫規則:

grammar T; 

options { 
    // tested with Java, not C, but C should also work "as is" 
    //language=C; 
    output=AST; 
} 

tokens { 
    A; 
    B; 
} 

parse 
: (a | b)+ EOF! 
; 

a 
: 'a' foo[1] -> foo 
; 

b 
: 'b' foo[2] -> foo 
; 

foo[int param] 
: 'x' -> {param==1}? ^(A 'x') 
     ->    ^(B 'x') 
; 

SPACE : ' ' {$channel=HIDDEN;}; 

分析輸入"a x b x"會導致以下AST:

enter image description here

+0

好吧,所以要走的路是「手動」添加功能。對於這個東西有一個特殊的語法會很好,因爲這似乎是一個常見的用例。另一方面,更多的語法結構會混淆ANTLR語言......無論如何,謝謝你的回答。 – Jost

+0

@Jost,不客氣。 –