use super::expr::{lex, Parser, Read};
#[derive(Debug, Default, PartialEq)]
pub(super) struct Micro {
pub(super) locals: Vec<String>,
pub(super) reads: Vec<Read>,
}
pub(super) fn parse_micro(text: &str, first_line: usize) -> Result<Micro, ()> {
let toks = lex(text, first_line)?;
let mut p = Parser::new(&toks, false);
let mut locals = Vec::new();
let mut first = true;
loop {
while p.eat_punct(";") || p.eat_punct(",") {}
if p.at_end() {
break;
}
if p.peek_ident("let") {
p.eat_ident();
locals.push(p.eat_ident().ok_or(())?);
if p.eat_punct("=") {
p.eat_ident().ok_or(())?;
}
} else if first {
p.pipe()?;
export_as(&mut p, &mut locals)?;
} else {
p.eat_ident().ok_or(())?;
if !export_as(&mut p, &mut locals)? {
p.eat_punct(":");
p.pipe()?;
export_as(&mut p, &mut locals)?;
}
}
first = false;
}
Ok(Micro {
locals,
reads: p.reads,
})
}
fn export_as(p: &mut Parser, locals: &mut Vec<String>) -> Result<bool, ()> {
if !p.peek_ident("as") {
return Ok(false);
}
p.eat_ident();
locals.push(p.eat_ident().ok_or(())?);
Ok(true)
}