From 48507617e5af807d44c61cdd6d21f0abec09ee23 Mon Sep 17 00:00:00 2001 From: Emmanuel BERNAT Date: Sun, 19 May 2024 22:37:06 +0200 Subject: [PATCH] =?UTF-8?q?R=C3=A9organisation=20avant=20l'ajout=20de=20l'?= =?UTF-8?q?interpreteur.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/interpreter.rs | 2 ++ src/main.rs | 60 ++++++++++++++++++++++++++++++++++++----- src/rlox_interpreter.rs | 60 ----------------------------------------- 3 files changed, 56 insertions(+), 66 deletions(-) create mode 100644 src/interpreter.rs delete mode 100644 src/rlox_interpreter.rs diff --git a/src/interpreter.rs b/src/interpreter.rs new file mode 100644 index 0000000..3bd3a1b --- /dev/null +++ b/src/interpreter.rs @@ -0,0 +1,2 @@ +pub struct Interpreter; + diff --git a/src/main.rs b/src/main.rs index 5717056..b7983f4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,11 @@ -use std::env; +use std::{env, fs, io}; +use std::io::Write; use std::process; +use crate::astprinter::ASTPrinter; +use crate::expr::ExprVisitor; +use crate::parser::Parser; -mod rlox_interpreter; - +mod interpreter; mod scanner; mod token; mod token_type; @@ -10,7 +13,7 @@ mod expr; mod astprinter; mod parser; -use crate::rlox_interpreter::RLoxInterpreter; +use crate::scanner::Scanner; // Exit codes from #include const EX_OK: i32 = 0; @@ -21,8 +24,8 @@ fn main() { let args: Vec = env::args().collect(); let exit_code = match args.len() { - 1 => { RLoxInterpreter::new().run_prompt() } , - 2 => { RLoxInterpreter::new().run_file(&args[1]) }, + 1 => { run_prompt() } , + 2 => { run_file(&args[1]) }, _ => { println!("Usage : rlox [script]"); EX_USAGE @@ -32,6 +35,51 @@ fn main() { process::exit(exit_code); } +pub fn run_file(file_path: &str) -> i32 { + let contents = fs::read_to_string(file_path) + .expect(&format!("Should have been able to read the file {file_path}")); + + run(contents) +} + +pub fn run_prompt() -> i32 { + let mut exit_code = EX_OK; + loop { + print!("> "); + io::stdout().flush().expect("Unable to flush stdout"); + let mut line = String::new(); + + io::stdin() + .read_line(&mut line) + .expect("Failed to read line"); + + if line.trim().is_empty() { + break; + } + + exit_code = run(line); + } + exit_code +} + +fn run(src: String) -> i32 { + let mut scanner = Scanner::new( src ); + scanner.scan_tokens(); + + let mut parser = Parser::new( scanner.tokens ); + match parser.parse() { + Some(expr) => { + let mut printer = ASTPrinter { depth: 0 }; + printer.visit_expr(&expr); + println!(); + }, + None => println!("An error occurred while parsing expression.") + } + + EX_OK +} + + // Implémentations de référence : // https://github.com/munificent/craftinginterpreters/wiki/Lox-implementations#rust diff --git a/src/rlox_interpreter.rs b/src/rlox_interpreter.rs deleted file mode 100644 index 337a127..0000000 --- a/src/rlox_interpreter.rs +++ /dev/null @@ -1,60 +0,0 @@ -use std::{fs, io}; -use crate::EX_OK; -use std::io::Write; -use crate::astprinter::ASTPrinter; -use crate::expr::ExprVisitor; -use crate::parser::Parser; - -use crate::scanner::Scanner; - -pub struct RLoxInterpreter; - -impl RLoxInterpreter { - pub fn new() -> Self { - RLoxInterpreter - } - - pub fn run_file(&self, file_path: &str ) -> i32 { - let contents = fs::read_to_string(file_path) - .expect(&format!("Should have been able to read the file {file_path}")); - - self.run(contents) - } - - pub fn run_prompt(&self) -> i32 { - let mut exit_code = EX_OK; - loop { - print!("> "); - io::stdout().flush().expect("Unable to flush stdout"); - let mut line = String::new(); - - io::stdin() - .read_line(&mut line) - .expect("Failed to read line"); - - if line.trim().is_empty() { - break; - } - - exit_code = self.run(line); - } - exit_code - } - - fn run(&self, src: String) -> i32 { - let mut scanner = Scanner::new( src ); - scanner.scan_tokens(); - - let mut parser = Parser::new( scanner.tokens ); - match parser.parse() { - Some(expr) => { - let mut printer = ASTPrinter { depth: 0 }; - printer.visit_expr(&expr); - println!(); - }, - None => println!("An error occurred while parsing expression.") - } - - EX_OK - } -} \ No newline at end of file