use crate::asm::error::CrsnError; use crate::asm::instr::Op; use crate::asm::parse::arg_parser::ArgParser; use crate::builtin::parse::BuiltinOps; use crate::module::{CrsnExtension, ParseOpRes}; pub fn parse_op(keyword: &str, mut arg_tokens: ArgParser, parsers: &[Box]) -> Result { // Include built-in instructions let builtins = [BuiltinOps::new()]; for p in builtins.iter().chain(parsers) { arg_tokens = match p.parse_op(keyword, arg_tokens) { Ok(ParseOpRes::Parsed(op)) => return Ok(op), Ok(ParseOpRes::Unknown(to_reuse)) => { if to_reuse.parsing_started() { panic!("Module \"{}\" started parsing {}, but returned Unknown!", p.name(), keyword); } to_reuse } Err(err) => { return Err(err); } } } return Err(CrsnError::Parse(format!("Unknown instruction: {}", keyword).into())); }