Parsing Antlr3:无法匹配在lexer规则中使用的解析器规则中的令牌

Parsing Antlr3:无法匹配在lexer规则中使用的解析器规则中的令牌,parsing,grammar,antlr3,lexer,Parsing,Grammar,Antlr3,Lexer,我在Antlr3中有lexer规则: HYPHEN : '-'; TOKEN : HYPHEN CHARS; CHARS : 'a' ..'z'; 解析器规则如下所示: exp : CHARS | some complex expression; parser_rule : exp HYPHEN exp; 如果我尝试将“abc”与parser_规则匹配,它将失败。因为lexer为HYPHEN exp创建标记。我如何才能将其与parser\u规则正确匹配 在ANTLR词法分析器中,使用了能

我在Antlr3中有lexer规则:

HYPHEN : '-';

TOKEN : HYPHEN CHARS;

CHARS : 'a' ..'z';
解析器规则如下所示:

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

如果我尝试将“abc”与parser_规则匹配,它将失败。因为lexer为HYPHEN exp创建标记。我如何才能将其与parser\u规则正确匹配

在ANTLR词法分析器中,使用了能够匹配输入的最长子序列的词法分析器规则。那么你的意见呢

abc-abc
将标记为

CHARS("abc")
TOKEN("-abc")
因此将不匹配预期的
字符连字符字符


您应该考虑将<代码>令牌< /C> >语法分析器规则,而不是LeXER规则。< /P>我不能让HyPHAN字符在我的场景中成为解析器规则。在我的真实案例中,CHARS并不像这样简单。请看一下我的另一个问题:假设ID2在这里作为字符。如果我将其设置为解析器规则,则ID2不匹配,因为ID1已经匹配了它。请参见我的答案,答案类似-您可能试图在lexer中完成一些只能在解析器中完成的事情。假设我已将令牌修改为解析器规则。并考虑上述问题。我有一个大的解析器规则:。。。。。。。。。。。ID1(引用ID1的其他解析器规则)….(连字符ID2)(现在是标记)我不希望ID1与下划线匹配。ID2可以是“abc_def”或正常的“abc”。现在,当它是正常的“abc”时,解析器将失败,因为它期望ID2,但它的标记化为ID1。即使它是'abc_def',flag=true,它也将标记为ID1、下划线、ID1,这将永远不会与ID2匹配。您如何定义

ID1
仅为文本,
ID2
为带有一些下划线的文本,然后定义
identifier1:ID1
identifier2:ID1 | ID2
?这对您的情况是否可行?假设ID1可以匹配一些在ID2 ASSUBE@中无效的额外字符。在这种情况下,identifier2也将与之匹配。我不想让识别者2与之匹配。