L(PDA) = {anbn | n>0}
class Stack: def __init__(self): self.stackliste = [] self.stacklistenlaenge = 0 def pop(self): if self.istLeer() == False: self.stacklistenlaenge = self.stacklistenlaenge - 1 return self.stackliste.pop() def peek(self): if self.istLeer() == False: return self.stackliste[self.stacklistenlaenge - 1] def push(self, inhalt): self.stackliste.append(inhalt) self.stacklistenlaenge = self.stacklistenlaenge + 1 def getStacklistenlaenge(self): return self.stacklistenlaenge def istLeer(self): if self.stacklistenlaenge <= 0: return True else: return False #--------------------------------------------------- def Zustandsuebergangsfunktion(symbol): global state if state == "q0": if symbol == "a": state = "q1" pdaStack.pop() pdaStack.push("Z") pdaStack.push("P") return True else: return False if state == "q1": if symbol == "a": pdaStack.pop() pdaStack.push("P") pdaStack.push("P") state = "q1" return True elif symbol == "b": pdaStack.pop() state = "q2" return True else: return False if state == "q2": if symbol == "b": if pdaStack.peek() == "P": state = "q2" pdaStack.pop() if pdaStack.peek() == "Z": state = "q3" return True else: return False if state == "q3": if pdaStack.peek() == "Z": pdaStack.pop() return True else: return False #--------------------------------------------------- def Akzeptor(wort): global state for i in range(len(wort)): testsymbol = wort[i] aktzustand = Zustandsuebergangsfunktion(testsymbol) print("Zustand: ", state, "\tAktueller Stack: ", pdaStack.stackliste) if aktzustand == False: return False if pdaStack.peek() == "Z" and state == "q3": return True else: return False #--------------------------------------------------- pdaStack = Stack() pdaStack.push("Z") state = "q0" print("Startzustand:", state, "\tLeerzustand Stack:", pdaStack.stackliste) ergebnis = Akzeptor("aaaaabbbbb") print("---------\nAkzeptiert?", ergebnis)