Release coccinelle-0.1.8
[bpt/coccinelle.git] / parsing_cocci / lexer_cocci.mll
index a9a31fb..878edc5 100644 (file)
@@ -48,7 +48,7 @@ let get_current_line_type lexbuf =
   let lex_start = Lexing.lexeme_start lexbuf in
   let preceeding_spaces =
     if !line_start < 0 then 0 else lex_start - !line_start in
-  line_start := -1;
+  (*line_start := -1;*)
   prev_plus := (c = D.PLUS);
   (c,l,ll,lex_start,preceeding_spaces,[],[],Ast0.NoMetaPos)
 let current_line_started = ref false
@@ -225,7 +225,9 @@ let id_tokens lexbuf =
   | "exists" when in_rule_name  -> check_context_linetype s; TExists
   | "forall" when in_rule_name  -> check_context_linetype s; TForall
   | "reverse" when in_rule_name -> check_context_linetype s; TReverse
-  | "script" when in_rule_name -> check_context_linetype s; TScript
+  | "script" when in_rule_name  -> check_context_linetype s; TScript
+  | "initialize" when in_rule_name -> check_context_linetype s; TInitialize
+  | "finalize" when in_rule_name   -> check_context_linetype s; TFinalize
 
   | "char" ->       Tchar     linetype
   | "short" ->      Tshort    linetype
@@ -295,11 +297,17 @@ let init _ =
   Hashtbl.clear metavariables;
   Hashtbl.clear type_names;
   Hashtbl.clear rule_names;
+  Hashtbl.clear iterator_names;
+  Hashtbl.clear declarer_names;
   let get_name (_,x) = x in
   Data.add_id_meta :=
     (fun name constraints pure ->
       let fn clt = TMetaId(name,constraints,pure,clt) in
       Hashtbl.replace metavariables (get_name name) fn);
+  Data.add_fresh_id_meta :=
+    (fun name ->
+      let fn clt = TMetaId(name,[],Ast0.Impure,clt) in
+      Hashtbl.replace metavariables (get_name name) fn);
   Data.add_type_meta :=
     (fun name pure ->
       let fn clt = TMetaType(name,pure,clt) in
@@ -585,30 +593,31 @@ rule token = parse
   | "&"            { start_line true; TAnd    (get_current_line_type lexbuf) }
   | "^"            { start_line true; TXor(get_current_line_type lexbuf) }
 
-  | ( ("#" [' ' '\t']*  "define" [' ' '\t']+))
+  | (( ("#" [' ' '\t']*  "define" [' ' '\t']+)) as def)
     ( (letter (letter |digit)*) as ident)
       { start_line true;
        let (arity,line,lline,offset,col,strbef,straft,pos) as lt =
          get_current_line_type lexbuf in
-       let off = String.length "#define " in
+       let off = String.length def in
        (* -1 in the code below because the ident is not at the line start *)
        TDefine
          (lt,
           check_var ident
-            (arity,line,lline,offset+off,(-1),[],[],Ast0.NoMetaPos)) }
-  | ( ("#" [' ' '\t']*  "define" [' ' '\t']+))
+            (arity,line,lline,offset+off,col+off,[],[],Ast0.NoMetaPos)) }
+  | (( ("#" [' ' '\t']*  "define" [' ' '\t']+)) as def)
     ( (letter (letter | digit)*) as ident)
     '('
       { start_line true;
        let (arity,line,lline,offset,col,strbef,straft,pos) as lt =
          get_current_line_type lexbuf in
-       let off = String.length "#define " in
+       let off = String.length def in
        TDefineParam
         (lt,
         check_var ident
           (* why pos here but not above? *)
-          (arity,line,lline,offset+off,(-1),strbef,straft,pos),
-        offset + off + (String.length ident)) }
+          (arity,line,lline,offset+off,col+off,strbef,straft,pos),
+        offset + off + (String.length ident),
+        col + off + (String.length ident)) }
   | "#" [' ' '\t']* "include" [' ' '\t']* '"' [^ '"']+ '"'
       { TIncludeL
          (let str = tok lexbuf in