我一直在使用JavaCC为我用Java编写的一种“图片脚本”程序整理解析器语法。该程序采用一系列脚本命令,这些命令主要映射到java.awt.Graphics方法调用,直接处理它们,并将图像输出到文件。我正在使用JavaCC为此构建解析器,因为我想开始添加更复杂的构造(例如循环或函数)。
现在,我正在使用JJTree将输入构建为AST。无论如何,我收到来自JavaCC的警告(JJTree对.jjt文件没问题):
警告:(...)*构造中的选择冲突在第320行第9列。扩展嵌套在构造和扩展后面的构造中有一个共同的前缀,其中一个是“+”
考虑使用2或更多的前瞻来进行嵌套扩展。
因为源语法在“PicParse.jjt”中,我认为这是该文件的违规构造:
(
MulTerm()
( //line 320 in the file, column 9 starts at open parens
"+"
MulTerm()
{jjtThis.setName("+");}
|
"-"
MulTerm()
{jjtThis.setName("-");}
)*
)#Plus(>1)
最后,当我遇到this时,用问号运算符('?')替换星号运算符('*')并没有删除警告。
最终,我想要的是能够使用此生产规则(MulTerm()规则与此规则(“AddTerm()”))完全相同,以便保留在任一选择中匹配的运算符,这将允许我要区分加法和减法,只用一种节点类型来表示每个。
答案 0 :(得分:1)
修正了它!毕竟这个问题不在我的附加条款中,而是在我的一元规则中:
(
<OPAR> Expr() <CPAR>
|
((t=<PLUS>
| t=<MINUS>) Expr() ) #Unary
|
Integer()
|
Float()
|
Double()
)
{ if(t != null) jjtThis.setName(t.image); }
由第二个选项(Expr() - &gt; AddTerm() - &gt; MulTerm() - &gt;一元() - &gt; Expr())引起的递归是警告的后面。我通过将第二个选项移动到单独的生产规则来解决这个问题,该规则只会递归到一元:
void PrimaryExpr() #PrimaryExpr(>1) :
{ Token t=null; }
{
t=<PLUS>
Unary()
{if(t != null) jjtThis.setName(t.image);}
|
t=<MINUS>
Unary()
{if(t != null) jjtThis.setName(t.image);}
}