-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathfirst.py
86 lines (77 loc) · 2.57 KB
/
first.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
from input import rules, diction, firsts, follows, nonterm_userdef, term_userdef, sample_input_string
from leftRecursion import removeLeftRecursion
from leftFactoring import LeftFactoring
def first(rule):
if len(rule) != 0 and (rule is not None):
if rule[0] in term_userdef:
return rule[0]
elif rule[0] == '#':
return '#'
if len(rule) != 0:
if rule[0] in list(diction.keys()):
fres = []
rhs_rules = diction[rule[0]]
for itr in rhs_rules:
indivRes = first(itr)
if type(indivRes) is list:
for i in indivRes:
fres.append(i)
else:
fres.append(indivRes)
if '#' not in fres:
return fres
else:
newList = []
fres.remove('#')
if len(rule) > 1:
ansNew = first(rule[1:])
if ansNew != None:
if type(ansNew) is list:
newList = fres + ansNew
else:
newList = fres + [ansNew]
else:
newList = fres
return newList
fres.append('#')
return fres
def computeAllFirsts(diction):
for rule in rules:
k = rule.split("->")
k[0] = k[0].strip()
k[1] = k[1].strip()
rhs = k[1]
multirhs = rhs.split('|')
for i in range(len(multirhs)):
multirhs[i] = multirhs[i].strip()
multirhs[i] = multirhs[i].split()
diction[k[0]] = multirhs
print(f"\nRules: \n")
for y in diction:
print(f"{y}->{diction[y]}")
print(f"\nAfter elimination of left recursion:\n")
diction = removeLeftRecursion(diction)
for y in diction:
print(f"{y}->{diction[y]}")
print("\nAfter left factoring:\n")
diction = LeftFactoring(diction)
for y in diction:
print(f"{y}->{diction[y]}")
for y in list(diction.keys()):
t = set()
for sub in diction.get(y):
res = first(sub)
if res != None:
if type(res) is list:
for u in res:
t.add(u)
else:
t.add(res)
firsts[y] = t
print("\nCalculated firsts: ")
key_list = list(firsts.keys())
index = 0
for gg in firsts:
print(f"first({key_list[index]}) "
f"=> {firsts.get(gg)}")
index += 1