JavaCC:明星扩张中的选择冲突

时间:2013-07-12 21:47:19

标签: javacc

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

1 个答案:

答案 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);}
}