2014-01-29 50 views
2

在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個解決方案:

  1. 基本上實現與語義謂詞的語法謂詞(但是,我不知道怎麼樣,在這種情況下)。

  2. 重構語法。

例如,e替換expr

e : expr | pe 
    ; 

expr 
    : expr '[' expr? ']' 
    | ID expr 
    | ID 
    | INT 
    ; 

pe : '[' expr ']' 
    ; 

這似乎是工作,雖然語法變得更加複雜。

我可能誤解了一些事情,但這兩種解決方案看起來都不像語法謂詞那麼優雅和複雜。雖然,我喜歡??運算符的懸而未決問題的解決方案。但我不確定如何在這種情況下使用。可能嗎?

+0

我更新了您的示例,使用運算符'''''''而不是'('和')'來向讀者說明在LISP語法中打印時示例的形式。 –

回答

0

您或許可以通過將ID替代方案置於ID expr以上來解決此問題。當左遞歸被消除時,所有不剩下遞歸的選項都會在你遞歸的選擇之前被解析。

對於您的示例,第一個非左遞歸替代ID expr與整個表達式匹配,因此沒有什麼需要解析之後。

+0

我嘗試將ID放在ID expr以上。不幸的是,這並沒有解決問題,我仍然得到同一棵樹。 – user3246110

相關問題