diff options
| author | Alasdair Armstrong | 2018-01-25 00:30:24 +0000 |
|---|---|---|
| committer | Alasdair Armstrong | 2018-01-25 00:30:24 +0000 |
| commit | d87d4ad3a6d2ec2804cb7b20128fecb6d9df4e6e (patch) | |
| tree | 76a85742db61e8f4dcac8471c6c0856603453543 /src/sail.ml | |
| parent | 10e2be330c14aaddbd8ada6b6ce8a8a63c7d605e (diff) | |
Add simple conditional processing and file include
Can now use C-style include declarations to include files within other sail files. This is done in such a way that all the location information is preserved in error messages. As an example:
$include "aarch64/prelude.sail"
$define SYM
$ifndef SYM
$include <../util.sail>
$endif
would include the file aarch64/prelude.sail relative to the file where the include is contained. It then defines a symbol SYM and includes another file if it is not defined. The <../util.sail> include will be accessed relative to $SAIL_DIR/lib, so $SAIL_DIR/lib/../util.sail in this case.
This can be used with the standard C trick of
$ifndef ONCE
$define ONCE
val f : unit -> unit
$endif
so no matter how many sail files include the above file, the valspec for f will only appear once.
Currently we just have $include, $define, $ifdef and $ifndef (with $else and $endif). We're using $ rather than # because # is already used in internal identifiers, although this could be switched.
Diffstat (limited to 'src/sail.ml')
| -rw-r--r-- | src/sail.ml | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/src/sail.ml b/src/sail.ml index b819350b..d5ef684b 100644 --- a/src/sail.ml +++ b/src/sail.ml @@ -193,6 +193,7 @@ let load_files type_envs files = let ast = List.fold_right (fun (_, Parse_ast.Defs ast_nodes) (Parse_ast.Defs later_nodes) -> Parse_ast.Defs (ast_nodes@later_nodes)) parsed (Parse_ast.Defs []) in + let ast = Process_file.preprocess_ast ast in let ast = convert_ast Ast_util.inc_ord ast in let (ast, type_envs) = check_ast type_envs ast in |
