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