deimos-lang/src/parser/mod.rs
2025-09-14 08:28:06 -05:00

51 lines
1.3 KiB
Rust

use pest_derive::Parser;
#[derive(Parser)]
#[grammar = "parser/deimos.pest"]
pub struct DeimosParser;
#[cfg(test)]
mod deimos_parser_tests {
use crate::parser::{DeimosParser, Rule};
use pest::Parser;
macro_rules! fail_rule {
($pair: expr; $rule:path) => {{
panic!(
"Expected {} but found {:?}",
stringify!($rule),
$pair.as_rule()
)
}};
}
macro_rules! match_rule {
($pair:expr; $rule:path) => {{
if $rule != $pair.as_rule() {
fail_rule!($pair; $rule);
}
}};
}
fn parses_to(rule: Rule, input: &str) {
let parse_result = DeimosParser::parse(rule, input);
if let Err(e) = parse_result {
panic!("Parsing failed.\n{}", e);
} else {
let mut pairs = parse_result.unwrap();
if input.trim() != pairs.as_str().trim() {
panic!(
"Parsing did not consume entire input. Consumed only:\n{}",
pairs.as_str()
);
}
let first = pairs.next().unwrap();
match_rule!(first; rule)
}
}
mod generated_tests {
include!(concat!(env!("OUT_DIR"), "/src/parser/tests/test_suites.rs"));
}
}