Skip to content

Commit

Permalink
Improve error messages
Browse files Browse the repository at this point in the history
  • Loading branch information
Tagada14 committed Jan 31, 2024
1 parent 250dd45 commit c2f06e6
Show file tree
Hide file tree
Showing 19 changed files with 235 additions and 204 deletions.
2 changes: 2 additions & 0 deletions .ocamlformat
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
profile = default
version = 0.26.1
7 changes: 3 additions & 4 deletions TestFile.neon
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,15 @@ let eq =
fun A: type =>
fun x: A =>
fun y: A =>
fun P: (A -> type) => P(x) -> P(y)
pi P: (A -> type) => P(x) -> P(y)


let refl_type =
pi A: type =>
pi a: A =>
pi P : (A -> type) =>
eq(A)(a)(a)(P)
eq(A)(a)(a)

let refl : refl_type =
let refl =
fun A: type =>
fun x: A =>
fun P: (A -> type) =>
Expand Down
2 changes: 1 addition & 1 deletion bin/dune
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
(executable
(public_name neon)
(name main)
(libraries ast parser typeChecker prettyPrinter))
(libraries ast env parser typeChecker prettyPrinter))
17 changes: 11 additions & 6 deletions bin/main.ml
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
let env = Ast.create_env ()
let print (term, tp) = print_endline (PrettyPrinter.term_to_string term ^ ": " ^ PrettyPrinter.term_to_string tp)
let _ = List.iter print (List.map (TypeChecker.infer_type env) (Parser.parse_file "TestFile.neon"))
let env = Env.create_env ()

let print (term, tp) =
print_endline
(PrettyPrinter.term_to_string term ^ ": " ^ PrettyPrinter.term_to_string tp)

let _ =
List.iter print
(List.map (TypeChecker.infer_type env) (Parser.parse_file "TestFile.neon"))

(* let term, tp = TypeChecker.infer_type env (List.hd (Parser.parse_file "TestFile.neon"))
let term_s = PrettyPrinter.term_to_string term
let tp_s = PrettyPrinter.term_to_string tp
let _ = print_endline (term_s ^ ": " ^ tp_s) *)
let term_s = PrettyPrinter.term_to_string term
let tp_s = PrettyPrinter.term_to_string tp
let _ = print_endline (term_s ^ ": " ^ tp_s) *)
66 changes: 3 additions & 63 deletions lib/ast/ast.ml
Original file line number Diff line number Diff line change
@@ -1,76 +1,16 @@
(* TERMS *)
type var = int

type term =
type term =
| Type
| Kind
| Triangle
| Var of string * var
| Lambda of string * var * tp * term
| Product of string * var * tp * tp
| App of term * term
| Hole of string * tp
| Hole of string * tp
| Let of string * var * term * tp * term
| TypeArrow of tp * tp
and tp = term


(* ENV *)
module UTermEnvHashtbl = Hashtbl.Make(String)
module TermEnvHashtbl = Hashtbl.Make(Int)

type env_var =
| Opaque of tp
| Transparent of term * tp

type uTermEnv = var UTermEnvHashtbl.t
type termEnv = env_var TermEnvHashtbl.t
type env = uTermEnv * termEnv

let counter = ref 0

let fresh_var () : int =
let fresh_var = !counter in
let _ = counter := !counter + 1 in
fresh_var



let create_env () : env =
UTermEnvHashtbl.create 10, TermEnvHashtbl.create 10

let add_to_env (uTermEnv, termEnv: env) (nm : string) (var : env_var) : var =
let y = fresh_var () in
let _ = UTermEnvHashtbl.add uTermEnv nm y in
let _ = TermEnvHashtbl.add termEnv y var in
y

let add_to_termEnv (termEnv: termEnv) (var: var) (env_var : env_var) : unit =
TermEnvHashtbl.add termEnv var env_var

let rm_from_env (uTermEnv, termEnv: env) (nm : string) : unit =
let y = UTermEnvHashtbl.find uTermEnv nm in
let _ = UTermEnvHashtbl.remove uTermEnv nm in
TermEnvHashtbl.remove termEnv y

let rm_from_termEnv (termEnv: termEnv) (var: var) : unit =
TermEnvHashtbl.remove termEnv var

let find_opt_in_env (uTermEnv, termEnv: env) (nm: string) : (var * env_var) option =
match UTermEnvHashtbl.find_opt uTermEnv nm with
| None -> None
| Some var ->
match TermEnvHashtbl.find_opt termEnv var with
| None -> None
| Some env_var -> Some (var, env_var)

let find_opt_in_termEnv (termEnv: termEnv) (var : var) : env_var option =
match TermEnvHashtbl.find_opt termEnv var with
| None -> None
| Some env_var -> Some env_var

let print_env (uTermEnv, termEnv: env) : string =
UTermEnvHashtbl.iter (fun key val -> Printf.sprintf ("%s ->" ^^ " %s\n") key val) uTermEnv

(* "x" -> num -> term*)

and tp = term
3 changes: 3 additions & 0 deletions lib/env/dune
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
(library
(name env)
(libraries prettyPrinter ast))
71 changes: 71 additions & 0 deletions lib/env/env.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
open Ast

(* ENV *)
module UTermEnvHashtbl = Hashtbl.Make(String)
module TermEnvHashtbl = Hashtbl.Make(Int)

type env_var =
| Opaque of tp
| Transparent of term * tp

type uTermEnv = var UTermEnvHashtbl.t
type termEnv = env_var TermEnvHashtbl.t
type env = uTermEnv * termEnv

let counter = ref 0

let fresh_var () : int =
let fresh_var = !counter in
let _ = counter := !counter + 1 in
fresh_var



let create_env () : env =
UTermEnvHashtbl.create 10, TermEnvHashtbl.create 10

let add_to_env (uTermEnv, termEnv: env) (nm : string) (var : env_var) : var =
let y = fresh_var () in
let _ = UTermEnvHashtbl.add uTermEnv nm y in
let _ = TermEnvHashtbl.add termEnv y var in
y

let add_to_termEnv (termEnv: termEnv) (var: var) (env_var : env_var) : unit =
TermEnvHashtbl.add termEnv var env_var

let rm_from_env (uTermEnv, termEnv: env) (nm : string) : unit =
let y = UTermEnvHashtbl.find uTermEnv nm in
let _ = UTermEnvHashtbl.remove uTermEnv nm in
TermEnvHashtbl.remove termEnv y

let rm_from_termEnv (termEnv: termEnv) (var: var) : unit =
TermEnvHashtbl.remove termEnv var

let find_opt_in_env (uTermEnv, termEnv: env) (nm: string) : (var * env_var) option =
match UTermEnvHashtbl.find_opt uTermEnv nm with
| None -> None
| Some var ->
match TermEnvHashtbl.find_opt termEnv var with
| None -> None
| Some env_var -> Some (var, env_var)

let find_opt_in_termEnv (termEnv: termEnv) (var : var) : env_var option =
match TermEnvHashtbl.find_opt termEnv var with
| None -> None
| Some env_var -> Some env_var

let env_var_to_string (env_var : env_var option) : string =
match env_var with
| None -> "Not found"
| Some Opaque tp -> PrettyPrinter.term_to_string tp
| Some Transparent (term, tp) -> PrettyPrinter.term_to_string term ^ " : " ^ PrettyPrinter.term_to_string tp

let env_to_string (uTermEnv, termEnv: env) : string =
(UTermEnvHashtbl.fold (fun key v acc -> acc ^ Printf.sprintf ("%s -> %d -> %s\n") key v
(env_var_to_string (TermEnvHashtbl.find_opt termEnv v))) uTermEnv "\n") ^ "\n"

let termEnv_to_string (termEnv: termEnv) : string =
(TermEnvHashtbl.fold (fun key v acc -> acc ^ Printf.sprintf ("%d -> %s\n") key
(env_var_to_string (Some v))) termEnv "\n") ^ "\n"

(* "x" -> num -> term *)
26 changes: 11 additions & 15 deletions lib/errors/errors.ml
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
type parser_reason =
| EofInComment
| InvalidNumber of string
| InvalidChar of char
| UnexpectedToken of string
| EofInComment
| InvalidNumber of string
| InvalidChar of char
| UnexpectedToken of string

exception Parse_error of ParserAst.position * parser_reason
exception Cannot_open_file of { fname : string; message : string }

exception Cannot_open_file of
{ fname : string
; message : string
}
type type_checker_reason =
| InferTypeError of string
| CheckTypeError of string
| EqualityError of string
| WhnfError of string

type type_checker_reason =
| InferTypeError of string * ParserAst.position
| CheckTypeError of string * ParserAst.position
| EqualityError of string
| WhnfError of string

exception Type_error of type_checker_reason
exception Type_error of type_checker_reason
6 changes: 3 additions & 3 deletions lib/lexer/dune
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
(library
(name lexer)
(libraries parserAst yaccParser errors))
(name lexer)
(libraries parserAst yaccParser errors))

(ocamllex lexer)
(ocamllex lexer)
4 changes: 2 additions & 2 deletions lib/parser/dune
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
(library
(name parser)
(libraries parserAst errors lexer yaccParser))
(name parser)
(libraries parserAst errors lexer yaccParser))
45 changes: 22 additions & 23 deletions lib/parser/parser.ml
Original file line number Diff line number Diff line change
@@ -1,31 +1,30 @@
type fname = string

let run_parser parse (lexbuf : Lexing.lexbuf) =
try parse Lexer.token lexbuf with
| Parsing.Parse_error ->
try parse Lexer.token lexbuf
with Parsing.Parse_error ->
let pos =
{ ParserAst.start = lexbuf.lex_start_p
; ParserAst.length = lexbuf.lex_curr_p.pos_cnum - lexbuf.lex_start_p.pos_cnum
} in
raise (Errors.Parse_error(pos, UnexpectedToken (Lexing.lexeme lexbuf)))
{
ParserAst.start = lexbuf.lex_start_p;
ParserAst.length =
lexbuf.lex_curr_p.pos_cnum - lexbuf.lex_start_p.pos_cnum;
}
in
raise (Errors.Parse_error (pos, UnexpectedToken (Lexing.lexeme lexbuf)))

let parse_file fname =
match open_in fname with
| chan ->
begin match
let lexbuf = Lexing.from_channel chan in
lexbuf.lex_curr_p <-
{ lexbuf.lex_curr_p with
pos_fname = fname
};
run_parser YaccParser.program lexbuf
with
| result ->
close_in chan;
result
| exception exn ->
close_in_noerr chan;
raise exn
end
| chan -> (
match
let lexbuf = Lexing.from_channel chan in
lexbuf.lex_curr_p <- { lexbuf.lex_curr_p with pos_fname = fname };
run_parser YaccParser.program lexbuf
with
| result ->
close_in chan;
result
| exception exn ->
close_in_noerr chan;
raise exn)
| exception Sys_error message ->
raise (Errors.Cannot_open_file { fname; message })
raise (Errors.Cannot_open_file { fname; message })
40 changes: 16 additions & 24 deletions lib/parserAst/parserAst.ml
Original file line number Diff line number Diff line change
@@ -1,29 +1,21 @@
type position =
{ start : Lexing.position
; length : int
}

type 'a node =
{ pos : position
; data : 'a
}
type position = { start : Lexing.position; length : int }
type 'a node = { pos : position; data : 'a }

type uTerm = term_data node

and term_data =
| Type
| Kind
| Var of string
| Lambda of string * uTerm option * uTerm
| Product of string * uTerm * uTerm
| App of uTerm * uTerm
| TermWithTypeAnno of uTerm * uTerm
| Let of string * uTerm * uTerm
| LetDef of string * uTerm
| Lemma of string * uTerm * uTerm
| LemmaDef of string * uTerm
| Hole of string
| TypeArrow of uTerm * uTerm
| Type
| Kind
| Var of string
| Lambda of string * uTerm option * uTerm
| Product of string * uTerm * uTerm
| App of uTerm * uTerm
| TermWithTypeAnno of uTerm * uTerm
| Let of string * uTerm * uTerm
| LetDef of string * uTerm
| Lemma of string * uTerm * uTerm
| LemmaDef of string * uTerm
| Hole of string
| TypeArrow of uTerm * uTerm

type program = uTerm list


5 changes: 3 additions & 2 deletions lib/prettyPrinter/dune
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
(library
(name prettyPrinter)
(flags (-warn-error -A))
(libraries ast parserAst))
(flags
(-warn-error -A))
(libraries ast parserAst))
Loading

0 comments on commit c2f06e6

Please sign in to comment.