|
|
|
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<dyn CrsnExtension>]) -> Result<Op, CrsnError> {
|
|
|
|
// 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()));
|
|
|
|
}
|