pub mod ast;
mod parser;
pub mod tokens;
pub use parser::{ParseContext, ParseError, ParseErrors, parsers};
pub trait Parse: Sized {
fn parse(context: &ParseContext) -> Result<Self, ParseErrors>;
}
impl Parse for ast::Source {
fn parse(context: &ParseContext) -> Result<Self, ParseErrors> {
match context {
ParseContext::Element(_) => panic!("Expected parse source context"),
ParseContext::Source {
url,
line_offset,
code,
..
} => {
let ast = crate::parse(code.value())?;
let src_ref = context.src_ref(&ast.span);
Ok(Self {
url: url.clone(),
ast: microcad_lang_base::Refer::new(ast, src_ref),
line_offset: *line_offset,
code: code.clone().map(|s| s.to_string()),
})
}
}
}
}
pub fn parse(source: &str) -> Result<ast::Program, ParseErrors> {
parser::parse(&tokens::lex(source).collect::<Vec<_>>())
}