Release coccinelle-0.2.0rc1
[bpt/coccinelle.git] / popl09 / asttopopl.ml
CommitLineData
951c7801
C
1module Ast = Ast_cocci
2module Past = Ast_popl
3
4(* --------------------------------------------------------------------- *)
5
6let term s inif =
7 let fail _ =
8 Pretty_print_cocci.statement "" s;
9 Format.print_newline();
10 failwith "complex statements not supported" in
11 match Ast.unwrap s with
12 Ast.Atomic(ast) ->
13 (match Ast.unwrap ast with
14 Ast.ExprStatement(_,_) -> Past.Atomic ast
15 | Ast.Exp(_) -> Past.Atomic ast
16 | Ast.Decl(_,_,_) -> Past.Atomic ast
17 | Ast.ReturnExpr(_,_,_) -> Past.Atomic ast
18 | Ast.MetaStmt(_,_,_,_) when inif -> Past.Atomic ast
19 | Ast.DisjRuleElem(_) -> Past.Atomic ast
20 | _ -> fail())
21 | _ -> fail()
22
23let rec stm s =
24 match Ast.unwrap s with
25 Ast.Atomic(ast) -> Past.Term(term s false,dots_bef_aft s false)
26 | Ast.IfThen(header,body,aft) ->
27 Past.Term(
28 Past.IfThen(Past.Atomic header,term body true,aft),
29 dots_bef_aft s true)
30 | Ast.Disj(stm1::stm2::stmts) ->
31 List.fold_left
32 (function prev ->
33 function cur ->
34 Past.Or(Past.Seq(prev,Past.Empty),stm_list cur))
35 (Past.Or(stm_list stm1,stm_list stm2)) stmts
36 | Ast.Dots(dots,whencodes,_,_) ->
37 Past.DInfo
38 (List.fold_left
39 (function prev ->
40 function
41 Ast.WhenNot(a) -> Past.When(prev,stm_list a)
42 | _ -> failwith "only when != supported")
43 Past.Dots whencodes)
44 | Ast.Nest(stmt_dots,whencodes,false,_,_) ->
45 let nest = Past.Nest(stm_list stmt_dots) in
46 Past.DInfo
47 (List.fold_left
48 (function prev ->
49 function
50 Ast.WhenNot(a) -> Past.When(prev,stm_list a)
51 | _ -> failwith "only when != supported")
52 nest whencodes)
53 | _ ->
54 Pretty_print_cocci.statement "" s;
55 failwith "unsupported statement3"
56
57and dots_bef_aft s inif =
58 match Ast.get_dots_bef_aft s with
59 Ast.AddingBetweenDots (brace_term,n) ->
60 Past.AddingBetweenDots (term brace_term inif,n)
61 | Ast.DroppingBetweenDots (brace_term,n) ->
62 Past.DroppingBetweenDots (term brace_term inif,n)
63 | Ast.NoDots -> Past.NoDots
64
65and stm_list s =
66 match Ast.unwrap s with
67 Ast.DOTS(d) ->
68 List.fold_right
69 (function cur -> function rest -> Past.Seq(stm cur, rest))
70 d Past.Empty
71 | _ -> failwith "only DOTS handled"
72
73let top s =
74 match Ast.unwrap s with
75 Ast.CODE(stmt_dots) -> stm_list stmt_dots
76 | _ -> failwith "only CODE handled"