1
我有一個帶有替代標籤的解析器規則。
我想實現當任何標籤都是很好的參觀了訪問者方法:所有標籤的訪問方法
someRule
: 'a' #aLabel
| 'b' #bLabel
| 'c' #cLabel
;
我需要一些像這樣的方法:
T visitSomeRule(SomeRuleContext ctx)
我有一個帶有替代標籤的解析器規則。
我想實現當任何標籤都是很好的參觀了訪問者方法:所有標籤的訪問方法
someRule
: 'a' #aLabel
| 'b' #bLabel
| 'c' #cLabel
;
我需要一些像這樣的方法:
T visitSomeRule(SomeRuleContext ctx)
像你這樣的標籤,你會結束了類似:
override VisitAlabel(aLabelRuleContext) {....}
override VisitBlabel(bLabelRuleContext) {....}
override VisitClabel(cLabelRuleContext) {....}
然而,增加的替代標籤,使ANTLR4不生成一般上下文類SomeRuleContext
在你上面的例子中。不可能混合使用兩者。非此即彼。如果你想獲得SomeRuleContext
則必須刪除標籤並檢查處理器內部的替代上下文的SomeRuleContext.
我的源:這個和權威ANTLR4參考由特倫斯·帕爾的經驗,第120頁。
也許我可以重寫訪問方法並檢查參數的類型?儘管如此,這看起來像是一種拙劣的方式。 – Midnightas
是的,這就是我在回答中所指的。如果您閱讀Terence Parr關於替代標籤的書,很明顯這個功能是通過更加集中的子類來增加「更精確」的上下文。而且我發現我更喜歡在我的大部分工作中使用標籤。但是,如果你確實需要更高層次的上下文,那麼你肯定可以遍歷它的子節點,檢查它們的類型,並單獨對它們執行操作。這是可能的,我已經做到了。直到我瞭解到替代標籤。 ;) – TomServo