diff --git a/bin/dune b/bin/dune index ed59a55..0294cf5 100644 --- a/bin/dune +++ b/bin/dune @@ -3,4 +3,4 @@ (executable (name main) (public_name croissant) - (libraries parser lexer ast)) + (libraries analyzer ast)) diff --git a/bin/main.ml b/bin/main.ml index 57a7f4a..92e059a 100644 --- a/bin/main.ml +++ b/bin/main.ml @@ -3,35 +3,16 @@ 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 +exception Error of string let () = - let lexbuf = get_lexbuf () in - let res = - try Parser.main Lexer.token lexbuf with - | Lexer.Error 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 -> - 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) \ No newline at end of file + (* Array.iteri (fun i arg -> printf "%d: %s\n" i arg) Sys.argv; *) + let help_message = "Usage: croissant \n" + and args_count = Array.length Sys.argv - 1 in + if args_count >= 2 then printf "%s" help_message + else if args_count = 1 then + let file_path = Sys.argv.(1) in + let ast = string_of_source_file (Analyzer.analyze_file file_path) in + printf "%s\n" ast + else raise (Error "interpreter from stdin is not implemented yet") +(* TODO: Implement interpreter from stdin *) \ No newline at end of file diff --git a/lib/analyzer.ml b/lib/analyzer.ml new file mode 100644 index 0000000..d3ee265 --- /dev/null +++ b/lib/analyzer.ml @@ -0,0 +1,28 @@ +open Printf + +let analyze lexbuf = + let ast = + try Parser.main Lexer.token lexbuf with + | Lexer.Error 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 -> + 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 + ast + +let analyze_file file_name = + let file_stream = open_in file_name in + let lexbuf = Lexing.from_channel file_stream in + Lexing.set_filename lexbuf file_name; + analyze lexbuf \ No newline at end of file diff --git a/lib/dune b/lib/dune index 100be86..88fa079 100644 --- a/lib/dune +++ b/lib/dune @@ -1,15 +1,16 @@ ;lib/dune -(library - (name lexer) - (modules lexer) - (libraries parser)) - (library (name parser) (modules parser) (libraries ast)) +(library + (name analyzer) + (modules lexer analyzer) + (libraries parser) +) + (menhir (modules parser)) diff --git a/test/ressources/test.🥐 b/test/ressources/test.🥐 index 67f84f7..f7e8790 100644 --- a/test/ressources/test.🥐 +++ b/test/ressources/test.🥐 @@ -1,3 +1,3 @@ /*Hello, World!*/ -var a = 1; \ No newline at end of file +var a : entier = 1; \ No newline at end of file