diff --git a/src/main.rs b/src/main.rs index 6cfeddc..b3b8b4c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,16 +1,9 @@ use std::env; -use std::fs; -use std::io; use std::io::Write; use std::process; mod rlox; -mod scanner; -mod token_type; -mod token; - -use crate::rlox::RLox; -use crate::scanner::Scanner; +use crate::rlox::rlox_interpreter::RLoxInterpreter; // Exit codes from #include const EX_OK: i32 = 0; @@ -21,8 +14,8 @@ fn main() { let args: Vec = env::args().collect(); let exit_code = match args.len() { - 1 => run_prompt(), - 2 => run_file(&args[1]), + 1 => { RLoxInterpreter::new().run_prompt() } , + 2 => { RLoxInterpreter::new().run_file(&args[1]) }, _ => { println!("Usage : rlox [script]"); EX_USAGE @@ -32,37 +25,6 @@ fn main() { process::exit(exit_code); } -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) -} - -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( script: String ) -> i32 { - let rlox_interpreter = RLox { had_error: false }; - if rlox_interpreter.had_error { EX_DATAERR } else { EX_OK } -} // Implémentations de référence : // https://github.com/munificent/craftinginterpreters/wiki/Lox-implementations#rust diff --git a/src/rlox.rs b/src/rlox.rs deleted file mode 100644 index 48fb0dd..0000000 --- a/src/rlox.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::scanner::Scanner; - -pub struct RLox { - pub had_error: bool, -} - -impl RLox { - fn error(&self, line: u32, message: String) { - self.report(line, String::from(""), message); - } - - fn report(&self, line: u32, place: String, message: String) { - println!("[line {line}] Error {place}: {message}"); - } - - fn run(&self, src: String) { - let mut scanner = Scanner::create_scanner( src ); - - - } -} diff --git a/src/rlox/mod.rs b/src/rlox/mod.rs new file mode 100644 index 0000000..0e39d0b --- /dev/null +++ b/src/rlox/mod.rs @@ -0,0 +1,4 @@ +pub mod rlox_interpreter; +pub mod scanner; +pub mod token; +pub mod token_type; diff --git a/src/rlox/rlox_interpreter.rs b/src/rlox/rlox_interpreter.rs new file mode 100644 index 0000000..b040d7b --- /dev/null +++ b/src/rlox/rlox_interpreter.rs @@ -0,0 +1,57 @@ +use std::{fs, io}; +use crate::{EX_DATAERR, EX_OK}; +use crate::scanner::Scanner; +use std::io::Write; + +pub struct RLoxInterpreter { + pub had_error: bool, +} + +impl RLoxInterpreter { + pub fn new() -> Self { + RLoxInterpreter { + had_error: false, + } + } + + fn error(&self, line: u32, message: String) { + self.report(line, String::from(""), message); + } + + fn report(&self, line: u32, place: String, message: String) { + println!("[line {line}] Error {place}: {message}"); + } + + 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::create_scanner( src ); + let rlox_interpreter = RLoxInterpreter { had_error: false }; + if rlox_interpreter.had_error { EX_DATAERR } else { EX_OK } + } +} \ No newline at end of file diff --git a/src/scanner.rs b/src/rlox/scanner.rs similarity index 100% rename from src/scanner.rs rename to src/rlox/scanner.rs diff --git a/src/token.rs b/src/rlox/token.rs similarity index 100% rename from src/token.rs rename to src/rlox/token.rs diff --git a/src/token_type.rs b/src/rlox/token_type.rs similarity index 100% rename from src/token_type.rs rename to src/rlox/token_type.rs