[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