Coccinelle release 0.2.5-rc7.
[bpt/coccinelle.git] / parsing_c / lexer_c.mll
index da6a291..fbad367 100644 (file)
@@ -169,6 +169,10 @@ let keyword_table = Common.hash_of_list [
 
  ]
 
+let cpp_keyword_table = Common.hash_of_list [
+  "new",   (fun ii -> Tnew ii);
+  "delete",(fun ii -> Tdelete ii) ]
+
 let error_radix s =
   ("numeric " ^ s ^ " constant contains digits beyond the radix:")
 
@@ -645,9 +649,16 @@ rule token = parse
       { let info = tokinfo lexbuf in
         let s = tok lexbuf in
         Common.profile_code "C parsing.lex_ident" (fun () ->
-          match Common.optionise (fun () -> Hashtbl.find keyword_table s)
-          with
-          | Some f -> f info
+         let tok =
+           if !Flag.c_plus_plus 
+           then Common.optionise (fun () -> Hashtbl.find cpp_keyword_table s)
+           else None in
+         match tok with
+           Some f -> f info
+         | None ->
+              match Common.optionise (fun () -> Hashtbl.find keyword_table s)
+              with
+              | Some f -> f info
 
            (* parse_typedef_fix.
             *    if Lexer_parser.is_typedef s
@@ -660,7 +671,7 @@ rule token = parse
             * now done in parse_c.ml.
             *)
 
-          | None -> TIdent (s, info)
+              | None -> TIdent (s, info)
         )
       }
   (* gccext: apparently gcc allows dollar in variable names. found such
@@ -674,8 +685,63 @@ rule token = parse
         pr2 ("LEXER: identifier with dollar: "  ^ s);
         TIdent (s, info)
       }
-  | (letter | '$') (letter | digit | '$' | '~') *
-    ("::" (letter | '$' | '~') (letter | digit | '$' | '~') *
+  | (letter | '$') (letter | digit | '$') *
+      ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ?
+    ("::~" (letter | '$') (letter | digit | '$') *
+      ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ?) +
+
+      {
+        if !Flag.c_plus_plus
+       then
+         begin
+            let info = tokinfo lexbuf in
+            let s = tok lexbuf in
+            Tconstructorname (s, info)
+         end
+       else
+         raise
+           (Lexical "~ and :: not allowed in C identifiers, try -c++ option")
+      }
+  | ((letter | '$') (letter | digit | '$') *)
+      ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>')
+
+      {
+        if !Flag.c_plus_plus
+       then
+         begin
+            let info = tokinfo lexbuf in
+            let s = tok lexbuf in
+            TypedefIdent (s, info)
+         end
+       else raise (Lexical "<> detected, try -c++ option")
+      }
+
+
+  | (((letter | '$') (letter | digit | '$') *) as first)
+      ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ?
+    "::" (((letter | '$') (letter | digit | '$') *) as second)
+      ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ?
+    ("::" ((letter | '$') (letter | digit | '$') *)
+      ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ?) *
+
+      {
+        if !Flag.c_plus_plus
+       then
+         begin
+            let info = tokinfo lexbuf in
+            let s = tok lexbuf in
+           if first = second
+           then Tconstructorname (s, info)
+            else TIdent (s, info)
+         end
+       else
+         raise
+           (Lexical "~ and :: not allowed in C identifiers, try -c++ option")
+      }
+
+   | "::" ((letter | '$') (letter | digit | '$') *)
+      ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ?
+    ("::" ((letter | '$') (letter | digit | '$') *)
       ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ?) *
 
       {
@@ -684,7 +750,7 @@ rule token = parse
          begin
             let info = tokinfo lexbuf in
             let s = tok lexbuf in
-            TIdent (s, info)
+           TIdent (s, info)
          end
        else
          raise