我的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/

10-09 08:34