51 lines
1.3 KiB
Rust
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"));
|
|
}
|
|
}
|