53 lines
1.2 KiB
Rust
53 lines
1.2 KiB
Rust
use std::fs;
|
|
|
|
use crate::interpreter::InterpreterState;
|
|
use crate::lexer::{LexerInfo, lexical_analysis, LexResult};
|
|
|
|
/// Execute the contents of a script file.
|
|
pub fn exec_file(interpreter: &mut InterpreterState, filename: &str) -> bool {
|
|
// Read the whole file
|
|
let source = match fs::read_to_string(filename) {
|
|
Ok(s) => s,
|
|
Err(e) => {
|
|
eprintln!("Cannot read file: {} ({})", filename, e);
|
|
return false;
|
|
}
|
|
};
|
|
|
|
let mut lexer_info = LexerInfo::new(filename, source.clone());
|
|
|
|
let result = lexical_analysis(&mut lexer_info);
|
|
|
|
match result {
|
|
LexResult::Ok(tokens) => {
|
|
for token in tokens {
|
|
if !interpreter.execute(&token) {
|
|
return false;
|
|
}
|
|
}
|
|
true
|
|
}
|
|
|
|
LexResult::Err(err) => {
|
|
dbg!(err);
|
|
false
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Stand-alone file execution entry point.
|
|
pub fn run_file(filename: &str) -> i32 {
|
|
println!("Executing file: {}", filename);
|
|
|
|
let mut interpreter = InterpreterState::new();
|
|
if !interpreter.init() {
|
|
return 1;
|
|
}
|
|
|
|
if exec_file(&mut interpreter, filename) {
|
|
0
|
|
} else {
|
|
1
|
|
}
|
|
}
|