Skip to content

Commit ef5fb87

Browse files
committed
Validate top level clauses in Sakura files
1 parent f9911eb commit ef5fb87

3 files changed

Lines changed: 37 additions & 11 deletions

File tree

lib/Executor.ml

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,6 @@ let parse : string -> Ast.ParserClause.t list attempt = function
88
if in_channel_length inc = 0 then error @@ Error.EmptyFile str
99
else ok @@ Parser.parse str (In_channel.input_all inc)
1010

11-
let preprocess (preprocessor : Preprocessor.t) :
12-
Ast.ParserClause.t list -> Preprocessor.output attempt =
13-
fun decls_queries ->
14-
ok @@ Preprocessor.group_clauses preprocessor decls_queries
15-
1611
let compile' (step : Ast.Clause.t list * Compiler.Types.t -> Compiler.Types.t)
1712
(compiler : Compiler.Types.t) :
1813
Ast.Clause.t list -> Compiler.Types.t attempt =
@@ -44,23 +39,27 @@ end
4439
type preprocessed_files = Ast.Clause.t BatFingerTree.t BatMap.String.t
4540
type preprocessed_result = Preprocessor.DependencyGraph.t * preprocessed_files
4641

42+
let preprocess filepath =
43+
Error.map @@ Preprocessor.run (Preprocessor.initialize filepath)
44+
4745
(* FIXME: hook up dependency information and sort the file list before compiling *)
4846
(* TODO: compilation cache *)
4947
let compile ({ sakura_module_name } : Compiler.Types.cli)
5048
(persist : Compiler.Types.Persist.t) (filepaths : string list) :
5149
unit attempt =
52-
let is_sakura_file filepath = Filename.extension filepath = ".skr" in
5350
let sakura_filename = sakura_module_name ^ ".skr" in
54-
let sakura_files, karuta_files = BatList.partition is_sakura_file filepaths in
51+
let sakura_files, karuta_files =
52+
BatList.partition Preprocessor.is_sakura_file filepaths
53+
in
5554
let* sakura_output =
5655
sakura_files
5756
|> Error.fold (fun parsed filepath ->
5857
parse filepath |> Error.map (List.append parsed))
59-
||> preprocess (Preprocessor.initialize sakura_filename)
58+
|> preprocess sakura_filename
6059
in
6160
let compile_one_file (preprocessed : preprocessed_files) filepath externals =
6261
let compiler_config =
63-
if is_sakura_file filepath then
62+
if Preprocessor.is_sakura_file filepath then
6463
(module Sakura : Compiler.Types.COMPILER_CONFIG)
6564
else (module Karuta : Compiler.Types.COMPILER_CONFIG)
6665
in
@@ -81,7 +80,7 @@ let compile ({ sakura_module_name } : Compiler.Types.cli)
8180
{ (Preprocessor.initialize filepath) with dependencies }
8281
in
8382
let* { dependencies; clauses } =
84-
filepath |> parse ||> preprocess preprocessor
83+
filepath |> parse |> Error.map @@ Preprocessor.run preprocessor
8584
in
8685
ok (dependencies, BatMap.String.add filepath clauses preprocessed)
8786
in

lib/Preprocessor.ml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,3 +462,26 @@ and group_clauses ({ dependencies; _ } as preprocessor : t)
462462
|> List.map check_empty_heads |> List.group compare_clauses
463463
|> fold_map preprocessor.dependencies multi_mapper
464464
|> map_clauses (BatFingerTree.sort canonical_order)
465+
466+
let is_sakura_file filepath = Filename.extension filepath = ".skr"
467+
468+
let validate_top_level (clauses : Ast.ParserClause.t list) :
469+
Ast.ParserClause.t list =
470+
let open Ast.ParserClause in
471+
let open Location in
472+
let is_not_directive = function
473+
| { content = Declaration _; _ } -> true
474+
| { content = QueryConjunction _; _ } -> true
475+
| { content = Directive _; _ } -> false
476+
in
477+
match List.find_opt is_not_directive clauses with
478+
| None -> clauses
479+
| Some { loc; _ } ->
480+
Logger.error loc "Found a non-directive in a Sakura file";
481+
exit 1
482+
483+
let run ({ filename; _ } as preprocessor : t)
484+
(clauses : Ast.ParserClause.t list) : output =
485+
if is_sakura_file filename then
486+
validate_top_level clauses |> group_clauses preprocessor
487+
else group_clauses preprocessor clauses

lib/database/Directive.ml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,13 @@ let compile (directive_loc : Location.location)
77
(initialize_nested : Compiler.Types.initialize_nested) : t =
88
let module Lookup = (val compiler.lookup) in
99
match (Ast.Expr.extract_func_label func, arity, body) with
10-
| "module", _, _ | "signature", _, _ ->
10+
| "module", _, _ ->
1111
Shared.Directive.compile directive_loc func body step compiler
1212
initialize_nested
13+
| "signature", _, _ ->
14+
Logger.error directive_loc
15+
"TODO: Sakura has special treatment for signatures";
16+
exit 1
1317
| "project", 0, _ ->
1418
Logger.error directive_loc "Sakura does not support project directive";
1519
exit 1

0 commit comments

Comments
 (0)