-1

休息了几个星期,又到了和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 令牌以简单的术语(例如“ISTRAINED = ISTRAINED”)引发 NoViableAltException。

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

任何帮助表示赞赏。

4

2 回答 2

2

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

改为这样做:

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

这也意味着EQ并且NE不再是fragment规则:

EQ : '=';
NE : '<>';
于 2013-02-28T14:08:57.053 回答
1

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

BOOLEAN_LOGICAL
  : BOOLEAN_FIELD WS+ (EQ|NE) WS+ (BOOLEAN_FIELD|BOOLEAN_CONSTANT)
    ;
于 2013-02-28T15:27:47.283 回答