ANTLR识别单个字符

ANTLR识别单个字符,antlr,antlr4,Antlr,Antlr4,我很确定这是不可能的,但我想问问以防万一 我有公共ID令牌定义: ID: LETTER (LETTER | DIG)*; 问题是,在我需要解析的语法中,有一些指令使用单个字符作为操作数,如: a + 4 但是 这是不可能的 所以我不能写这样的规则: sum: (INT | LETTER) ('+' (INT | LETTER))* 因为由于ID的优先级较高,LeXER会考虑“A”作为ID(并且我不能改变优先级,因为它不能识别单个字符ID),所以 所以在那个规则中我只能用ID代替字母。这很难

我很确定这是不可能的,但我想问问以防万一

我有公共ID令牌定义:

ID: LETTER (LETTER | DIG)*;
问题是,在我需要解析的语法中,有一些指令使用单个字符作为操作数,如:

a + 4
但是

这是不可能的

所以我不能写这样的规则:

sum: (INT | LETTER) ('+' (INT | LETTER))*

因为由于ID的优先级较高,LeXER会考虑“A”作为ID(并且我不能改变优先级,因为它不能识别单个字符ID),所以

所以在那个规则中我只能用ID代替字母。这很难看,因为不应该有ID,只有一个字母,我将不得不做第二次语法分析来检查这一点

我知道这没什么好做的,因为lexer不理解上下文。我在想,也许已经有了内置的ANTLR4,这是一种在规则中检查令牌长度的方法。比如:

sum: (INT | ID{length=1})...
我还想知道是否存在某种“令牌别名”,以便我可以:

SINGLE_CHAR is alias of => ID
为了避免在规则中写入“ID”,因为这可能会造成混淆


PD:我不是在解析像这样的简单语言,这只是一个小例子。实际上,ID也可以是字符串,还有其他标记只能是字母的子集,等等。。。所以我想我必须在解析条目之后进行第二次分析,以检查语法是否合法。我只是好奇这样的东西是否存在。

检查标识符的大小是一个语义问题,因此应该在语义阶段处理,通常在解析步骤之后。使用常用的ID规则解析输入,并在构造的解析树中检查已识别ID的大小(并相应地采取行动)。不要试图在语法中强制执行此类决定。

检查标识符的大小是一个语义问题,因此应该在语义阶段处理,通常在解析步骤之后。使用常用的ID规则解析输入,并在构造的解析树中检查已识别ID的大小(并相应地采取行动)。不要试图把这种决定强加于你的语法。

为什么不把整个语法告诉我们?这感觉像是,我宁愿帮你解决真正的问题。你为什么不给我们看一下整个语法?这感觉像是,我宁愿帮助你解决真正的问题。
SINGLE_CHAR is alias of => ID