如何解决在 javacc 中以相同标记开头的两个选择之间的冲突

How to resolve conflict between two choices starting with same tokens in javacc

我正在尝试为某些特定格式的消息编写编译器。 如果我简化它,我的问题是:

< WORD : ([LETTER]){2,5}>
< ANOTHER_WORD : (<LETTER>|<DIGIT>){1,5}>
< SPECIAL_WORLD : "START">

void grammar():
{
}
{ 
 <WORD><ANOTHER_WORD>
| <SPECIAL_WORD><ANOTHER_WORD>
}

这里我的特殊词总是被匹配为一个WORD,这当然是合乎逻辑的,但是由于冲突是在制作的开始我不知道如何解决它。 一些帮助将不胜感激。

START 的规则放在第一位。与大多数词法扫描器生成器一样,JavaCC 使用选择最长的可能标记匹配的规则,然后,如果应用两个或多个模式,则选择其中的第一个。

因此,您的 ANOTHER_WORD 规则只会在 WORD 不匹配的情况下匹配,因此它只会匹配长度为 1 或包含数字的单词。

您似乎希望解析器状态影响词汇标记的识别方式。通常,词法扫描器不是这样工作的,但是您可以使用 lexical states.

实现有限形式的上下文扫描