0

我一直在与 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()”)相同),这样它就可以保留在任一选择中匹配的运算符,这将允许我来区分加法和减法,只有一种节点类型来表示每个。

4

1 回答 1

1

解决它!毕竟问题不在于我的附加项,而在于我的一元规则:

(
    <OPAR> Expr() <CPAR> 
| 
    ((t=<PLUS> 
    | t=<MINUS>) Expr() ) #Unary
| 
    Integer() 
| 
    Float() 
| 
    Double()
)
{ if(t != null) jjtThis.setName(t.image); }

第二种选择(Expr()->AddTerm()->MulTerm()->Unary()->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);}
}
于 2013-07-13T18:28:02.237 回答