Antlr3: Could not match token in parser rules whic

2019-03-05 10:14发布

问题:

I have lexer rules in Antlr3 as:

HYPHEN : '-';

TOKEN : HYPHEN CHARS;

CHARS : 'a' ..'z';

Parser rule is as:

exp : CHARS | some complex expression;
parser_rule : exp HYPHEN exp;

If I try to match 'abc-abc' with parser_rule, It fails. Because lexer creates TOKEN for HYPHEN exp. How can I match it correctly with parser_rule.

回答1:

In ANTLR lexer, the lexer rule that can match the longest sub-sequence of input is used. So your input

abc-abc

will be tokenized as

CHARS("abc")
TOKEN("-abc")

and therefore will not match the expected CHARS HYPHEN CHARS.

You should consider making TOKEN a parser rule instead of lexer rule.