我一直在与 JavaCC 合作,为我用 Java 编写的一种“图片脚本”程序组合了一个解析器语法。该程序采用一系列脚本命令,这些命令主要映射到 java.awt.Graphics 方法调用,直接处理它们,并将图像输出到文件。我正在使用 JavaCC 为此构建解析器,因为我想开始添加更复杂的构造(例如循环或函数)。
现在,我正在使用 JJTree 将输入构建为 AST。无论如何,我收到了来自 JavaCC 的警告(JJTree 可以使用 .jjt 文件):
警告:第 320 行第 9 列的 (...)* 构造中的选择冲突。嵌套在构造中的扩展和扩展之后的构造有共同点前缀,其中之一是“+”
因为源语法在“PicParse.jjt”中,我认为这是该文件中的违规构造:
(
MulTerm()
( //line 320 in the file, column 9 starts at open parens
"+"
MulTerm()
{jjtThis.setName("+");}
|
"-"
MulTerm()
{jjtThis.setName("-");}
)*
)#Plus(>1)
最后,虽然我确实遇到了这个,但用问号运算符 ('?') 替换星号运算符 ('*') 并没有消除警告。
最终,我想要的是能够使用这个生产规则(MulTerm()规则与这个规则(“AddTerm()”)相同),这样它就可以保留在任一选择中匹配的运算符,这将允许我来区分加法和减法,只有一种节点类型来表示每个。