Exp 3

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 1

Experiment No.

03

Aim: Removal of left recursion.


Code:
eliminated_grammar = []
def remove_left_recursion(iGrammar):
for rule in iGrammar:
rule_splitted_by_arrow = rule.split("->")
rule_splitted_by_slash = rule_splitted_by_arrow[1].split("|")
rule_parts_with_left_recursion = []
rule_parts_without_left_recursion = []
k, l = 0, 0
for c in rule_splitted_by_slash:
if rule_splitted_by_arrow[0] == c[0]:
rule_parts_with_left_recursion.append(k)
else:
rule_parts_without_left_recursion.append(l)
k += 1
l += 1
if len(rule_parts_with_left_recursion) == 0:
eliminated_grammar.append(rule)
continue
oldRule = rule_splitted_by_arrow[0] + "->"
for i in rule_parts_without_left_recursion:
oldRule += rule_splitted_by_slash[i] +
rule_splitted_by_arrow[0] +
"'|"
eliminated_grammar.append(oldRule)
newRule = rule_splitted_by_arrow[0] + "'->"
for i in rule_parts_with_left_recursion:
newRule += (
rule_splitted_by_slash[i].lstrip(rule_splitted_by_arrow[0])
+ rule_splitted_by_arrow[0]
+ "'|"
)
newRule += "null"
eliminated_grammar.append(newRule)
n = int(input("Enter number of rules: "))
input_grammar = [input("Enter rule " + str(i + 1) + ": ") for i in range(n)]
remove_left_recursion(input_grammar)
print("\nGrammar without left recursion:")
for grammar in eliminated_grammar:
print(grammar)

Output:

You might also like