正则表达式中的警告 - JavaCC

时间:2014-07-21 17:38:33

标签: java parsing warnings javacc

我在我的JavaCC解析器中使用了这段代码:

< VARIABILE : "§" < LETTERA > ( < CIFRA > | < LETTERA > )* >

< TERMINE: ( < NUM_SEGNO > | < VARIABILE > | "(-" < VARIABILE > ")" ) >

编译时出现此错误

  

正则表达式选择:VARIABILE永远不能匹配为:TERMINE

我该如何解决这个问题?

1 个答案:

答案 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。