我正在尝试在antlr4中编写语法。但是我无法有选择地忽略规则中的空格。附上我的语法。如果 token 与alphaNumericWSC匹配,那么在这里我应该允许一个空格(WHITESPACE的 token ),但是在所有其他地方,我想跳过WHITESPACE。
WHITESPACE : [ \t\n\r]+ -> skip
alphaNumericWSC : AlphaNumeric (',' AlphaNumeric)*
| AlphaNumeric (' ' AlphaNumeric)*
;
换句话说,我不想仅在此规则alphaNumericWSC中忽略空白。
在此先感谢您的帮助。
最佳答案
给定的词法分析器空白规则将在到达解析器之前消耗所有空白。因此,如果空格对解析器很重要,请不要使用它。
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 : .... ;