mirror of
https://github.com/Noratrieb/dilaria.git
synced 2026-01-14 17:35:03 +01:00
47 lines
1.2 KiB
Rust
47 lines
1.2 KiB
Rust
#![deny(clippy::disallowed_type)]
|
|
|
|
mod ast;
|
|
mod bytecode;
|
|
mod compile;
|
|
mod errors;
|
|
mod lex;
|
|
mod parse;
|
|
mod value;
|
|
|
|
pub use lex::*;
|
|
pub use parse::*;
|
|
|
|
pub fn run_program(program: &str) {
|
|
let lexer = lex::Lexer::lex(program);
|
|
let (success, errors) = lexer.partition::<Vec<_>, _>(|result| result.is_ok());
|
|
|
|
if errors.is_empty() {
|
|
let tokens = success.into_iter().collect::<Result<Vec<_>, _>>().unwrap();
|
|
|
|
println!(
|
|
"Tokens:\n{:?}\n",
|
|
tokens.iter().map(|token| &token.kind).collect::<Vec<_>>()
|
|
);
|
|
|
|
let ast = parse::parse(tokens);
|
|
|
|
match ast {
|
|
Ok(ast) => {
|
|
println!("AST:\n{:?}\n", ast);
|
|
|
|
let bytecode = compile::compile(&ast);
|
|
|
|
match bytecode {
|
|
Ok(code) => println!("Bytecode:\n{:#?}\n", code),
|
|
Err(err) => errors::display_error(program, err),
|
|
}
|
|
}
|
|
Err(err) => errors::display_error(program, err),
|
|
}
|
|
} else {
|
|
errors
|
|
.into_iter()
|
|
.map(Result::unwrap_err)
|
|
.for_each(|err| errors::display_error(program, err));
|
|
}
|
|
}
|