2016-05-12 40 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 : .... ;