<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
Step1:  Übungsblatt 4
Präsenzaufgaben
Aufgabe 1 &nbsp;&nbsp;&nbsp; Eine erste (Phrasenstruktur-)Grammatik
Werfen Sie einen Blick auf die folgende sehr einfache kontextfreie Grammatik und erklären Sie deren Funktionsweise.
Step2:  Sammeln Sie Sätze, die als grammatisch erkannt werden sollten, am besten in einer Liste.
Step3:  Die folgende Funktion kann Ihnen helfen, eine Reihe von Sätzen zu analysieren.
Je nach Ihrem Geschmack können Sie Zeile 14 ggf. anpassen.
Step4:  Führen Sie den Test jetzt für grammar1 aus!
Step6:  Aufgabe 2 &nbsp;&nbsp;&nbsp; Ein- und zweistellige Verben
Bis jetzt akzeptiert die Grammatik in grammar1 lediglich dreistellige Verben. Erweitern Sie sie so, dass auch Verben mit weniger als zwei Objekten korrekte Verbalphrasen bilden können.
Folgende Sätze sollten akzeptiert werden
Step8:  Aufgabe 3 &nbsp;&nbsp;&nbsp; Beliebig lange Phrasen
Erweitern Sie die Grammatik nun derart, dass Nominalphrasen auch Adjektive enthalten dürfen – und zwar beliebig viele.
Beispiele
Step9:  Hausaufgaben
Aufgabe 4 &nbsp;&nbsp;&nbsp; Eigennamen
Eigennamen können auch ohne Artikel eine Nominalphrase bilden. Erweitern Sie die Grammatik entsprechend.
Folgende Sätze sollten korrekt analysiert werden
Step11:  Stellen Sie außerdem sicher, dass folgende Sätze KEINE Analyse liefern!
Step12:  Aufgabe 5 &nbsp;&nbsp;&nbsp; Präpositionalphrasen
Erweitern Sie die Grammatik nun derart, dass sowohl Nominalphrasen als auch Verbalphrasen durch Präpositionalphrasen modifiziert werden können. Erkennen Sie die Ambiguität von Übungsblatt 1 wieder?
Folgende Sätze sollten akzeptiert werden
Step14:  Beachten Sie, dass die Form des Artikels dem und das Nomen Tisch auch noch als lexikalische Regeln ergänzt werden müssen.
<ASSISTANT_TASK:>
Python Code:
grammar1 = 
    S -> NP VP
    NP -> DET N
    DET -> "der" | "die" | "das"
    N -> "Mann" | "Frau" | "Buch"
    VP -> V NP NP
    V -> "gibt" | "schenkt"
Explanation: Übungsblatt 4
Präsenzaufgaben
Aufgabe 1 &nbsp;&nbsp;&nbsp; Eine erste (Phrasenstruktur-)Grammatik
Werfen Sie einen Blick auf die folgende sehr einfache kontextfreie Grammatik und erklären Sie deren Funktionsweise.
End of explanation
test_sentences = [
    "der Mann gibt der Frau das Buch"
]
Explanation: Sammeln Sie Sätze, die als grammatisch erkannt werden sollten, am besten in einer Liste.
End of explanation
import nltk
from IPython.display import display
import sys
def test_grammar(grammar, sentences):
    cfg = nltk.CFG.fromstring(grammar)
    rd_parser = nltk.RecursiveDescentParser(cfg)
    
    for i, sent in enumerate(sentences, 1):
        print("Satz {}: {}".format(i, sent))
        results = rd_parser.parse(sent.split())
        analyzed = False
        for tree in results:
            tree.pretty_print(unicodelines=True)  # tree.draw() oder display(tree)
            analyzed = True
        if not analyzed:
            print("Keine Analyse möglich", file=sys.stderr)
Explanation: Die folgende Funktion kann Ihnen helfen, eine Reihe von Sätzen zu analysieren.
Je nach Ihrem Geschmack können Sie Zeile 14 ggf. anpassen.
End of explanation
test_grammar(grammar1, test_sentences)
Explanation: Führen Sie den Test jetzt für grammar1 aus!
End of explanation
test_sentences.extend([
    "der Mann schläft",
    "das Buch gefällt der Frau",
    "die Frau kennt das Buch"
])
grammar2 = 
    S -> NP VP
    NP -> DET N
    DET -> "der" | "die" | "das"
    N -> "Mann" | "Frau" | "Buch"
    VP -> V NP NP
    V -> "gibt" | "schenkt"
test_grammar(grammar2, test_sentences)
Explanation: Aufgabe 2 &nbsp;&nbsp;&nbsp; Ein- und zweistellige Verben
Bis jetzt akzeptiert die Grammatik in grammar1 lediglich dreistellige Verben. Erweitern Sie sie so, dass auch Verben mit weniger als zwei Objekten korrekte Verbalphrasen bilden können.
Folgende Sätze sollten akzeptiert werden:
End of explanation
test_sentences.extend([
    "die kluge schöne Frau kennt das Buch",
    "der schöne kluge Mann gibt der Frau das dicke Buch",
    "das dicke schöne kluge Buch schläft"
])
grammar3 = 
    S -> NP VP
    NP -> DET N
    DET -> "der" | "die" | "das"
    N -> "Mann" | "Frau" | "Buch"
    VP -> V NP NP
    V -> "gibt" | "schenkt"
test_grammar(grammar3, test_sentences)
Explanation: Aufgabe 3 &nbsp;&nbsp;&nbsp; Beliebig lange Phrasen
Erweitern Sie die Grammatik nun derart, dass Nominalphrasen auch Adjektive enthalten dürfen – und zwar beliebig viele.
Beispiele:
End of explanation
test_sentences.extend([
    "der Mann kennt Chomsky",
    "Marie gibt Fritz das Buch"
])
Explanation: Hausaufgaben
Aufgabe 4 &nbsp;&nbsp;&nbsp; Eigennamen
Eigennamen können auch ohne Artikel eine Nominalphrase bilden. Erweitern Sie die Grammatik entsprechend.
Folgende Sätze sollten korrekt analysiert werden:
End of explanation
negative_examples = [
    "Mann gibt Frau Buch",
    "Mann schläft"
]
grammar4 = 
    S -> NP VP
    NP -> DET N
    DET -> "der" | "die" | "das"
    N -> "Mann" | "Frau" | "Buch"
    VP -> V NP NP
    V -> "gibt" | "schenkt"
test_grammar(grammar4, test_sentences)
Explanation: Stellen Sie außerdem sicher, dass folgende Sätze KEINE Analyse liefern!
End of explanation
test_sentences.extend([
    "der Mann schläft neben dem Buch",
    "die Frau kennt das dicke Buch über Chomsky",
    "die Frau schenkt dem Mann das Buch auf dem Tisch"
])
Explanation: Aufgabe 5 &nbsp;&nbsp;&nbsp; Präpositionalphrasen
Erweitern Sie die Grammatik nun derart, dass sowohl Nominalphrasen als auch Verbalphrasen durch Präpositionalphrasen modifiziert werden können. Erkennen Sie die Ambiguität von Übungsblatt 1 wieder?
Folgende Sätze sollten akzeptiert werden:
End of explanation
grammar5 = 
    S -> NP VP
    NP -> DET N
    DET -> "der" | "die" | "das"
    N -> "Mann" | "Frau" | "Buch"
    VP -> V NP NP
    V -> "gibt" | "schenkt"
test_grammar(grammar5, test_sentences)
Explanation: Beachten Sie, dass die Form des Artikels dem und das Nomen Tisch auch noch als lexikalische Regeln ergänzt werden müssen.
End of explanation
<END_TASK>