2015-04-22 267 views
0

我在ANTLR v 3.5中使用C++目標,生成的Lexer.cpp文件有一堆額外的括號警告。具體的警告是:ANTLR 3.5用C++目標生成「多餘的括號」警告

warning: equality comparison with extraneous parentheses [-Wparentheses-equality] 

這發生在五個地方,相應產生的詞法分析器代碼:

void 
QualifiedNameLexer::mTokens() 
{ 
    { 
     // QualifiedName.g:1:8: (T__11 | T__12 | T__13 | T__14 | T__15 | PN_CHARS_BASE | HELPER_RULE_FOR_OTHER_PUNCTUATION_CHARS | PN_CHARS_OTHERS | DIGIT) 

     ANTLR_UINT32 alt2; 

     alt2=9; 

     { 
      int LA2_0 = this->LA(1); 
      if ((LA2_0 == '-')) 
      { 
       alt2=1; 
      } 
      else if ((LA2_0 == '.')) 
      { 
       alt2=2; 
      } 
      else if ((LA2_0 == ':')) 
      { 
       alt2=3; 
      } 
      else if ((LA2_0 == 0x00B7)) 
      { 
       alt2=4; 
      } 
      else if ((LA2_0 == '_')) 
      { 
       alt2=5; 
      } 
      ... 
     } 
    } 
} 

下面是對應於與警告生成詞法語法。

grammar QualifiedName; 

options { 
    language = Cpp; 
    k = 2; 
    backtrack = true; 
    memoize = true; 
} 

@parser::includes { 
    #include "QualifiedNameLexer.hpp" 
} 

@lexer::namespace { User } 

@parser::namespace { User } 

@lexer::traits { 
    class QualifiedNameLexer; class QualifiedNameParser; 
    typedef antlr3::Traits< QualifiedNameLexer, QualifiedNameParser > QualifiedNameLexerTraits; 
    typedef QualifiedNameLexerTraits QualifiedNameParserTraits; 
} 


/******************** Parser Rules *****************************/ 

qualified_name 
    : (pn_prefix ':')? pn_local 
     | pn_prefix ':' 
    ; 

pn_prefix 
    : PN_CHARS_BASE ((pn_chars | '.')* pn_chars)? 
    ; 

pn_local 
    : (pn_chars_u | DIGIT | PN_CHARS_OTHERS) 
     (
      (pn_chars | '.' | PN_CHARS_OTHERS)* 
      (pn_chars | PN_CHARS_OTHERS) 
     )? 
    ; 

pn_chars_u 
    : PN_CHARS_BASE | '_' 
    ; 

pn_chars 
    : pn_chars_u | '-' | DIGIT | '\u00B7' | HELPER_RULE_FOR_OTHER_PUNCTUATION_CHARS 
    ; 

/************************* Lexer Rules ******************************/ 

PN_CHARS_BASE 
    : 'A'..'Z' | 'a'..'z' 
    | '\u00C0'..'\u00D6' 
    | '\u00D8'..'\u00F6' 
    | '\u00F8'..'\u02FF' 
    | '\u0370'..'\u037D' 
    | '\u037F'..'\u1FFF' 
    | '\u200C'..'\u200D' 
    | '\u2070'..'\u218F' 
    | '\u2C00'..'\u2FEF' 
    | '\u3001'..'\uD7FF' 
    | '\uF900'..'\uFDCF' 
    | '\uFDF0'..'\uFFFD' 
// | '\uD800\uDC00'..'\uDB7F\uDFFF' (u+10000 to u+EFFFF) not supported by this grammar. 
    ; 

HELPER_RULE_FOR_OTHER_PUNCTUATION_CHARS 
    : '\u0300'..'\u036F' | '\u203F'..'\u2040' 
    ; 

PN_CHARS_OTHERS 
    : '/' 
    | '@' 
    | '~' 
    | '&' 
    | '+' 
    | '*' 
    | '?' 
    | '#' 
    | '$' 
    | '!' 
    | PERCENT 
    | PN_CHARS_ESC 
    ; 

fragment 
PN_CHARS_ESC 
    : '\\' ('=' | '\'' | '(' | ')' | ',' | '-' | ':' | ';' | '[' | ']' | '.') 
    ; 

fragment 
PERCENT 
    : '%' HEX HEX 
    ; 

fragment 
HEX 
    : '0'..'9' | 'A'..'F' | 'a'..'f' 
    ; 

DIGIT 
    : '0'..'9' 
    ; 

當antlr生成一個詞法分析器時,我能在語法中改變這些警告以擺脫這些警告嗎?或者這是一個ANTLR錯誤?

+0

這不是一個錯誤,因爲它產生有效的C++代碼。只需使用'-Wno-parentheses-equality'生成文件並完成它。 –

+0

我知道它是技術上有效的C++代碼,但我寧願不要忽略代碼中的警告,並且我想知道ANTLR爲什麼會在這些特定的5個案例中生成額外的括號,但不是其他任何地方。如果這是可以規避的事情,那將是最可取的。 – kchadha

+0

我想這只是因爲模板更容易編寫。忽略* generated *代碼中的警告並不是那麼糟糕。 –

回答

1

我正要解決它,但我放棄了。代碼是由嵌套模板生成的,很難預測最終會得到什麼。

另外g ++和Clang不同地對待這段代碼。 AFAIK Clang生成不同的警告和多餘的括號,以某種方式處理警告。

我認爲最好的方法是在標題開始處忽略此警告,並在和處忽略彈出式窗口。我試過了,但是我被卡住了。

也許是因爲在讀取源代碼時但未實例化模板時未觸發警告。我不記得。

PS:你的語法很簡單,生成的條件可能非常複雜。