-
Notifications
You must be signed in to change notification settings - Fork 0
/
grammar.grs
64 lines (52 loc) · 1.14 KB
/
grammar.grs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#![allow(non_snake_case)]
use crate::tree::Tree;
fn parens_tree(name: &str, sub: Tree) -> Tree
{
let l_par = Tree::singleton("(");
let r_par = Tree::singleton(")");
Tree::new(name, vec![l_par, sub, r_par])
}
grammar
sym Regex: Tree
{
ne:NonEmpty => { Tree::new("Regex", vec![ne]) },
Eps => { Tree::new("Regex", vec![Tree::singleton("eps")]) }
}
NonEmpty: Tree
{
lhs:NonEmpty Or rhs:Concat => {
Tree::new("NonEmpty", vec![
lhs,
Tree::singleton("|"),
Tree::new("Concat", rhs)
])
},
cc:Concat => { Tree::new("NonEmpty", cc) }
}
Concat: Vec<Tree>
{
cc:Concat next:Kleene => {
let mut cc = cc;
cc.push(next);
cc
},
sub:Kleene => { vec![sub] }
}
Kleene: Tree
{
sub:SubConcat Star => { Tree::new("Kleene", vec![sub, Tree::singleton("*")]) },
sub:SubConcat => { Tree::new("Kleene", vec![sub]) }
}
SubConcat: Tree
{
ch:char => { Tree::singleton(&ch) },
lPar sub:NonEmpty rPar => { parens_tree("SubConcat", sub) }
}
grammar_end
lexer
tok char = { [a-z], [0-9] };
tok lPar = "(";
tok rPar = ")";
tok Or = "|";
tok Star = "*";
lexer_end