2010-12-09 17 views

回答

1

這有點棘手。您可能通過匹配的 「OR鏈」 之前使用syntactic predicate(LOOK-AHEAD-TOKENS-HERE)=>做到這一點:

expr 
    : (atom '|')=> atom ('|' atom)+ -> ^('|' atom+) 
    | atom 
    ; 

其妥善處理a|b|ca|ba

但是,您可能想要解釋您實際嘗試解析的語言:可能會有更好(更優雅?)的表達方式。

爲什麼你不想要在你的第一個圖中有一個AST?當根(操作數)只有兩個孩子時,評估表達式很容易,對吧?

0
parse : expr EOF -> ^(ROOT expr); 
expr : atom ('|'^ atom)* -> atom+; 
atom : LITERAL | ('('! expr ')'!); 

LITERAL : 'a'..'z'; 
WS  : (' '|'\t'|'\r'|'\n'){Skip();}; 

我認爲這將通過添加重寫規則來實現,但我現在沒有antlrworks,所以我無法確定。但是它很接近,所以給它一些注意事項,並在必要時修改重寫語法。

+1

這是行不通的:你不能在規則中將`^`和` - >`混合在一起。如果你從`expr`中刪除`^`,它就不能正確解析單個`LITERAL`。嘗試一下。 – 2010-12-09 22:07:59

+0

無賴......我剛剛想出了一些類似的東西,``atom('|'atom)* - > ^('|'atom +);`有一個`|`的時候效果很好,但是如果Bart說的話會失敗。 – mpen 2010-12-09 22:28:47

相關問題