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

时间:2014-05-12 04:27:20

标签: antlr grammar antlr3

ANTLR Lexer规则设计

我需要以下令牌:

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

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

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

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

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

问题是词法分析器规则“AlphaNumericSpaceHyphen”在“水运”之后消耗了空格和左方括号,之后词法分子意识到没有匹配,因为它太过分了。

我已尝试过各种类型的谓词,并且没有任何运气就可以向前看。非常感谢任何帮助。

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|'-'))?   
        ;

1 个答案:

答案 0 :(得分:0)

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

ANTLR lexer rule consumes characters even if not matched?

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

希望这会对你有所帮助。