PCD
PCD
class RecursiveDescentParser:
def __init__(self, input_expr):
self.input = input_expr
self.pos = 0 # Position tracker in input string
def E(self):
"""Handles the Expression rule: E → T E'"""
self.T()
self.EDash()
def EDash(self):
"""Handles the Expression Dash rule: E' → + T E' | ε"""
if self.pos < len(self.input) and self.input[self.pos] == '+':
self.match('+')
self.T()
self.EDash()
def T(self):
"""Handles the Term rule: T → F T'"""
self.F()
self.TDash()
def TDash(self):
"""Handles the Term Dash rule: T' → * F T' | ε"""
if self.pos < len(self.input) and self.input[self.pos] == '*':
self.match('*')
self.F()
self.TDash()
def F(self):
"""Handles the Factor rule: F → (E) | id"""
if self.pos < len(self.input) and self.input[self.pos] == '(':
self.match('(')
self.E()
self.match(')')
elif self.pos < len(self.input) and self.input[self.pos].isalnum():
self.match(self.input[self.pos]) # Match identifier (e.g., 'a', 'b')
else:
self.error()
def error(self):
"""Prints an error message and exits."""
print(f"Parsing Error at position {self.pos}!")
sys.exit(1)
def parse(self):
"""Initiates parsing and checks if input ends correctly with '$'."""
self.E()
if self.pos < len(self.input) and self.input[self.pos] == '$':
print("Parsing successful!")
else:
self.error()
if __name__ == "__main__":
expr = input("Enter an expression: ")
parser = RecursiveDescentParser(expr)
parser.parse()
output
Parsing successful!