【问题标题】:ANTLR lexer rule consumes too muchANTLR 词法分析器规则消耗太多
【发布时间】:2014-06-29 08:15:02
【问题描述】:

ANTLR 词法分析器规则设计

我需要以下令牌:

  • 允许的字符包括大写、小写、数字、空格和连字符
  • 不定长度(长度必须至少为两个字符)
  • 标记必须至少包含一个空格或连字符
  • 标记必须以大写、小写、数字、空格或连字符开头和结尾(不能以空格开头或结尾)

下面语法中的 ANTLR 词法分析器规则“AlphaNumericSpaceHyphen”几乎可以工作,除了一种情况。使用解析器规则“sic”进行测试,将解析以下输入(不带引号):

“标准工业分类:水运[4400]”

以下输入无法解析(不带引号):

“标准工业分类:水运 [4400]”

问题在于词法分析器规则“AlphaNumericSpaceHyphen”在词法分析器意识到没有匹配项之前消耗了“WATER TRANSPORTATION”之后的空格和左方括号,因为它走得太远了。

我尝试过各种类型的谓词,但没有任何运气。非常感谢任何帮助。

grammar T;

sic: SICSpecifier AlphaNumericSpaceHyphen  LEFTBRACKET Digits RIGHTBRACKET;

LEFTBRACKET  
:   '[';  

RIGHTBRACKET 
:   ']';

SICSpecifier: 'STANDARD INDUSTRIAL CLASSIFICATION:';

WS : (' '|'\t')+ 
{   
  $channel = HIDDEN;  
};  

fragment UCASEALPHA : 'A'..'Z';
fragment LCASEALPHA : 'a'..'z';
fragment DIGIT : '0'..'9';
Digits: DIGIT+;

AlphaNumericSpaceHyphen 
:           (UCASEALPHA|LCASEALPHA |DIGIT|'-')+  (' ' (UCASEALPHA|LCASEALPHA |DIGIT|'-')+)+   
        |   (UCASEALPHA|LCASEALPHA |DIGIT)+ ('-')+  ((' '|UCASEALPHA|LCASEALPHA |DIGIT|'-')* (UCASEALPHA|LCASEALPHA |DIGIT|'-'))?
        |   ('-')+ (UCASEALPHA|LCASEALPHA |DIGIT)+  ((UCASEALPHA|LCASEALPHA |DIGIT|'-'|' ')* (UCASEALPHA|LCASEALPHA |DIGIT|'-'))?   
        ;

【问题讨论】:

    标签: antlr grammar antlr3


    【解决方案1】:

    不幸的是,词法分析器规则没有回溯。你可以看看

    ANTLR lexer rule consumes characters even if not matched?

    您可以尝试调整您的语法,以便您可以按照此解决方案中的建议更改令牌的类型。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多