| PC.Tconst(clt) -> "const"^(line_type2c clt)
| PC.Tvolatile(clt) -> "volatile"^(line_type2c clt)
- | PC.TPragma(s,_) -> s
+ | PC.TPragma(Ast.Noindent s,_) -> s
+ | PC.TPragma(Ast.Indent s,_) -> s
| PC.TIncludeL(s,clt) -> (pr "#include \"%s\"" s)^(line_type2c clt)
| PC.TIncludeNL(s,clt) -> (pr "#include <%s>" s)^(line_type2c clt)
| PC.TDefine(clt,_) -> "#define"^(line_type2c clt)
| PC.TIsoExpression -> "Expression"
| PC.TIsoArgExpression -> "ArgExpression"
| PC.TIsoTestExpression -> "TestExpression"
+ | PC.TIsoToTestExpression -> "ToTestExpression"
| PC.TIsoStatement -> "Statement"
| PC.TIsoDeclaration -> "Declaration"
| PC.TIsoType -> "Type"
| PC.TIso | PC.TRightIso
| PC.TIsoExpression | PC.TIsoStatement | PC.TIsoDeclaration | PC.TIsoType
- | PC.TIsoTopLevel | PC.TIsoArgExpression | PC.TIsoTestExpression ->
+ | PC.TIsoTopLevel | PC.TIsoArgExpression | PC.TIsoTestExpression
+ | PC.TIsoToTestExpression ->
failwith "unexpected tokens"
| PC.TScriptData s -> ([t],[t])
| Ast.GeneratedRulename (nm,a,b,c,d,e) ->
Ast.GeneratedRulename (check_name nm,a,b,c,d,e)
| Ast.ScriptRulename(s,deps) -> Ast.ScriptRulename(s,deps)
- | Ast.InitialScriptRulename(s) -> Ast.InitialScriptRulename(s)
- | Ast.FinalScriptRulename(s) -> Ast.FinalScriptRulename(s)
+ | Ast.InitialScriptRulename(s,deps) -> Ast.InitialScriptRulename(s,deps)
+ | Ast.FinalScriptRulename(s,deps) -> Ast.FinalScriptRulename(s,deps)
else
Ast.CocciRulename(Some(mknm()),Ast.NoDep,[],[],Ast.Undetermined,false) in
Data.in_rule_name := false;
let (more,tokens) =
get_tokens
[PC.TIsoStatement;PC.TIsoExpression;PC.TIsoArgExpression;
- PC.TIsoTestExpression;
+ PC.TIsoTestExpression; PC.TIsoToTestExpression;
PC.TIsoDeclaration;PC.TIsoType;PC.TIsoTopLevel] in
let next_start = List.hd(List.rev tokens) in
let dummy_info = ("",(-1,-1),(-1,-1)) in
in
loop dep
-let rec parse file =
+let parse file =
Lexer_cocci.init();
+ let rec parse_loop file =
let table = Common.full_charpos_to_pos file in
Common.with_open_infile file (fun channel ->
let lexbuf = Lexing.from_channel channel in
| (a,b,c)::rest ->
let (x,y,z) = loop rest in
(a::x,b::y,c::z) in
- loop (List.map parse include_files) in
+ loop (List.map parse_loop include_files) in
let parse_cocci_rule ruletype old_metas
(rule_name, dependencies, iso, dropiso, exists, is_expression) =
let data = collect_script_tokens tokens in
(more,Ast0.ScriptRule(language, deps, metavars, data),[],tokens) in
- let parse_if_script_rule k language =
+ let parse_if_script_rule k language _ deps =
let get_tokens = tokens_script_all table file false lexbuf in
(* script code *)
let (more, tokens) = get_tokens [PC.TArobArob; PC.TArob] in
let data = collect_script_tokens tokens in
- (more,k (language, data),[],tokens) in
+ (more,k (language, deps, data),[],tokens) in
let parse_iscript_rule =
parse_if_script_rule
- (function (language,data) ->
- Ast0.InitialScriptRule(language,data)) in
+ (function (language,deps,data) ->
+ Ast0.InitialScriptRule(language,deps,data)) in
let parse_fscript_rule =
parse_if_script_rule
- (function (language,data) ->
- Ast0.FinalScriptRule(language,data)) in
+ (function (language,deps,data) ->
+ Ast0.FinalScriptRule(language,deps,data)) in
+
+ let do_parse_script_rule fn l old_metas deps =
+ match eval_depend deps virt with
+ Some deps -> fn l old_metas deps
+ | None -> fn l old_metas Ast.FailDep in
let parse_rule old_metas starts_with_name =
let rulename =
Data.in_generating := false;
res)
| Ast.ScriptRulename(l,deps) ->
- (match eval_depend deps virt with
- Some deps -> parse_script_rule l old_metas deps
- | None -> parse_script_rule l old_metas Ast.FailDep)
- | Ast.InitialScriptRulename(l) -> parse_iscript_rule l
- | Ast.FinalScriptRulename(l) -> parse_fscript_rule l
+ do_parse_script_rule parse_script_rule l old_metas deps
+ | Ast.InitialScriptRulename(l,deps) ->
+ do_parse_script_rule parse_iscript_rule l old_metas deps
+ | Ast.FinalScriptRulename(l,deps) ->
+ do_parse_script_rule parse_fscript_rule l old_metas deps
| _ -> failwith "Malformed rule name" in
let rec loop old_metas starts_with_name =
| (false,[(PC.TArobArob,_)]) | (false,[(PC.TArob,_)]) ->
([],([] : Ast0.parsed_rule list),[] (*virtual rules*))
| _ -> failwith "unexpected code before the first rule\n" in
- res)
+ res) in
+ parse_loop file
(* parse to ast0 and then convert to ast *)
let process file isofile verbose =
List.map
(function
Ast0.ScriptRule (a,b,c,d) -> [([],Ast.ScriptRule (a,b,c,d))]
- | Ast0.InitialScriptRule (a,b) -> [([],Ast.InitialScriptRule (a,b))]
- | Ast0.FinalScriptRule (a,b) -> [([],Ast.FinalScriptRule (a,b))]
+ | Ast0.InitialScriptRule (a,b,c) -> [([],Ast.InitialScriptRule (a,b,c))]
+ | Ast0.FinalScriptRule (a,b,c) -> [([],Ast.FinalScriptRule (a,b,c))]
| Ast0.CocciRule
((minus, metavarsm,
(iso, dropiso, dependencies, rule_name, exists)),