我在我的JavaCC解析器中使用了这段代码:
< VARIABILE : "§" < LETTERA > ( < CIFRA > | < LETTERA > )* >
< TERMINE: ( < NUM_SEGNO > | < VARIABILE > | "(-" < VARIABILE > ")" ) >
编译时出现此错误
正则表达式选择:VARIABILE永远不能匹配为:TERMINE
我该如何解决这个问题?
答案 0 :(得分:1)
在TERMINE
的制作中,第二种选择是没用的;你不妨写一下
< TERMINE: ( < NUM_SEGNO > | "(-" < VARIABILE > ")" ) >
这是错误消息告诉你的内容。为什么没用? JavaCC的正则表达式遵循FAQ 3.3中解释的三个规则。在进一步阅读之前,先阅读它们。 ......好的,你回来了。您现在应该明白,如果与任何规则匹配的输入的最长前缀与< VARIABILE >
的规则匹配(因此也符合<TERMINE>
的规则),那么< VARIABILE >
的规则将凭借在.jj文件中的第一个优势,击败了< TERMINE >
的规则。
如何解决这个问题取决于您想要达到的目标。我的猜测是你应该将选择移到解析器级别。即删除TERMINE
的规则并将其替换为语法规则
void Termine() : {} {
<NUM_SEGNO>
|
<VARIABILE>
|
"(-" <VARIABLE> ")"
}
有关其他可能性,请参阅常见问题3.6和常见问题4.19。