use std::cell::RefCell; use std::sync::Arc; use sexp::SourcePosition; use crate::asm::instr::flatten::labels_to_skips; use crate::asm::parse::{ParserContext, ParserState}; use crate::module::{CrsnExtension, CrsnUniq}; use crate::runtime::program::Program; use crate::builtin::BuiltinOps; pub mod data; pub mod error; pub mod instr; pub mod parse; pub mod patches; /// Parse a program from string and assemble a low level instruction sequence from it. pub fn assemble(source: &str, uniq : &CrsnUniq, mut parsers: Vec>) -> Result, error::CrsnError> { parsers.insert(0, BuiltinOps::new()); for p in &mut parsers { p.init(uniq); } let pcx = ParserContext { parsers: &parsers, state: RefCell::new(ParserState { reg_aliases: Default::default(), reg_alias_stack: vec![], constants: Default::default(), }), }; let ops = parse::parse(source, &SourcePosition::default(), &pcx)?; let ops = labels_to_skips(ops)?; Ok(Program::new(ops, Arc::new(parsers))?) }