我的JavaCC解析器中有以下代码:
< VARIABILE : "§" < LETTERA > ( < CIFRA > | < LETTERA > )* >
< TERMINE: ( < NUM_SEGNO > | < VARIABILE > | "(-" < VARIABILE > ")" ) >
编译时出现此错误
正则表达式选择:VARIABILE不能匹配为:TERMINE
我怎样才能解决这个问题?
最佳答案
在生产TERMINE
的过程中,第二种选择是无用的。你最好写
< TERMINE: ( < NUM_SEGNO > | "(-" < VARIABILE > ")" ) >
这就是错误消息告诉您的内容。为什么没用? JavaCC的正则表达式遵守FAQ 3.3中解释的三个规则。在继续阅读之前,请先阅读有关它们的信息。 ...好吧,你回来了。您现在应该了解,如果与任何规则匹配的输入的最长前缀与
< VARIABILE >
的规则匹配(因此也与<TERMINE>
的规则匹配),则< VARIABILE >
的规则将胜过因为它是.jj文件的第一名。解决该问题的方法取决于您要实现的目标。我的猜测是您应该将选择移到解析器级别。即删除
< TERMINE >
的规则并将其替换为语法规则void Termine() : {} {
<NUM_SEGNO>
|
<VARIABILE>
|
"(-" <VARIABLE> ")"
}
有关其他可能性,请参见常见问题解答3.6和常见问题解答4.19。
关于java - 正则表达式中的警告-JavaCC,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24871299/