ANTLR:Lexer抛出NoViableAltException

时间:2013-02-28 13:08:53

标签: antlr antlr3

经过几周的休息,是时候再次与ANTLR战斗了......

无论如何,我定义了以下Lexer令牌:

fragment EQ: '=';
fragment NE: '<>';

BOOLEAN_FIELD
  : ('ISTRAINED'|'ISCITIZEN')
  ;

BOOLEAN_CONSTANT
  : ('TRUE'|'FALSE'|'Y'|'N')
  ;

BOOLEAN_LOGICAL
  : BOOLEAN_FIELD (EQ|NE) (BOOLEAN_FIELD|BOOLEAN_CONSTANT)
  ;

不幸的是,BOOLEAN_LOGICAL标记在简单的术语上抛出NoViableAltException,例如“ISTRAINED = ISTRAINED”。

我知道一些响应将是“这应该在解析器中”。它之前在解析器中,我试图将一些简单的项目卸载到词法分析器,因为我只需要“是/否,这个文本块是否有效?”

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

BOOLEAN_LOGICAL不应该是词法分析器规则。词法分析器规则必须(或应该)是单个令牌。作为词法分析器规则,BOOLEAN_FIELD(EQ|NE)之间不能有任何空格(您可能在lexing期间跳过了空格,但这只会导致从解析器内部跳过空格规则!)。

请改为:

boolean_logical
  : BOOLEAN_FIELD (EQ|NE) (BOOLEAN_FIELD|BOOLEAN_CONSTANT)
  ;

这也意味着EQNE不再是fragment规则:

EQ : '=';
NE : '<>';

答案 1 :(得分:1)

这看起来应该是解析器规则。但是,如果要将其保留为词法分析器规则,则需要允许空格。

BOOLEAN_LOGICAL
  : BOOLEAN_FIELD WS+ (EQ|NE) WS+ (BOOLEAN_FIELD|BOOLEAN_CONSTANT)
    ;