flan/lib/parse.ml
2024-07-09 21:01:55 +10:00

32 lines
1015 B
OCaml

open Lexing
exception SyntaxError of string
(* Prints the line number and character number where the error occurred.*)
let print_error_position lexbuf =
let pos = lexbuf.lex_curr_p in
Printf.sprintf "Line:%d Position:%d" pos.pos_lnum (pos.pos_cnum - pos.pos_bol + 1)
let parse_program lexbuf =
try Ok (Oflan.prog Olexer.read lexbuf) with
| SyntaxError msg ->
let error_msg = Printf.sprintf "%s: %s\n" (print_error_position lexbuf) msg in
Error error_msg
| Oflan.Error ->
let error_msg = Printf.sprintf "%s: syntax error\n" (print_error_position lexbuf) in
Error error_msg
open Omniflan.Ast
let string_of_expr expr = match expr with Int i -> "Int " ^ string_of_int i
let string_of_stmt stmt =
match stmt with
| Let s -> Printf.sprintf "(%d) Let %s = %s" s.loc.pos_lnum s.var_name (string_of_expr s.bindee)
| FuncDecl -> failwith "TODO"
let print_ast prog =
List.iter
(fun toplevel -> match toplevel with Stmt stmt -> print_endline (string_of_stmt stmt))
prog