Rekursiver Abstieg
Id: recdesc.tex,v 1.2 2003/12/03 11:51:10 joe Exp
Einfachste Methode, einen Parser von Hand zu schreiben:
zu jeder Variablen eine Prozedur, die ein Wort aus liest (d. h. den entsprechenden Teil der Eingabe verbraucht) und den Syntaxbaum zurückgibt
parse_Anweisung = case lookahead () of "while" -> parse_Ausdruck ; parse_Block "if" -> parse_Ausdruck ; parse_Block default -> parse_Zuweisung parse_Zuweisung = n <- parse_Name ; parse "=" x <- parse_Ausdruck ; parse ";" parse_Block = parse "{" ; parse_Folge ; parse "}" parse_Folge = leer oder parse_Anweisung ; parse_Folge
Rekursiver Abstieg/gnat/Übung
benutzt (z. B.) in gnat
(Gnu Ada Translator, Teil von gcc
),
http://www.gnat.com, ftp://cs.nyu.edu/pub/gnat
Aufgaben:
Rekursiver Abstieg (III)
Vorteile:
Nachteile/Einschränkungen:
Links-Faktorisierung
Id: linksfakt.tex,v 1.1 2003/12/03 12:33:08 joe Exp
Durch Hilfsvariablen Entscheidungen verschieben, Beispiel if/then -- if/then/else
Links-Rekursion
Ausdruck = Name oder Literal oder Zeichen "(" ; Ausdruck ; Zeichen ")" oder Ausdruck Operator Ausdruck
Def: eine Variable in CFG heißt links-rekursiv, falls .
Aufgabe: Wie kann man entscheiden, ob gegebenes links-rekursiv ist?
Links-Rekursion (II)
Satz: Zu jeder CFG gibt es CFG ohne Links-Rekursion mit .
Beweis (Idee): ersetze durch .
Aufgaben (evtl. autotool): entferne Links-Rekursionen aus
Chomsky-Normalform
Id: chomskynf.tex,v 1.1 2003/12/03 12:33:08 joe Exp
Def: CFG ist in Chomsky-Normal-Form, falls .
Satz: Zu jeder CFG gibt es eine CFG in Chomsky-NF mit .
Beweis: benutze Hilfsvariablen.
Aufgabe: Wer ist Noam Chomsky? (google)
Greibach-Normalform
Id: greibachnf.tex,v 1.1 2003/12/03 12:33:08 joe Exp
Def: CFG ist in Greibach-Normal-Form, falls .
Satz: Zu jeder CFG gibt es eine CFG in Greibach-NF mit .
Beweis ist schwer. Aber einzelne Beispiele gehen (mühsam) von Hand.
Aufgabe: finde Greibach-Nf von: