我试图为某些特定格式的消息编写编译器。 如果我简化它,我的问题是:
< WORD : ([LETTER]){2,5}>
< ANOTHER_WORD : (<LETTER>|<DIGIT>){1,5}>
< SPECIAL_WORLD : "START">
void grammar():
{
}
{
<WORD><ANOTHER_WORD>
| <SPECIAL_WORD><ANOTHER_WORD>
}
在这里,我的特殊词语总是匹配为WORD,这当然是合乎逻辑的,但由于冲突是在制作的开始,我不知道如何解决它。 一些帮助将不胜感激。
答案 0 :(得分:1)
首先放置START
的规则。与大多数词法扫描程序生成器一样,JavaCC使用选择了最长可能令牌匹配的规则,然后,如果应用了两个或更多模式,则选择其中第一个。
因此,ANOTHER_WORD
规则只会在WORD
没有的情况下匹配,因此它只匹配长度为1或包含数字的字词。
您似乎希望解析器状态会影响词汇标记的识别方式。一般而言,这不是词法扫描程序的工作方式,但您可以使用lexical states实现有限形式的上下文扫描。