2013-05-28 114 views
4

我有一個語法規則是這樣的:處理ANTLR返回值

a returns [string expr] : (b | c) {$expr = "Build expression from b OR c here";} 

b returns [string expr] : 'B' {$expr = "From b";} 

c returns [string expr] : 'C' {$expr = "From c";} 

我想用在任何從B或返回$ expr的變量使指令以替換

$expr = "Build expression from b OR c here"; 

C。我知道有通過執行這項任務像這樣一個解決方案:

a returns [string expr] : b {$expr = $b.expr;} | c {$expr = $c.expr;} 

,但不知道是否有一個更簡單的方法類似命名整個集團具有可變和使用,而不是:

a returns [string expr] : group = (b | c) {$expr = $group.expr;} 

我試過這個,它在ANTLR中不起作用,即使組變量用於獲取由「b」返回的值。

+0

-1用於將ANTLR語法轉換爲非ANTLR語法,僅用於發佈有關ANTLR語法的問題。這個' - >'運算符是什麼?這是ANTLR 3中的重寫操作符和ANTLR 4中的詞法分析器命令操作符,但是您似乎將其用於其他目的? –

回答

3

對於多個非終端,您不能使用相同的標籤,除非它們在語法中引用相同的規則。這意味着像group=(A | B)這樣的語法僅適用於令牌引用(AB是終端)。以下語法可用於此。

a returns [string expr] 
    : b {$expr = $b.expr;} 
    | c {$expr = $c.expr;} 
    ;