You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
20 lines
700 B
20 lines
700 B
use sexp::Sexp;
|
|
|
|
use crate::asm::error::Error;
|
|
use crate::asm::instr::{Cond, cond, Instr};
|
|
use crate::asm::instr::op::OpParser;
|
|
use crate::asm::parse::parse_instr::parse_instructions;
|
|
use crate::asm::parse::sexp_expect::{expect_list, expect_string_atom};
|
|
use crate::asm::patches::TryRemove;
|
|
|
|
pub fn parse_cond_branch(tok: Sexp, parsers: &[Box<dyn OpParser>]) -> Result<(Cond, Vec<Instr>), Error> {
|
|
let mut list = expect_list(Some(tok), false)?;
|
|
let kw = expect_string_atom(list.try_remove(0))?;
|
|
|
|
if !kw.ends_with('?') {
|
|
return Err(Error::Parse(format!("Condition must end with '?': {}", kw).into()));
|
|
}
|
|
|
|
Ok((cond::parse_cond(&kw)?, parse_instructions(list, parsers)?))
|
|
}
|
|
|
|
|