diff options
author | Jacques-Henri Jourdan <jacques-henri.jourdan@inria.fr> | 2015-09-30 18:41:50 +0200 |
---|---|---|
committer | Jacques-Henri Jourdan <jacques-henri.jourdan@inria.fr> | 2015-09-30 18:41:50 +0200 |
commit | 504228b1f7b875550eae9e3782a5f2c1033b0233 (patch) | |
tree | f3e5121f9694fb57974697475f88361b42da8330 /cparser/pre_parser_aux.ml | |
parent | c212ab7a8adea516db72f17d818393629dbde1b3 (diff) | |
download | compcert-kvx-504228b1f7b875550eae9e3782a5f2c1033b0233.tar.gz compcert-kvx-504228b1f7b875550eae9e3782a5f2c1033b0233.zip |
Fixed a few bugs in the pre parser. In particular, the following code
was not parsed correctly:
typedef int a;
int f() {
for(int a; ;)
if(1);
a * x;
}
Additionnaly, I tried to add some comments in the pre-parser code,
especially for the different hacks used to solve various conflicts.
Diffstat (limited to 'cparser/pre_parser_aux.ml')
-rw-r--r-- | cparser/pre_parser_aux.ml | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/cparser/pre_parser_aux.ml b/cparser/pre_parser_aux.ml index 55dfdfde..c6b48608 100644 --- a/cparser/pre_parser_aux.ml +++ b/cparser/pre_parser_aux.ml @@ -18,8 +18,20 @@ type identifier_type = | TypedefId | OtherId -let push_context:(unit -> unit) ref= ref (fun () -> assert false) -let pop_context:(unit -> unit) ref = ref (fun () -> assert false) +(* These functions push and pop a context on the contexts stack. *) +let open_context:(unit -> unit) ref = ref (fun () -> assert false) +let close_context:(unit -> unit) ref = ref (fun () -> assert false) +(* Applying once this functions saves the whole contexts stack, and + applying it the second time restores it. + + This is mainly used to rollback the context stack to a previous + state. This is usefull for example when we pop too much contexts at + the end of the first branch of an if statement. See + pre_parser.mly. *) +let save_contexts_stk:(unit -> (unit -> unit)) ref = ref (fun _ -> assert false) + +(* Change the context at the top of the top stack of context, by + changing an identifier to be a varname or a typename*) let declare_varname:(string -> unit) ref = ref (fun _ -> assert false) let declare_typename:(string -> unit) ref = ref (fun _ -> assert false) |