在ANTLR v3中,可以使用句法謂詞來解決歧義問題,即明確告訴ANTLR應選擇哪種替代方法。 ANTLR4似乎只是接受類似歧義的語法,但在解析過程中會報告這些歧義。它產生了一個分析樹,儘管有這些含糊之處(根據文檔,通過選擇第一個備選方案)。但是,如果我想要它選擇其他替代方法,我該怎麼辦?換句話說,我該如何明確解決歧義?在更復雜的情況下(而不是句法謂詞)解決ANTLR4中的歧義有什麼用?
(對於懸掛其他問題的簡單情況看:What to use in ANTLR4 to resolve ambiguities (instead of syntactic predicates)?)
更復雜的例子:
如果我有這樣一個規則:
expr
: expr '[' expr? ']'
| ID expr
| '[' expr ']'
| ID
| INT
;
這將解析foo[4]
如(expr foo (expr [ (expr 4) ]))
。但我可能想將其解析爲(expr (expr foo) [ (expr 4) ])
。 (也就是說,如果可能的話,總是採取第一種選擇,這是第一種選擇,所以根據文檔,它應該有更高的優先級,那麼爲什麼它會生成這棵樹呢?)
如果我理解正確,有2個解決方案:
基本上實現與語義謂詞的語法謂詞(但是,我不知道怎麼樣,在這種情況下)。
重構語法。
例如,e
替換expr
:
e : expr | pe
;
expr
: expr '[' expr? ']'
| ID expr
| ID
| INT
;
pe : '[' expr ']'
;
這似乎是工作,雖然語法變得更加複雜。
我可能誤解了一些事情,但這兩種解決方案看起來都不像語法謂詞那麼優雅和複雜。雖然,我喜歡??
運算符的懸而未決問題的解決方案。但我不確定如何在這種情況下使用。可能嗎?
我更新了您的示例,使用運算符'''''''而不是'('和')'來向讀者說明在LISP語法中打印時示例的形式。 –