69 lines
1.2 KiB
Rust
69 lines
1.2 KiB
Rust
|
use chumsky::{input::Stream, prelude::*};
|
||
|
|
||
|
mod spans;
|
||
|
|
||
|
mod lexer;
|
||
|
use crate::lexer::lexer;
|
||
|
|
||
|
mod parser;
|
||
|
use crate::parser::parser;
|
||
|
|
||
|
mod validator;
|
||
|
|
||
|
mod compiler;
|
||
|
use crate::compiler::Chunk;
|
||
|
|
||
|
mod value;
|
||
|
|
||
|
mod vm;
|
||
|
use vm::Vm;
|
||
|
|
||
|
pub fn run(src: &'static str) {
|
||
|
let (tokens, lex_errs) = lexer().parse(src).into_output_errors();
|
||
|
if !lex_errs.is_empty() {
|
||
|
println!("{:?}", lex_errs);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
let tokens = tokens.unwrap();
|
||
|
|
||
|
let (parse_result, parse_errors) = parser()
|
||
|
.parse(Stream::from_iter(tokens).map((0..src.len()).into(), |(t, s)| (t, s)))
|
||
|
.into_output_errors();
|
||
|
if !parse_errors.is_empty() {
|
||
|
println!("{:?}", parse_errors);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
let parsed = parse_result.unwrap();
|
||
|
|
||
|
let mut chunk = Chunk::new(&parsed, "test", src);
|
||
|
chunk.compile();
|
||
|
chunk.disassemble();
|
||
|
|
||
|
let mut vm = Vm::new(&chunk);
|
||
|
let result = vm.interpret();
|
||
|
let output = match result {
|
||
|
Ok(val) => val.show(&chunk),
|
||
|
Err(panic) => format!("{:?}", panic),
|
||
|
};
|
||
|
println!("{output}");
|
||
|
}
|
||
|
|
||
|
pub fn main() {
|
||
|
let src = "
|
||
|
if false
|
||
|
then {
|
||
|
:foo
|
||
|
:bar
|
||
|
:baz
|
||
|
}
|
||
|
else {
|
||
|
1
|
||
|
2
|
||
|
3
|
||
|
}
|
||
|
";
|
||
|
run(src);
|
||
|
}
|