#!/usr/bin/env pythonimport sys# Erzeuge Liste von Regel Tupeln aus String v# z.B. v='S->aS' ergibt [('S', 'aS')]def getGramma(v): rls = []; for rule in v.split(','): rule = rule.strip(); (left, arrow, right) = rule.partition('->'); rls.append((left.strip(),right.strip())); return rls# Diese Funktion testet ob w in L(G) istdef wordproblem(G, w): # SForms ist die Liste der entwickelten Satzformen States = set() States.add('S') print States Steps = 0; n = len(w); print Steps # Die String Indices sind 0 basiert while (Steps <= (n - 1)): # Leite ab w[Steps] bezeichnet das Step-te Zeichen in w States = res(G, States, w[Steps]) print States # Erhoehe Zaehler der Ableitungsschritte S ist Schritt 0 Steps += 1; for State in States: if (State, w[Steps - 1]) in G: return True; return False# Diese Funktion generiert alle Ableitungen die die Regeln in G# erlauben und die dabei das aktuell Betrachtete Zeichen von# von w erzeugen.def res(G, States, Tw): NewStates = set(); for State in States: for (left, right) in G: if (left == State) and (right[0] == Tw): if (len(right) == 2): NewStates.add(right[1]); return NewStates;print getGramma(sys.argv[1])G = getGramma(sys.argv[1]);print wordproblem(G, sys.argv[2]);