2017-03-14 44 views
1

我一直在爲Z語言(ISO UTF版本)開發antlr4語法,規範要求lex階段,然後進行「2階段」解析。 您首先將它放入一堆NAME(或DECORWORD)標記中,然後根據spec的解析器語法中的operatorTemplate規則解析結果標記,替換適當的標記,最後解析新修改的標記流以獲取AST 。ANTLR4中的動態運算符優先級和關聯性?

我有上面的工作,但我不知道如何動態地設置解析器規則的優先級和關聯性,所以解析樹是錯誤的。

操作語法如下(數字優先):

-generic 5 rightassoc (_ → _) 
-function 65 rightassoc (_ ◁ _) 

我看不出有任何的API來設置規則的相關性,所以我嘗試用語義斷言,這樣的:

expression: 
: {ZSupport.isLeftAssociative()}? expression I expression 
| <assoc=right> expression i expression 
; 

expression: 
: {ZSupport.isLeftAssociative()}? expression i expression 
| <assoc=right> {ZSupport.isRightAssociative()}? expression I expression 
; 

但後來我得到「的規則下集是相互左重草書[表達]「

可以這樣做嗎?

+0

請參閱TDAR的第70頁關於如何在ANTLR中指定關聯性的討論。 – GRosenberg

回答

0

我能夠通過移動語義謂詞來實現:

expression: 
: expression {ZSupport.isLeftAssociative()}? I expression 
| <assoc=right> expression I expression 
; 

我的印象是,這是不打算在此基礎上討論工作下: https://stackoverflow.com/a/23677069/7711235

...但它確實在我所有的測試案例中都能正常工作......