2017-06-22 82 views
1

我有一個帶有替代標籤的解析器規則。
我想實現當任何標籤都是很好的參觀了訪問者方法:所有標籤的訪問方法

someRule 
    : 'a' #aLabel 
    | 'b' #bLabel 
    | 'c' #cLabel 
    ; 

我需要一些像這樣的方法:

T visitSomeRule(SomeRuleContext ctx) 

回答

1

像你這樣的標籤,你會結束了類似:

override VisitAlabel(aLabelRuleContext) {....} 
override VisitBlabel(bLabelRuleContext) {....} 
override VisitClabel(cLabelRuleContext) {....} 

然而,增加的替代標籤,使ANTLR4不生成一般上下文類SomeRuleContext在你上面的例子中。不可能混合使用兩者。非此即彼。如果你想獲得SomeRuleContext則必須刪除標籤並檢查處理器內部的替代上下文的SomeRuleContext.

我的源:這個和權威ANTLR4參考由特倫斯·帕爾的經驗,第120頁。

+0

也許我可以重寫訪問方法並檢查參數的類型?儘管如此,這看起來像是一種拙劣的方式。 – Midnightas

+0

是的,這就是我在回答中所指的。如果您閱讀Terence Parr關於替代標籤的書,很明顯這個功能是通過更加集中的子類來增加「更精確」的上下文。而且我發現我更喜歡在我的大部分工作中使用標籤。但是,如果你確實需要更高層次的上下文,那麼你肯定可以遍歷它的子節點,檢查它們的類型,並單獨對它們執行操作。這是可能的,我已經做到了。直到我瞭解到替代標籤。 ;) – TomServo