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錯誤?
這不是一個錯誤,因爲它產生有效的C++代碼。只需使用'-Wno-parentheses-equality'生成文件並完成它。 –
我知道它是技術上有效的C++代碼,但我寧願不要忽略代碼中的警告,並且我想知道ANTLR爲什麼會在這些特定的5個案例中生成額外的括號,但不是其他任何地方。如果這是可以規避的事情,那將是最可取的。 – kchadha
我想這只是因爲模板更容易編寫。忽略* generated *代碼中的警告並不是那麼糟糕。 –