diff --git a/bin/main.ml b/bin/main.ml index f9cfbc1..57a7f4a 100644 --- a/bin/main.ml +++ b/bin/main.ml @@ -3,17 +3,35 @@ open Printf open Ast.Print +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 = Lexing.from_channel stdin in + 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 - Printf.printf "%s\n" (string_of_source_file res) + Printf.printf "%s\n" (string_of_source_file res) \ No newline at end of file diff --git a/lib/ast/print.ml b/lib/ast/print.ml index ea5d642..cbb6fd6 100644 --- a/lib/ast/print.ml +++ b/lib/ast/print.ml @@ -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 \ No newline at end of file diff --git a/lib/lexer.mll b/lib/lexer.mll index bb69f77..e63cbb8 100644 --- a/lib/lexer.mll +++ b/lib/lexer.mll @@ -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 } diff --git a/test/ressources/test.🥐 b/test/ressources/test.🥐 index e9bc629..67f84f7 100644 --- a/test/ressources/test.🥐 +++ b/test/ressources/test.🥐 @@ -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; \ No newline at end of file