-
Notifications
You must be signed in to change notification settings - Fork 15
/
DeYaccify.rsc
49 lines (46 loc) · 2.07 KB
/
DeYaccify.rsc
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
@contributor{Vadim Zaytsev - [email protected] - SWAT, CWI}
@wiki{deyaccifyAll}
module mutate::DeYaccify
import syntax::BGF;
// NB: the deyaccification mutation works on horizontal productions,
// while the deyaccification transformation works on vertical ones!!!
public BGFGrammar deyaccifyAll(BGFGrammar g)
= visit(g)
{
// N = N X | X => N = X+
case production(label, lhs, choice([sequence([nonterminal(n),x]),x]))
=> production(label, lhs, plus(x))
// N = X | N X => N = X+
case production(label, lhs, choice([x,sequence([nonterminal(n),x])]))
=> production(label, lhs, plus(x))
// N = X N | X => N = X+
case production(label, lhs, choice([sequence([x,nonterminal(n)]),x]))
=> production(label, lhs, plus(x))
// N = X | X N => N = X+
case production(label, lhs, choice([x,sequence([x,nonterminal(n)])]))
=> production(label, lhs, plus(x))
// N = X N | e => N = X*
case production(label, lhs, choice([sequence([x,nonterminal(n)]),epsilon()]))
=> production(label, lhs, star(x))
// N = e | X N => N = X*
case production(label, lhs, choice([epsilon(),sequence([x,nonterminal(n)])]))
=> production(label, lhs, star(x))
// N = N X | e => N = X*
case production(label, lhs, choice([sequence([nonterminal(n),x]),epsilon()]))
=> production(label, lhs, star(x))
// N = e | N X => N = X*
case production(label, lhs, choice([epsilon(),sequence([nonterminal(n),x])]))
=> production(label, lhs, star(x))
// N = N X | Y => N = Y X*
case production(label, lhs, choice([sequence([nonterminal(n),x]),y]))
=> production(label, lhs, sequence([y,star(x)]))
// N = Y | N X => N = Y X*
case production(label, lhs, choice([y,sequence([nonterminal(n),x])]))
=> production(label, lhs, sequence([y,star(x)]))
// N = X N | Y => N = X* Y
case production(label, lhs, choice([sequence([x,nonterminal(n)]),y]))
=> production(label, lhs, sequence([star(x),y]))
// N = Y | X N => N = X* Y
case production(label, lhs, choice([y,sequence([x,nonterminal(n)])]))
=> production(label, lhs, sequence([star(x),y]))
};