tiny_earley/
load.rs

1use crate::{Rule, Symbol};
2
3use super::Grammar;
4
5#[macro_export]
6macro_rules! grammar {
7    (
8        S = [$($name:pat),+]
9        R = {
10            $($lhs:ident ::= $($rhs:ident)+;)+
11        }
12    ) => {
13        {
14            let syms = [$(stringify!($name)),+];
15            let mut grammar = Grammar::new(syms, 0);
16            let [$($name),+] = grammar.symbols();
17            $(
18                grammar.rule(
19                    $lhs,
20                    [$($rhs),+]
21                );
22            )+
23            grammar
24        }
25    };
26}
27
28#[test]
29fn grammar() {
30    let grammar = grammar! {
31        S = [start, a, b, c, d]
32        R = {
33            start ::= a b c;
34            a ::= b c d;
35        }
36    };
37    let [start, a, b, c, d] = grammar.symbols();
38    assert_eq!(grammar.symbol_names, ["start", "a", "b", "c", "d"]);
39    assert_eq!(grammar.rules.into_iter().take(1).collect::<Vec<_>>(), vec![Rule { lhs: Symbol(5), rhs0: Symbol(1), rhs1: Some(Symbol(2)), id: None }]);
40}
41