use sexp::Sexp; use crate::asm::data::literal::RoutineName; use crate::asm::error::CrsnError; use crate::asm::instr::Routine; use crate::asm::parse::parse_instr::parse_instructions; use crate::asm::parse::sexp_expect::{expect_list, expect_string_atom}; use crate::asm::patches::TryRemove; use crate::module::CrsnExtension; pub fn parse_routines(routines: Vec, parsers: &[Box]) -> Result, CrsnError> { let mut parsed = vec![]; for rt in routines { let mut def = expect_list(Some(rt), false)?; let name = expect_string_atom(def.try_remove(0))?; let body = parse_instructions(def, parsers)?; parsed.push(Routine { name: RoutineName(name), body, }) } Ok(parsed) }