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.
32 lines
669 B
32 lines
669 B
5 years ago
|
|
||
|
use crate::instr::{Routine, Op, Flatten};
|
||
|
use crate::error::Error;
|
||
|
|
||
|
|
||
|
use std::sync::atomic::AtomicU32;
|
||
|
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;
|
||
|
|
||
|
use parse_routines::parse_routines;
|
||
|
pub use parse_instr::parse_instructions;
|
||
|
|
||
|
pub fn parse(source: &str) -> Result<Vec<Op>, Error> {
|
||
|
let root = sexp::parse(source)?;
|
||
|
|
||
|
let subs: Vec<Routine> = 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)
|
||
|
}
|