feat: Support file as argument and better error message

This commit is contained in:
Lucàs
2024-07-03 17:05:54 +02:00
parent e3c26ba702
commit 6cbfb1c6a6
4 changed files with 42 additions and 44 deletions
+22 -4
View File
@@ -3,16 +3,34 @@
open Printf
open Ast.Print
let () =
let get_lexbuf () =
if Array.length Sys.argv > 1 then (
let lexbuf = Lexing.from_channel (open_in Sys.argv.(1)) in
Lexing.set_filename lexbuf Sys.argv.(1);
lexbuf)
else
let lexbuf = Lexing.from_channel stdin in
Lexing.set_filename lexbuf "stdin";
lexbuf
let () =
let lexbuf = get_lexbuf () in
let res =
try Parser.main Lexer.token lexbuf with
| Lexer.Error c ->
fprintf stderr "Lexical error at line %d: Unknown character '%c'\n"
lexbuf.lex_curr_p.pos_lnum c;
let file_name = lexbuf.lex_curr_p.pos_fname
and line_num = lexbuf.lex_curr_p.pos_lnum
and col_num = lexbuf.lex_curr_p.pos_cnum - lexbuf.lex_curr_p.pos_bol in
fprintf stderr "Fichier \"%s\", ligne %d, colonne %d\n%s: %s\n"
file_name line_num col_num "Erreur lexicale"
("Caractère '" ^ String.make 1 c ^ "' inconnu");
exit 1
| Parser.Error ->
fprintf stderr "Parse error at line %d:\n" lexbuf.lex_curr_p.pos_lnum;
let file_name = lexbuf.lex_curr_p.pos_fname
and line_num = lexbuf.lex_curr_p.pos_lnum
and col_num = lexbuf.lex_curr_p.pos_cnum - lexbuf.lex_curr_p.pos_bol in
fprintf stderr "Fichier \"%s\", ligne %d, colonne %d\n%s: %s\n"
file_name line_num col_num "Erreur syntaxique" "Syntaxe incorrecte";
exit 1
in
let _ = res in
+9 -9
View File
@@ -71,14 +71,14 @@ let string_of_source_file = function
let stmt_strings = List.map string_of_statement stmts in
"SourceFile([" ^ String.concat ", " stmt_strings ^ "])"
(** The signature of the module [PRINT]. *)
(** The signature of the module [Print]. *)
module type Print = sig
val string_of_type : Syntax._type -> string
val string_of_binary_operator : Syntax.binary_operator -> string
val string_of_unary_operator : Syntax.unary_operator -> string
val string_of_literal : Syntax.literal -> string
val string_of_expression : Syntax.expression -> string
val string_of_variable_declaration : Syntax.variable_declaration -> string
val string_of_statement : Syntax.statement -> string
val string_of_source_file : Syntax.source_file -> string
val string_of_type : _type -> string
val string_of_binary_operator : binary_operator -> string
val string_of_unary_operator : unary_operator -> string
val string_of_literal : literal -> string
val string_of_expression : expression -> string
val string_of_variable_declaration : variable_declaration -> string
val string_of_statement : statement -> string
val string_of_source_file : source_file -> string
end
+8 -5
View File
@@ -4,9 +4,8 @@
exception Error of char
}
let line_comment = "//" [^ '\n']*
let block_comment = "/*" [^'.']* "*/"
let comment = line_comment | block_comment
let line_comment = "//" [^'.']*'\n'
let block_comment = "/*" [^'.']* "*/"
let letter = ['a'-'z' 'A'-'Z']
let digit = ['0'-'9']
@@ -20,8 +19,12 @@ let char = "'" [^'.'] "'"
let string = '"' [^'.']* '"'
rule token = parse
| [' ' '\t'] | comment { token lexbuf }
| ['\n'] { Lexing.new_line lexbuf; token lexbuf }
| ' ' | '\t' { token lexbuf }
| '\n' | line_comment { Lexing.new_line lexbuf; token lexbuf }
| block_comment as comment {
String.iter (fun c -> if c = '\n' then Lexing.new_line lexbuf) comment;
token lexbuf
}
| '+' { PLUS }
| '-' { MINUS }
+2 -25
View File
@@ -1,26 +1,3 @@
// Déclaration d'une variable de type entier
var a: entier = 4 + 2 + 3 * 1;
/*Hello, World!*/
/*
SourceFile([
VariableStatement([
VariableDeclaration(
Type_Integer,
Identifier("a"),
BinaryExpression(
Add,
BinaryExpression(
Add,
Literal(Integer(4)),
Literal(Integer(2))
),
BinaryExpression(
Multiply,
Literal(Integer(3)),
Literal(Integer(1))
)
)
)
])
])
*/
var a = 1;