rudus/src/main.rs

77 lines
1.3 KiB
Rust
Raw Normal View History

use chumsky::{input::Stream, prelude::*};
2024-12-18 04:45:39 +00:00
mod memory_sandbox;
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 = "
2024-12-18 04:45:39 +00:00
let foo = :let_foo
let bar = if true
then {
:foo
:bar
:baz
}
else {
1
2
3
}
2024-12-18 04:45:39 +00:00
foo
bar
";
run(src);
}