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