diff options
| author | Alasdair | 2019-04-06 00:07:11 +0100 |
|---|---|---|
| committer | Alasdair | 2019-04-06 01:30:27 +0100 |
| commit | 76bf4a3853e547ae2e0327b20e4f4b89d16820b7 (patch) | |
| tree | c237dfe772fc299bb1fd37b5035df668b0702ca3 /src/parser.mly | |
| parent | 889f129b824790694f820d7d083607796abd3efb (diff) | |
Various bugfixes and improvements
- Rename DeIid to Operator. It corresponds to operator <string> in the
syntax. The previous name is from when it was called deinfix in
sail1.
- Removed things that weren't actually common from
pretty_print_common.ml, e.g. printing identifiers is backend
specific. The doc_id function here was only used for a very specific
use case in pretty_print_lem, so I simplified it and renamed it to
doc_sia_id, as it is always used for a SIA.Id whatever that is.
- There is some support for anonymous records in constructors, e.g.
union Foo ('a : Type) = {
MkFoo : { field1 : 'a, field2 : int }
}
somewhat similar to the enum syntax in Rust. I'm not sure when this
was added, but there were a few odd things about it. It was
desugared in the preprocessor, rather than initial_check, and the
desugaring generated incorrect code for polymorphic anonymous
records as above.
I moved the code to initial_check, so the pre-processor now just
deals with pre-processor things and not generating types, and I
fixed the code to work with polymorphic types. This revealed some
issues in the C backend w.r.t. polymorphic structs, which is the
bulk of this commit. I also added some tests for this feature.
- OCaml backend can now generate a valid string_of function for
polymorphic structs, previously this would cause the ocaml to fail
to compile.
- Some cleanup in the Sail ott definition
- Add support for E_var in interpreter previously this would just
cause the interpreter to fail
Diffstat (limited to 'src/parser.mly')
| -rw-r--r-- | src/parser.mly | 98 |
1 files changed, 49 insertions, 49 deletions
diff --git a/src/parser.mly b/src/parser.mly index 4004f53d..39ca75ff 100644 --- a/src/parser.mly +++ b/src/parser.mly @@ -69,7 +69,7 @@ let cons_fst h (t,x) = (h::t,x) let string_of_id = function | Id_aux (Id str, _) -> str - | Id_aux (DeIid str, _) -> str + | Id_aux (Operator str, _) -> str let prepend_id str1 = function | Id_aux (Id str2, loc) -> Id_aux (Id (str1 ^ str2), loc) @@ -84,8 +84,8 @@ let id_of_kid = function | Kid_aux (Var v, l) -> Id_aux (Id (String.sub v 1 (String.length v - 1)), l) let deinfix = function - | (Id_aux (Id v, l)) -> Id_aux (DeIid v, l) - | (Id_aux (DeIid v, l)) -> Id_aux (Id v, l) + | (Id_aux (Id v, l)) -> Id_aux (Operator v, l) + | (Id_aux (Operator v, l)) -> Id_aux (Id v, l) let mk_effect e n m = BE_aux (e, loc n m) let mk_typ t n m = ATyp_aux (t, loc n m) @@ -142,7 +142,7 @@ type lchain = | LC_lteq | LC_nexp of atyp -let tyop op t1 t2 s e = mk_typ (ATyp_app (Id_aux (DeIid op, loc s e), [t1; t2])) s e +let tyop op t1 t2 s e = mk_typ (ATyp_app (Id_aux (Operator op, loc s e), [t1; t2])) s e let rec desugar_lchain chain s e = match chain with @@ -230,51 +230,51 @@ let rec desugar_rchain chain s e = id: | Id { mk_id (Id $1) $startpos $endpos } - | Op Op0 { mk_id (DeIid $2) $startpos $endpos } - | Op Op1 { mk_id (DeIid $2) $startpos $endpos } - | Op Op2 { mk_id (DeIid $2) $startpos $endpos } - | Op Op3 { mk_id (DeIid $2) $startpos $endpos } - | Op Op4 { mk_id (DeIid $2) $startpos $endpos } - | Op Op5 { mk_id (DeIid $2) $startpos $endpos } - | Op Op6 { mk_id (DeIid $2) $startpos $endpos } - | Op Op7 { mk_id (DeIid $2) $startpos $endpos } - | Op Op8 { mk_id (DeIid $2) $startpos $endpos } - | Op Op9 { mk_id (DeIid $2) $startpos $endpos } - - | Op Op0l { mk_id (DeIid $2) $startpos $endpos } - | Op Op1l { mk_id (DeIid $2) $startpos $endpos } - | Op Op2l { mk_id (DeIid $2) $startpos $endpos } - | Op Op3l { mk_id (DeIid $2) $startpos $endpos } - | Op Op4l { mk_id (DeIid $2) $startpos $endpos } - | Op Op5l { mk_id (DeIid $2) $startpos $endpos } - | Op Op6l { mk_id (DeIid $2) $startpos $endpos } - | Op Op7l { mk_id (DeIid $2) $startpos $endpos } - | Op Op8l { mk_id (DeIid $2) $startpos $endpos } - | Op Op9l { mk_id (DeIid $2) $startpos $endpos } - - | Op Op0r { mk_id (DeIid $2) $startpos $endpos } - | Op Op1r { mk_id (DeIid $2) $startpos $endpos } - | Op Op2r { mk_id (DeIid $2) $startpos $endpos } - | Op Op3r { mk_id (DeIid $2) $startpos $endpos } - | Op Op4r { mk_id (DeIid $2) $startpos $endpos } - | Op Op5r { mk_id (DeIid $2) $startpos $endpos } - | Op Op6r { mk_id (DeIid $2) $startpos $endpos } - | Op Op7r { mk_id (DeIid $2) $startpos $endpos } - | Op Op8r { mk_id (DeIid $2) $startpos $endpos } - | Op Op9r { mk_id (DeIid $2) $startpos $endpos } - - | Op Plus { mk_id (DeIid "+") $startpos $endpos } - | Op Minus { mk_id (DeIid "-") $startpos $endpos } - | Op Star { mk_id (DeIid "*") $startpos $endpos } - | Op EqEq { mk_id (DeIid "==") $startpos $endpos } - | Op ExclEq { mk_id (DeIid "!=") $startpos $endpos } - | Op Lt { mk_id (DeIid "<") $startpos $endpos } - | Op Gt { mk_id (DeIid ">") $startpos $endpos } - | Op LtEq { mk_id (DeIid "<=") $startpos $endpos } - | Op GtEq { mk_id (DeIid ">=") $startpos $endpos } - | Op Amp { mk_id (DeIid "&") $startpos $endpos } - | Op Bar { mk_id (DeIid "|") $startpos $endpos } - | Op Caret { mk_id (DeIid "^") $startpos $endpos } + | Op Op0 { mk_id (Operator $2) $startpos $endpos } + | Op Op1 { mk_id (Operator $2) $startpos $endpos } + | Op Op2 { mk_id (Operator $2) $startpos $endpos } + | Op Op3 { mk_id (Operator $2) $startpos $endpos } + | Op Op4 { mk_id (Operator $2) $startpos $endpos } + | Op Op5 { mk_id (Operator $2) $startpos $endpos } + | Op Op6 { mk_id (Operator $2) $startpos $endpos } + | Op Op7 { mk_id (Operator $2) $startpos $endpos } + | Op Op8 { mk_id (Operator $2) $startpos $endpos } + | Op Op9 { mk_id (Operator $2) $startpos $endpos } + + | Op Op0l { mk_id (Operator $2) $startpos $endpos } + | Op Op1l { mk_id (Operator $2) $startpos $endpos } + | Op Op2l { mk_id (Operator $2) $startpos $endpos } + | Op Op3l { mk_id (Operator $2) $startpos $endpos } + | Op Op4l { mk_id (Operator $2) $startpos $endpos } + | Op Op5l { mk_id (Operator $2) $startpos $endpos } + | Op Op6l { mk_id (Operator $2) $startpos $endpos } + | Op Op7l { mk_id (Operator $2) $startpos $endpos } + | Op Op8l { mk_id (Operator $2) $startpos $endpos } + | Op Op9l { mk_id (Operator $2) $startpos $endpos } + + | Op Op0r { mk_id (Operator $2) $startpos $endpos } + | Op Op1r { mk_id (Operator $2) $startpos $endpos } + | Op Op2r { mk_id (Operator $2) $startpos $endpos } + | Op Op3r { mk_id (Operator $2) $startpos $endpos } + | Op Op4r { mk_id (Operator $2) $startpos $endpos } + | Op Op5r { mk_id (Operator $2) $startpos $endpos } + | Op Op6r { mk_id (Operator $2) $startpos $endpos } + | Op Op7r { mk_id (Operator $2) $startpos $endpos } + | Op Op8r { mk_id (Operator $2) $startpos $endpos } + | Op Op9r { mk_id (Operator $2) $startpos $endpos } + + | Op Plus { mk_id (Operator "+") $startpos $endpos } + | Op Minus { mk_id (Operator "-") $startpos $endpos } + | Op Star { mk_id (Operator "*") $startpos $endpos } + | Op EqEq { mk_id (Operator "==") $startpos $endpos } + | Op ExclEq { mk_id (Operator "!=") $startpos $endpos } + | Op Lt { mk_id (Operator "<") $startpos $endpos } + | Op Gt { mk_id (Operator ">") $startpos $endpos } + | Op LtEq { mk_id (Operator "<=") $startpos $endpos } + | Op GtEq { mk_id (Operator ">=") $startpos $endpos } + | Op Amp { mk_id (Operator "&") $startpos $endpos } + | Op Bar { mk_id (Operator "|") $startpos $endpos } + | Op Caret { mk_id (Operator "^") $startpos $endpos } op0: Op0 { mk_id (Id $1) $startpos $endpos } op1: Op1 { mk_id (Id $1) $startpos $endpos } |
