113 lines
3.9 KiB
OCaml
113 lines
3.9 KiB
OCaml
open Trace
|
|
|
|
module Parser = Parser_cameligo.Parser
|
|
module AST = Parser_cameligo.AST
|
|
module ParserLog = Parser_cameligo.ParserLog
|
|
module LexToken = Parser_cameligo.LexToken
|
|
module Lexer = Lexer.Make(LexToken)
|
|
|
|
let parse_file (source: string) : AST.t result =
|
|
let pp_input =
|
|
let prefix = Filename.(source |> basename |> remove_extension)
|
|
and suffix = ".pp.mligo"
|
|
in prefix ^ suffix in
|
|
|
|
let cpp_cmd = Printf.sprintf "cpp -traditional-cpp %s > %s"
|
|
source pp_input in
|
|
let%bind () = sys_command cpp_cmd in
|
|
|
|
let%bind channel =
|
|
generic_try (simple_error "error opening file") @@
|
|
(fun () -> open_in pp_input) in
|
|
let lexbuf = Lexing.from_channel channel in
|
|
let Lexer.{read ; close ; _} =
|
|
Lexer.open_token_stream None in
|
|
specific_try (function
|
|
| Parser.Error -> (
|
|
let start = Lexing.lexeme_start_p lexbuf in
|
|
let end_ = Lexing.lexeme_end_p lexbuf in
|
|
let str = Format.sprintf
|
|
"Parse error at \"%s\" from (%d, %d) to (%d, %d). In file \"%s|%s\"\n"
|
|
(Lexing.lexeme lexbuf)
|
|
start.pos_lnum (start.pos_cnum - start.pos_bol)
|
|
end_.pos_lnum (end_.pos_cnum - end_.pos_bol)
|
|
start.pos_fname source
|
|
in
|
|
simple_error str
|
|
)
|
|
| exn ->
|
|
let start = Lexing.lexeme_start_p lexbuf in
|
|
let end_ = Lexing.lexeme_end_p lexbuf in
|
|
let str = Format.sprintf
|
|
"Unrecognized error (%s) at \"%s\" from (%d, %d) to (%d, %d). In file \"%s|%s\"\n"
|
|
(Printexc.to_string exn)
|
|
(Lexing.lexeme lexbuf)
|
|
start.pos_lnum (start.pos_cnum - start.pos_bol)
|
|
end_.pos_lnum (end_.pos_cnum - end_.pos_bol)
|
|
start.pos_fname source
|
|
in
|
|
simple_error str
|
|
) @@ (fun () ->
|
|
let raw = Parser.contract read lexbuf in
|
|
close () ;
|
|
raw
|
|
) >>? fun raw ->
|
|
ok raw
|
|
|
|
let parse_string (s:string) : AST.t result =
|
|
let lexbuf = Lexing.from_string s in
|
|
let Lexer.{read ; close ; _} =
|
|
Lexer.open_token_stream None in
|
|
specific_try (function
|
|
| Parser.Error -> (
|
|
let start = Lexing.lexeme_start_p lexbuf in
|
|
let end_ = Lexing.lexeme_end_p lexbuf in
|
|
let str = Format.sprintf
|
|
"Parse error at \"%s\" from (%d, %d) to (%d, %d)\n"
|
|
(Lexing.lexeme lexbuf)
|
|
start.pos_lnum (start.pos_cnum - start.pos_bol)
|
|
end_.pos_lnum (end_.pos_cnum - end_.pos_bol) in
|
|
simple_error str
|
|
)
|
|
| _ -> simple_error "unrecognized parse_ error"
|
|
) @@ (fun () ->
|
|
let raw = Parser.contract read lexbuf in
|
|
close () ;
|
|
raw
|
|
) >>? fun raw ->
|
|
ok raw
|
|
|
|
let parse_expression (s:string) : AST.expr result =
|
|
let lexbuf = Lexing.from_string s in
|
|
let Lexer.{read ; close; _} =
|
|
Lexer.open_token_stream None in
|
|
specific_try (function
|
|
| Parser.Error -> (
|
|
let start = Lexing.lexeme_start_p lexbuf in
|
|
let end_ = Lexing.lexeme_end_p lexbuf in
|
|
let str = Format.sprintf
|
|
"Parse error at \"%s\" from (%d, %d) to (%d, %d)\n"
|
|
(Lexing.lexeme lexbuf)
|
|
start.pos_lnum (start.pos_cnum - start.pos_bol)
|
|
end_.pos_lnum (end_.pos_cnum - end_.pos_bol) in
|
|
simple_error str
|
|
)
|
|
| exn ->
|
|
let start = Lexing.lexeme_start_p lexbuf in
|
|
let end_ = Lexing.lexeme_end_p lexbuf in
|
|
let str = Format.sprintf
|
|
"Unrecognized error (%s) at \"%s\" from (%d, %d) to (%d, %d). In expression \"%s|%s\"\n"
|
|
(Printexc.to_string exn)
|
|
(Lexing.lexeme lexbuf)
|
|
start.pos_lnum (start.pos_cnum - start.pos_bol)
|
|
end_.pos_lnum (end_.pos_cnum - end_.pos_bol)
|
|
start.pos_fname s
|
|
in
|
|
simple_error str
|
|
) @@ (fun () ->
|
|
let raw = Parser.interactive_expr read lexbuf in
|
|
close () ;
|
|
raw
|
|
) >>? fun raw ->
|
|
ok raw
|