From 711968ffb31ee06630ed43740fd2538becc2765b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustav=20S=C3=B6rn=C3=A4s?= Date: Mon, 11 Jan 2021 16:03:58 +0100 Subject: compile from strings --- src/main.rs | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index 26b0d02..a2b5dae 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ mod vm; mod compiler; use error::Error; +use tokenizer::TokenStream; fn main() { let file = file_from_args().unwrap_or_else(|| Path::new("tests/simple.tdy").to_owned()); @@ -22,7 +23,14 @@ fn file_from_args() -> Option { } fn run_file(path: &Path) -> Result<(), Vec> { - let tokens = tokenizer::file_to_tokens(path); + run(tokenizer::file_to_tokens(path), path) +} + +fn run_string(s: &str) -> Result<(), Vec> { + run(tokenizer::string_to_tokens(s), Path::new("builtin")) +} + +fn run(tokens: TokenStream, path: &Path) -> Result<(), Vec> { match compiler::compile("main", path, tokens) { Ok(block) => vm::run_block(block).or_else(|e| Err(vec![e])), Err(errors) => Err(errors), @@ -31,22 +39,29 @@ fn run_file(path: &Path) -> Result<(), Vec> { #[cfg(test)] mod tests { - use super::run_file; + use super::{run_file, run_string}; use crate::error::{Error, ErrorKind}; use std::path::Path; + macro_rules! assert_errs { + ($result:expr, [ $( $kind:pat ),* ]) => { + println!("{} => {:?}", stringify!($result), $result); + assert!(matches!( + $result.unwrap_err().as_slice(), + &[$(Error { + kind: $kind, + file: _, + line: _, + message: _, + }, + )*] + )) + }; + } + #[test] fn unreachable_token() { - let file = Path::new("tests/unreachable.tdy"); - assert!(matches!( - run_file(&file).unwrap_err().as_slice(), - &[Error { - kind: ErrorKind::Unreachable, - file: _, - line: _, - message: _, - }] - )); + assert_errs!(run_string("\n"), [ErrorKind::Unreachable]); } macro_rules! test_file { -- cgit v1.2.1