2016-05-12 122 views
3

我想在antlr4中寫一個語法。但我無法有選擇地忽略我的規則中的空格。附加我的語法。在這裏,如果令牌與alphaNumericWSC匹配,但在所有其他地方我想跳過WHITESPACE,我應該允許一個空格(WHITESPACE的標記)。如何讓antlr語法識別帶有空格的字符串?

WHITESPACE : [ \t\n\r]+ -> skip 
alphaNumericWSC : AlphaNumeric (',' AlphaNumeric)* 
       | AlphaNumeric (' ' AlphaNumeric)* 
       ; 

換句話說,我希望不要忽略這個規則中的空白alphaNumericWSC。

在此先感謝您的幫助。

+2

您應該使用字符串詞法規則,'字符串:「'〜'」「「」'(注意'''是'''沒有空格)ANTLR的詞法分析器的貪婪可以完成這項工作。 – Mephy

+0

空格是用於詞法分析器,而不是解析器。 – EJP

回答

2

給定的詞法分析器空白規則將在它到達解析器之前消耗所有的空白。所以,如果空格對解析器有意義,那麼不要使用它。

ANTLR提供了詞法分析器模式,可用於在空白敏感和不敏感的源區域之間切換。模式確實需要識別可用於在模式之間切換的一些明確的源功能。

所以問題是什麼時候是AlphaNumeric (' ' AlphaNumeric)*有效。如果有具體適用的標記,說:=領導和;尾隨例如,定義模式:

alphaNumericWSC : AlphaNumeric (Comma AlphaNumeric)* 
       | AlphaNumeric (WS AlphaNumeric)* 
       ; 


AlphaNumeric : AlphaNum ; 
Mark   : ':=' -> pushMode(WSS); 
Semi   : ';' ; 
Comma   : ',' ; 
WHITESPACE : [ \t\n\r]+ -> skip; 

mode WSS; 
WS   : ' '+ ; 
AlphaNumeric2 : AlphaNum -> type(AlphaNumeric); 
Semi2   : ';'  -> type(Semi), popMode(); 
WHITESPACE2 : [\t\n\r]+ -> skip; 

fragment AlphaNum : .... ;