mod preproc; mod ast; mod table; mod states; use anyhow::{Result, Context}; use crate::ast::Parseable; fn read_source(path: &str) -> Result { std::fs::read_to_string(path) .with_context(|| format!("Failed to read file at path '{}'", path) ) } pub fn run(path: &str) -> Result<()> { let source: String = read_source(path)?; let mut flat_parser = preproc::tokenize(source); let parsers = crate::preproc::Parsers::new(&mut flat_parser).with_context(|| format!("Could not determine different parts of the expression.") )?; let mut l_parser = parsers.l_parser; let expr = ast::Expr::consume(&mut l_parser)?; let table = ast::build_table(expr); let mut states_parser = parsers.s_parser; let mut states = states::States::parse(&mut states_parser); let steps = parsers.steps; for _ in 0..steps { states.print(); states.update_using(&table); } states.print(); Ok(()) }