Files
rlox/src/main.rs

72 lines
1.5 KiB
Rust

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;
// Exit codes from #include <sysexits.h>
const EX_OK: i32 = 0;
const EX_DATAERR: i32 = 65;
const EX_USAGE : i32 = 66;
fn main() {
let args: Vec<String> = env::args().collect();
let exit_code = match args.len() {
1 => run_prompt(),
2 => run_file(&args[1]),
_ => {
println!("Usage : rlox [script]");
EX_USAGE
}
};
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
// Pause :
// http://www.craftinginterpreters.com/scanning.html#lexical-errors