use glc::{grammar, Expression, Grammar};
fn build_grammar() -> Grammar {
grammar!{
S => A B;
B => A B N;
B => E;
E => "";
A => "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
"l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
"w", "x", "y", "z";
N => "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
}
}
#[test]
fn test() {
let grammar = build_grammar();
let mut strings = Vec::new();
for _ in 0..100 {
strings.push(grammar.gen());
}
for s in strings {
assert!(!s.is_empty());
assert!(s.chars().next().unwrap().is_ascii_alphabetic());
}
}
#[test]
fn test_derivation() {
let grammar = build_grammar();
let mut derivation = grammar.start_derivation();
while !derivation.is_done() {
derivation.derive_step(&grammar);
println!("{derivation}");
}
let expr: Expression = derivation.into();
dbg!(expr);
}