2017-08-13 121 views
0

有沒有辦法在我需要它們之前跳過令牌?爲了更清楚,這裏是一個語法是儘可能接近我能得到我想要的東西:antlr如何在我需要它之前跳過令牌

grammar example; 

file : statement* EOF ; 
statement : ID EOL 
      | '{' (EOL statement*)? '}' EOL 
      ; 

EOL : ('\r'? '\n' | '\r') -> skip ; 
WHITESPACE : [ \t]+ -> skip ; 

希望我的意圖是明確的:所有的空格(包括換行符)是正常情況下跳過,但我可以要求每當我想換行的存在,所以

foo 
{ 
    bar 
} 
baz 

將符合語法,但不

foo { 
    bar 
} baz 

foo bar 
{ 
    baz 
} 

有沒有辦法做到這一點,或者我只需要在我的語法中輸入很多EOL*

+0

背後的語義目的是什麼?1)「跳過令牌」和2)對語法強加空白要求?如果你能解釋這些要求,這可能會有幫助,因爲它們在我的經驗中是獨一無二的。 – TomServo

+0

@TomServo @TomServo跳過一個標記的目的是爲了它不會被收集到標記中(或者至少,這些標記被丟棄),並且強制空白的意義在於像Swift這樣的東西,在正常情況下,所有的空白都被忽略所以'a = b * 2'和'a = b * 2'相同),但是你可以說一個語句的結尾可以是';'或者行尾,所以你不總是必須寫';'。 – Anonymous

回答

0

不久前我回答了另一個需要相同機制的問題。
查看here瞭解更多詳情。

基本上,您可以通過提供自己的自定義TokenStream來實現此功能,該功能實現了根據設置跳過空白或將其提供給解析器的機制。