Source file parse.ml

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
module Value = Runtime.Value
open Util.Error

let error = error_parse
let error_no_region = error_parse_no_region

let preprocess (includes : string list) (path : string) =
  try Preprocessor.preprocess includes path
  with _ -> "preprocessor error" |> error_no_region

let lex (path : string) (file : string) =
  try
    let () = Lexer.reset () in
    let lexbuf = Lexing.from_string file in
    let () = Lexing.set_filename lexbuf path in
    lexbuf
  with Lexer.Error s -> Format.asprintf "lexer error: %s" s |> error_no_region

let parse (lexbuf : Lexing.lexbuf) : Value.t =
  try Parser.p4program Lexer.lexer lexbuf with
  | Lexer.Error s ->
      let at = Lexer.at lexbuf in
      let msg = Format.asprintf "lexer error: %s" s in
      error at msg
  | Parser.Error ->
      let at = Lexer.at lexbuf in
      let msg = Format.asprintf "syntax error" in
      error at msg
  | e -> raise e

let parse_string (path : string) (str : string) : Value.t =
  (* Assume str is preprocessed *)
  let tokens = lex path str in
  parse tokens

let parse_file (includes : string list) (path : string) : Value.t =
  let program = preprocess includes path in
  parse_string path program

let parse_file_fresh (includes : string list) (path : string) : Value.t =
  Value.Fresh_.refresh ();
  parse_file includes path