
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)