refactor: Use analyzer to parse rawtext into ast

This commit is contained in:
Lucàs
2024-07-04 00:41:32 +02:00
parent 6cbfb1c6a6
commit 0a42fbe3dc
5 changed files with 47 additions and 37 deletions
+1 -1
View File
@@ -3,4 +3,4 @@
(executable
(name main)
(public_name croissant)
(libraries parser lexer ast))
(libraries analyzer ast))
+11 -30
View File
@@ -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)
(* Array.iteri (fun i arg -> printf "%d: %s\n" i arg) Sys.argv; *)
let help_message = "Usage: croissant <file_path>\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 *)
+28
View File
@@ -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
+6 -5
View File
@@ -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))
+1 -1
View File
@@ -1,3 +1,3 @@
/*Hello, World!*/
var a = 1;
var a : entier = 1;