2015-04-22 266 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:你的语法很简单,生成的条件可能非常复杂。