Compiler construction 如何解决javacc中以相同令牌开始的两个选择之间的冲突

Compiler construction 如何解决javacc中以相同令牌开始的两个选择之间的冲突,compiler-construction,lexer,javacc,Compiler Construction,Lexer,Javacc,我正试图为某些特定格式的消息编写一个编译器。 如果我简化它,我的问题是: < WORD : ([LETTER]){2,5}> < ANOTHER_WORD : (<LETTER>|<DIGIT>){1,5}> < SPECIAL_WORLD : "START"> void grammar(): { } { <WORD><ANOTHER_WORD> | <SPECIAL_WORD><ANOT

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

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

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

<另一个词:(|){1,5}>

无效语法():
{
}
{ 
| 
}
在这里,我的特殊词总是作为一个符合逻辑的词来匹配,但由于冲突是在生产的开始,我不知道如何解决它。
如果您能提供一些帮助,我们将不胜感激。

请将
开始的规则放在首位。与大多数词汇扫描生成器一样,JavaCC使用的规则是选择尽可能长的标记匹配,然后,如果应用了两个或多个模式,则选择其中的第一个

因此,您的
另一个\u单词
规则将仅在
单词
不匹配时匹配,因此它将仅匹配长度为1或包含数字的单词


似乎您希望解析器状态会影响词法标记的识别方式。一般来说,词法扫描器不是这样工作的,但您可以通过使用来实现有限形式的上下文扫描。

谢谢,更改第一行中的顺序实际上解决了这个问题(但使用另一个标记创建了另一个歧义),是否应该
[LETTER]