我很确定这是不可能的,但我想问一下以防万一。
我有公共ID令牌定义:
ID: LETTER (LETTER | DIG)*;
问题是在我需要解析的语法中,有一些指令,其中你有一个字符作为操作数,如:
a + 4
但
ab + 4
是不可能的。
所以我不能写出如下规则:
sum: (INT | LETTER) ('+' (INT | LETTER))*
由于ID的优先级较高,词法分析器会将'a'视为ID。 (而且我无法更改该优先级,因为它无法识别单个字符ID)
所以我只能在该规则中使用ID而不是LETTER。这很丑陋,因为不应该有一个ID,只有一个字母,我将不得不做第二次语法分析来检查。
我知道它没有任何关系,因为词法分析者不理解上下文。我在想,也许已经内置的ANTLR4是一种检查规则内令牌长度的方法。类似的东西:
sum: (INT | ID{length=1})...
我还想知道是否存在某种“令牌别名”,所以我可以这样做:
SINGLE_CHAR is alias of => ID
为了避免在规则中写“ID”,因为这可能会造成混淆。
PD:我没有解析像这样的简单语言,这只是一个小例子。实际上,ID也可以是一个字符串,还有其他标记只能是字母的子集等等......所以我认为在解析条目之后我还是要进行第二次分析以检查语法是否合法。我很好奇是否存在这样的事情。答案 0 :(得分:2)
检查标识符的大小是一个语义问题,因此应该在语义阶段处理,这通常在解析步骤之后。使用通常的ID规则解析您的输入,并在构造的解析树中检查已识别的ID的大小(并相应地执行)。不要试图将这种决定强加到你的语法中。