/
test_grammar.py
119 lines (98 loc) · 3.53 KB
/
test_grammar.py
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import unittest
from grammar import Grammar
from grammar import Production
class TestGrammar(unittest.TestCase):
def test_text_to_grammar(self):
s = "S -> a"
g = Grammar.text_to_grammar(s)
self.assertEqual(g._productions, {Production('S','a')})
s = "S -> b S | a"
g = Grammar.text_to_grammar(s)
self.assertEqual(g._productions, {Production('S','a'), Production('S',['b','S'])})
s = "S1 -> b S1 a | a"
g = Grammar.text_to_grammar(s)
self.assertEqual(g._productions, {Production('S1','a'), Production('S1',['b','S1','a'])})
s = "C -> if E then C C' | comando\n"
s +="C' -> else C | &\n"
s +="E -> exp"
g = Grammar.text_to_grammar(s)
self.assertEqual(g._productions, {Production("C","if E then C C'"), Production("C","comando"),\
Production("C'","else C"), Production("C'","&"), Production("E","exp")})
def test_first(self):
s = "S -> a"
g = Grammar.text_to_grammar(s)
self.assertEqual(g._first('S'),{'a'})
self.assertEqual(g._first('a'),{'a'})
self.assertEqual(g._first('a b S c S t e'),{'a'})
s = "S -> b S | a"
g = Grammar.text_to_grammar(s)
self.assertEqual(g._first('S'),{'a','b'})
s = "S1 -> b S1 a | a"
g = Grammar.text_to_grammar(s)
self.assertEqual(g._first("S1"),{'a','b'})
s = "C -> if E then C C' | comando\n"
s +="C' -> else C | &\n"
s +="E -> exp"
g = Grammar.text_to_grammar(s)
self.assertEqual(g._first("C"),{'if','comando'})
self.assertEqual(g._first("C'"),{'else','&'})
self.assertEqual(g._first("E"),{'exp'})
self.assertEqual(g._first("E C"),{'exp'})
self.assertEqual(g._first("C' E"),{'else','exp'})
s = "S -> A b | A B c\n"
s +="B -> b B | A d | &\n"
s +="A -> a A | &"
g = Grammar.text_to_grammar(s)
self.assertEqual(g._first("S"),{'a','b','c','d'})
self.assertEqual(g._first("B"),{'a','b','d','&'})
self.assertEqual(g._first("A"),{'a','&'})
s = "S -> A B C\n"
s +="A -> a A | &\n"
s +="B -> b B | A C d\n"
s +="C -> c C | &"
g = Grammar.text_to_grammar(s)
self.assertEqual(g._first("S"),{'a','b','c','d'})
self.assertEqual(g._first("B"),{'b','a','c','d'})
self.assertEqual(g._first("A"),{'a','&'})
self.assertEqual(g._first("C"),{'c','&'})
def test_follow(self):
s = "S -> a"
g = Grammar.text_to_grammar(s)
self.assertEqual(g._follow('S'),{'$'})
s = "S -> b S | a"
g = Grammar.text_to_grammar(s)
self.assertEqual(g._follow('S'),{'$'})
s = "S1 -> b S1 a | a"
g = Grammar.text_to_grammar(s)
self.assertEqual(g._follow("S1"),{'$','a'})
s = "C -> if E then C C' | comando\n"
s +="C' -> else C | &\n"
s +="E -> exp"
g = Grammar.text_to_grammar(s)
self.assertEqual(g._follow("C"),{'$','else'})
self.assertEqual(g._follow("C'"),{'$','else'})
self.assertEqual(g._follow("E"),{'then'})
s = "S -> A b | A B c\n"
s +="B -> b B | A d | &\n"
s +="A -> a A | &"
g = Grammar.text_to_grammar(s)
self.assertEqual(g._follow("S"),{'$'})
self.assertEqual(g._follow("B"),{'c'})
self.assertEqual(g._follow("A"),{'a','b','c','d'})
s = "S -> A B C\n"
s +="A -> a A | &\n"
s +="B -> b B | A C d\n"
s +="C -> c C | &"
g = Grammar.text_to_grammar(s)
self.assertEqual(g._follow("S"),{'$'})
self.assertEqual(g._follow("B"),{'c','$'})
self.assertEqual(g._follow("A"),{'a','b','c','d'})
self.assertEqual(g._follow("C"),{'d','$'})
def test_have_left_recursion(self):
s = "A -> F C a | E A\nB -> C G h\nC -> D B a | b h | c | epsilon\nD -> F e | epsilon\nE -> G h | D f\nF -> E A | d F | epsilon\nG -> g"
g = Grammar.text_to_grammar(s)
pass
def test_is_left_factored(self):
pass
def test_have_first_follow_conflict(self):
pass