如何解决javacc

时间:2015-08-14 10:49:36

标签: compiler-construction lexer javacc

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

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

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

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

1 个答案:

答案 0 :(得分:1)

首先放置START的规则。与大多数词法扫描程序生成器一样,JavaCC使用选择了最长可能令牌匹配的规则,然后,如果应用了两个或更多模式,则选择其中第一个。

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

您似乎希望解析器状态会影响词汇标记的识别方式。一般而言,这不是词法扫描程序的工作方式,但您可以使用lexical states实现有限形式的上下文扫描。