如何让antlr语法识别带有空格的字符串?

时间:2016-05-12 23:43:30

标签: java parsing grammar antlr4

我正在尝试在antlr4中编写语法。但我无法有选择地忽略我的规则中的空格。附上我的语法。如果令牌匹配alphaNumericWSC,我应该允许一个空格(WHITESPACE的标记)但是在我想要跳过WHITESPACE的所有其他地方。

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

换句话说,我不想忽略此规则alphaNumericWSC中的空格。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分: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 : .... ;