经过几周的休息,是时候再次与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”。
我知道一些响应将是“这应该在解析器中”。它之前在解析器中,我试图将一些简单的项目卸载到词法分析器,因为我只需要“是/否,这个文本块是否有效?”
感谢任何帮助。
答案 0 :(得分:2)
BOOLEAN_LOGICAL
不应该是词法分析器规则。词法分析器规则必须(或应该)是单个令牌。作为词法分析器规则,BOOLEAN_FIELD
和(EQ|NE)
之间不能有任何空格(您可能在lexing期间跳过了空格,但这只会导致从解析器内部跳过空格规则!)。
请改为:
boolean_logical
: BOOLEAN_FIELD (EQ|NE) (BOOLEAN_FIELD|BOOLEAN_CONSTANT)
;
这也意味着EQ
和NE
不再是fragment
规则:
EQ : '=';
NE : '<>';
答案 1 :(得分:1)
这看起来应该是解析器规则。但是,如果要将其保留为词法分析器规则,则需要允许空格。
BOOLEAN_LOGICAL
: BOOLEAN_FIELD WS+ (EQ|NE) WS+ (BOOLEAN_FIELD|BOOLEAN_CONSTANT)
;