000001| (** Common operations for lexing and parsing *)
000002|
000003| module Lx = Lexing
000004|
000005| (*let _ = Parsing.set_trace true*) (* Uncomment to debug parser *)
000006|
000007| exception Error of Lexing.position * string
000008|
000009| (* parse_with_lexbuf : lexbuf -> (string -> string -> pos -> 'a) -> Ast.ast *)
000010| let parse_with_lexbuf lexbuf error =
000011| try
000012| Parser.chunks Scanner.token lexbuf
000013| with
000014| | Failure msg ->
000015| error "Failure" msg lexbuf.Lexing.lex_curr_p
000016| | Parsing.Parse_error ->
000017| error "Parse error" "Syntactically incorrect Lua" lexbuf.Lexing.lex_curr_p
000018| | End_of_file ->
000019| error "Parse error" "Unexpected end of string" lexbuf.Lexing.lex_curr_p
000020|
000021| (* parse_with_filename : string -> Ast.ast *)
000022| let parse_with_filename fname =
000023| let in_ch = open_in fname in
000024| let lexbuf = Lx.from_channel in_ch in
000025| let curr_p = lexbuf.Lx.lex_curr_p in
000026| let () = lexbuf.Lx.lex_curr_p <- { curr_p with Lx.pos_fname = fname } in
000027| let ast = parse_with_lexbuf lexbuf Error.error in
000028| let () = close_in in_ch in
000029| ast
000030|
000031| (* parse_string_and_label : string -> Ast.ast * Last.last *)
000032| let parse_string_and_label str =
000033| let lexbuf = Lx.from_string str in
000034| let ast = parse_with_lexbuf lexbuf
000035| (fun m1 m2 pos ->
000036| raise (Error (pos, m1 ^ " - " ^ m2))) in
000037| (ast, Label.label_prog None ast) (* No filename available *)
000038|
000039| (* parse_and_label : string -> Ast.ast * Last.last *)
000040| let parse_and_label fname =
000041| let () = Label.reset() in
000042| let ast = parse_with_filename fname in
000043| (ast, Label.label_prog (Some fname) ast)