2015-10-24 46 views
1

在特倫斯·帕爾的Definitiv ANTLR參考39頁是這樣定義的任務IST上:ANTLR V4多任務

stat: expr (NL|SEMI)   # printExpr 
| var EQL expr (NL|SEMI)  # assign  // x = 5; y = x  
| (NL|SEMI)      # blank 
; 
... 
WS : [ \r\t]+ -> skip; 
NL : '\r' ? '\n'; 
SEMI: ';'; 
... 

這工作得很好。

但是,我怎樣才能達到這樣的效果x = 6 y = x

這裏:兩個賦值由單一的空白(WS被跳過,順便說一句。)

回答

1

設計依賴於偶然的空白意義的語言是幾乎總是一個壞主意,並moreso試圖解析時分離它使用上下文無關的解析器。也就是說,有兩種選擇,至少在這個例子中:

首先,將WS置於隱藏通道上。然後,使用一個謂詞來測試令牌流中的WS令牌它是顯著:

| var EQL expr ({atWS()}? | NL | SEMI) # assign 

其次,不要隱瞞或忽略WS。然後,使用像任何其他標記,它應該是顯著:

| var WS? EQL WS? expr (WS | NL | SEMI) # assign 

而且,添加一條規則來捕捉其他未使用的WS

ws: WS ; // will pollute the parse tree, but can be ignored there 

這兩種選擇都有後果,中度至重度,取決於什麼你正在努力完成。