[Uml-devel] KDE/kdesdk/umbrello/umbrello/codeimport/kdevcppparser
Jean Vittor
jean.vittor at free.fr
Sun Mar 30 12:56:35 UTC 2008
SVN commit 791819 by jvittor:
Use typed rules for char-literals & number-literals
M +43 -15 lexer.cpp
--- trunk/KDE/kdesdk/umbrello/umbrello/codeimport/kdevcppparser/lexer.cpp #791818:791819
@@ -145,12 +145,45 @@
};
} operator_g;
-Lexer::CharRule gr_charLiteral =
- !ch_p('L') >> ch_p('\'')
- >> *((anychar_p - '\'' - '\\')
- | (ch_p('\\') >> (ch_p('\'') | '\\')))
- >> '\'';
-Lexer::CharRule gr_numberLiteral = digit_p >> *(alnum_p | '.');
+struct charLiteral :
+ grammar<charLiteral, result_closure<Token>::context_t>
+{
+ template < typename ScannerT >
+ struct definition {
+ typedef rule<ScannerT, result_closure<int>::context_t> rule_t;
+ rule_t main;
+
+ rule_t const& start() const {return main;}
+
+ definition( charLiteral const& self) {
+ main =
+ (!ch_p('L') >> ch_p('\'')
+ >> *((anychar_p - '\'' - '\\')
+ | (ch_p('\\') >> (ch_p('\'') | '\\')))
+ >> '\'')
+ [ self.result_ = construct_<Token>( Token_char_literal, arg1, arg2)];
+ }
+ };
+} charLiteral_g;
+
+struct numberLiteral :
+ grammar<numberLiteral, result_closure<Token>::context_t>
+{
+ template < typename ScannerT >
+ struct definition {
+ typedef rule<ScannerT, result_closure<int>::context_t> rule_t;
+ rule_t main;
+
+ rule_t const& start() const {return main;}
+
+ definition( numberLiteral const& self) {
+ main =
+ (digit_p >> *(alnum_p | '.'))
+ [ self.result_ = construct_<Token>( Token_number_literal, arg1, arg2)];
+ }
+ };
+} numberLiteral_g;
+
Lexer::CharRule gr_stringLiteral =
ch_p('"') >> *((anychar_p - '"' - '\\') | str_p("\\\"") | "\\\\") >> '"';
Lexer::CharRule gr_whiteSpaces = *(blank_p | (ch_p('\\') >> eol_p));
@@ -361,11 +394,8 @@
[var( tk) = construct_<Token>(Token_comment, arg1, arg2)]
]
.else_p[ gr_lineComment | gr_multiLineComment]
+ | charLiteral_g[assign(tk)]
|
- gr_charLiteral
- [var(tk) = construct_<Token>( Token_char_literal,
- arg1, arg2)]
- |
gr_stringLiteral
[var(tk) = construct_<Token>( Token_string_literal, arg1, arg2)]
).hit) {
@@ -531,11 +561,9 @@
} else {
tk = m_source.createToken( Token_identifier, start);
}
- } else if( m_source.parse
- ( gr_numberLiteral
- [var(tk) = construct_<Token>( Token_number_literal, arg1, arg2)]
- ).hit) {
- } else if( m_source.parse( operator_g[ assign(tk)]).hit) {
+ } else if( m_source.parse( numberLiteral_g[assign(tk)]
+ | operator_g[ assign(tk)]
+ ).hit) {
} else {
CharIterator l_ptr = m_source.get_ptr();
m_source.nextChar();
More information about the umbrello-devel
mailing list