2017-06-22 47 views
0

在以下代碼上運行ANTLR3時,我收到警告消息 - 警告(200):MYGRAMMAR.g:40:36:決策可以使用多個備選方案匹配諸如「QMARK」之類的輸入:3,4 因此,對於該輸入禁用替代項4。ANTLR3 - 決策可以使用多個替代方案匹配輸入

該警告消息指向我postfixExpr。有沒有辦法來解決這個問題?

grammar MYGRAMMAR; 
options {language = C;} 

tokens { 
    BANG  = '!'; 
    COLON  = ':'; 
    FALSE_LITERAL = 'false'; 
    GREATER  = '>'; 
    LSHIFT  = '<<'; 
    MINUS  = '-'; 
    MINUS_MINUS = '--'; 
    PLUS  = '+'; 
    PLUS_PLUS = '++'; 
    QMARK  = '?'; 
    QMARK_COLON = '?:'; 
    TILDE  = '~'; 
    TRUE_LITERAL = 'true'; 
} 


condExpr 
        : shiftExpr (QMARK condExpr COLON condExpr)? ; 

shiftExpr 
        : addExpr (shiftOp addExpr)* ; 

addExpr 
        : qmarkColonExpr (addOp qmarkColonExpr)* ; 

qmarkColonExpr 
        : prefixExpr (QMARK_COLON prefixExpr)? ; 

prefixExpr 
        : (prefixOrUnaryMinus | postfixExpr) ; 

prefixOrUnaryMinus 
        : prefixOp prefixExpr ; 

postfixExpr 
        : primaryExpr (postfixOp | BANG | QMARK)*; 

primaryExpr 
        : literal ; 



shiftOp 
        : (LSHIFT | rShift); 

addOp 
        : (PLUS | MINUS); 

prefixOp 
        : (BANG | MINUS | TILDE | PLUS_PLUS | MINUS_MINUS); 

postfixOp 
        : (PLUS_PLUS | MINUS_MINUS); 

rShift 
        : (GREATER GREATER)=> a=GREATER b=GREATER {assertNoSpace($a,$b)}? ; 

literal 
        : (TRUE_LITERAL | FALSE_LITERAL); 

assertNoSpace  [pANTLR3_COMMON_TOKEN t1, pANTLR3_COMMON_TOKEN t2] 
        : { $t1->line == $t2->line && $t1->getCharPositionInLine($t1) + 1 == $t2->getCharPositionInLine($t2) }? ; 

回答

0

我認爲一個問題是,PLUS_PLUS以及MINUS_MINUS因爲它們各自的​​或MINUS令牌之後定義永遠不會被匹配。因此詞法分析器將始終輸出兩個​​令牌,而不是一個PLUS_PLUS令牌。

爲了avaoid這樣的事情你有​​或MINUS令牌之前定義PLUS_PLUSMINUS_MINUS令牌作爲詞法分析器中定義它們的順序處理它們並不會看任何進一步一旦它找到了一種方法匹配當前輸入。

同樣的問題適用於QMARK_COLON,因爲它在QMARK之後定義(這只是一個問題,因爲有另一個令牌類型COLON要匹配下面的冒號)。

查看修復歧義是否解決錯誤消息。

+0

嗨Raven。感謝您的評論。我改變了令牌的順序,但它沒有解決問題。 –