ANTLR识别单个字符

ANTLR recognize single character

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

我有通用 ID 令牌定义:

ID: LETTER (LETTER | DIG)*;

问题是在我需要解析的语法中,有一些指令是用单个字符作为操作数,比如:

a + 4

但是

ab + 4

不可能。

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

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

因为词法分析器会将'a'视为一个ID,因为ID的优先级更高。 (而且我无法更改该优先级,因为那时它无法识别单个字符 ID)

所以我只能在该规则中使用 ID 而不是 LETTER。这很难看,因为不应该有 ID,只有一个字母,我将不得不进行第二次句法分析来检查它。

我知道对此无能为力,因为词法分析器不了解上下文。我在想,也许已经有内置的 ANTLR4 是一种检查规则内令牌长度的方法。类似于:

sum: (INT | ID{length=1})...

我也想知道有没有什么"token alias"这样我可以做:

SINGLE_CHAR is alias of => ID

为了避免在规则中写"ID",因为那样会造成混淆。

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

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