【问题标题】:How to get antlr grammar recognize strings with white space?如何让 antlr 语法识别带有空格的字符串?
【发布时间】:2016-05-12 23:43:30
【问题描述】:

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

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

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

提前感谢您的帮助。

【问题讨论】:

  • 您应该对字符串使用词法规则,string: '"' ~'"' '"'(注意 '"' 是 ' " ' 没有空格)。 ANTLR 的词法分析器的贪婪将完成这项工作。
  • 空白用于词法分析器,而不是解析器。

标签: java parsing grammar antlr4


【解决方案1】:

给定的词法分析器空白规则将在到达解析器之前消耗所有空白。因此,如果空格对解析器很重要,请不要使用它。

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 : .... ; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多