繁体   English   中英

ANTLR词法分析器规则消耗过多

[英]ANTLR lexer rule consumes too much

ANTLR Lexer规则设计

我需要以下令牌:

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

下面的语法中的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词法分析器规则即使不匹配也会消耗字符?

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

希望这会对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM