1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
open Format
open Syntax
let process source_code_file debug env =
match Env.get_package source_code_file env with
| Ok vl -> Ok (vl, env)
| Error _ -> (
let ic = open_in source_code_file in
let lexbuf = Sedlexing.Utf8.from_channel ic in
try
Sedlexing.set_filename lexbuf source_code_file;
let lexer = Sedlexing.with_tokenizer Lexer.token lexbuf in
let parser =
MenhirLib.Convert.Simplified.traditional2revised Parser.chunk
in
let chunk = parser lexer in
if debug then begin
print_endline "debug mode: initial source view ...";
Ast.print_block Format.std_formatter chunk
end;
let* () = Static_analysis.Variadic_func.analyze chunk in
let* () = Static_analysis.Const_var.analyze chunk in
let chunk, env = Scope.analysis chunk env in
if debug then begin
print_endline "debug mode: source after scope analysis view ...";
Ast.print_block Format.std_formatter chunk
end;
let* vl, env = Interpret.run chunk env in
let env = Env.add_package source_code_file vl env in
let () = close_in ic in
Ok (vl, env)
with
| Lexer.Lexing_error message ->
let message = sprintf "Lexical error: %s" message in
Error (None, message)
| Parser.Error ->
let loc = Sedlexing.lexing_positions lexbuf in
Error (Some loc, "Syntax error")
| Env.Env_error (_, message) ->
let message = sprintf "Env error: %s" message in
Error (None, message)
| Static_analysis.Static_analysis_error (loc, message) ->
let message = sprintf "Static analysis error: %s" message in
Error (loc, message)
| Typer.Typing_error (loc, message) ->
let message = sprintf "Typing error: %s" message in
Error (loc, message)
| Evaluator.Evaluation_error (loc, message) ->
let message = sprintf "Evaluation error: %s" message in
Error (loc, message)
| Interpret.Interpretation_error (loc, message) ->
let message = sprintf "Interpretation error: %s" message in
Error (loc, message) )