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