use std::sync::atomic::AtomicU32; pub use parse_instr::parse_instructions; use parse_routines::parse_routines; use crate::asm::error::Error; use crate::asm::instr::{Flatten, Op, Routine}; use crate::asm::instr::op::AsmModule; use crate::asm::parse::sexp_expect::expect_list; mod parse_cond; mod parse_instr; pub mod parse_data; mod parse_routines; pub mod sexp_expect; mod parse_op; pub mod arg_parser; pub fn parse(source: &str, parsers: &[Box]) -> Result, Error> { let root = sexp::parse(source)?; let subs: Vec = parse_routines(expect_list(Some(root), true)?, parsers)?; let mut combined = vec![]; let label_num = AtomicU32::new(0); for sub in subs { combined.extend(sub.flatten(&label_num)?); } Ok(combined) }