use chumsky::{input::Stream, prelude::*}; 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 = " let foo = :let_foo let bar = if true then { :foo :bar :baz } else { 1 2 3 } foo bar "; run(src); }