SPCC Prac Implementation
SPCC Prac Implementation
grammar = {
'S': ['AB'],
'A': ['aA', 'ε'],
'B': ['b']
}
def get_first(x):
if x not in grammar: return {x}
if x in first: return first[x]
res = set()
for prod in grammar[x]:
if prod == 'ε': res.add('ε')
else:
for ch in prod:
f = get_first(ch)
res |= f - {'ε'}
if 'ε' not in f: break
else: res.add('ε')
first[x] = res
return res
def get_follow():
for nt in grammar: follow.setdefault(nt, set())
changed = True
while changed:
changed = False
for A in grammar:
for prod in grammar[A]:
for i, B in enumerate(prod):
if B not in grammar: continue
beta = prod[i+1:]
temp = set()
for sym in beta:
f = get_first(sym)
temp |= f - {'ε'}
if 'ε' not in f: break
else: temp |= follow[A]
if not temp <= follow[B]:
follow[B] |= temp
changed = True
for nt in grammar:
print(f"FOLLOW({nt}) = {follow[nt]}")
CODE OPTIMISATION 1:
def algebraic_simplify(expr):
lhs, rhs = expr.split('=')
lhs = lhs.strip()
rhs = rhs.strip()
def eliminate_common_subexpr(code):
expr_map = {}
new_code = []
for line in code:
lhs, rhs = line.split('=')
lhs = lhs.strip()
rhs = rhs.strip()
if rhs in expr_map:
new_code.append(f"{lhs} = {expr_map[rhs]}")
else:
expr_map[rhs] = lhs
new_code.append(line)
return new_code
# Input code
code = [
"a = b + c",
"d = b + c",
"e = a + 0",
"f = d * 1",
"g = f * 0"
]
def is_identifier(token):
return token[0].isalpha() or token[0] == '_'
def lexical_analyzer(code):
tokens = []
word = ''
i=0
while i < len(code):
ch = code[i]
else:
word += ch
i += 1
if word:
tokens.append(word)
# Classify tokens
for token in tokens:
if token in keywords:
print(f"{token} -> Keyword")
elif token in symbols or token in ['==', '!=', '<=', '>=']:
print(f"{token} -> Symbol")
elif is_identifier(token):
print(f"{token} -> Identifier")
else:
print(f"{token} -> Unknown")