use mpl::parser::Parser;
use mpl::span::StartAndLenSpan;
use mpl::trees::AST;
use mpl_macro::Parse;
#[derive(Parse, Debug)]
#[mplg = "tests/parentheses.mplg"]
pub struct ParenParser;
type ParenSpan = StartAndLenSpan<u32, u16>;
type ParenAst = AST<ParenVariable, ParenSpan, ()>;
type ParenParseResult = Result<ParenAst, ParenAst>;
enum ParseResult {
Ok,
Err,
}
const INPUTS: [(&str, ParseResult); 8] = [
("", ParseResult::Ok),
("()", ParseResult::Ok),
("()(())", ParseResult::Ok),
("(()(()))", ParseResult::Ok),
("(", ParseResult::Err),
(")", ParseResult::Err),
("()())", ParseResult::Err),
("(()(())))", ParseResult::Err),
];
#[test]
fn derive_grammar_from_file() {
let parser = ParenParser;
for input in INPUTS {
let input_data = input.0.as_bytes();
let parse_result = input.1;
let all_of_the_span =
StartAndLenSpan::<u32, u16>::from_start_len(0, input_data.len() as u16);
let result: ParenParseResult = parser.parse(
input_data,
&ParenRules,
&ParenVariable::Open,
&all_of_the_span,
);
match parse_result {
ParseResult::Ok => assert!(result.is_ok()),
ParseResult::Err => assert!(result.is_err()),
}
}
}