next up previous
Nächste Seite: Keller-Automaten Aufwärts: Syntakt. Analyse (4. 12.) Vorherige Seite: Programmier-Übung (5. 12.)

Operator-Präzedenz-Parser

Operator-Präzedenz-Parser

$ $Id: op.tex,v 1.3 2003/12/08 14:26:47 joe Exp $ $

Ausdruck -> Literal | ( Ausdruck ) 
   | Ausdruck + Ausdruck
   | Ausdruck * Ausdruck | ...

Eingabe: $ A_1 o_1 A_2 o_2 A_3 o_3 A_4$

können nicht sofort ausrechnen, Benutzen Keller für Zwischenresultate.

Entscheide zw. Push (warten) und Pop (rechnen) anhand der Präzedenz der Operatoren (müssen mit gekellert werden).

Operator-Grammatiken

Def: eine CFG heißt Operator-Grammatik, falls für jede Regel $ (l \to r) \in R$ gilt:

Wir benutzen Prioritäts-Relationen $ <$ auf Terminalen.

Für Wort $ c w \$ $ (mit Links- und Rechtsmarkierung):

Füge Relationen zwischen Terminalen ein (üebrspringe dabei Variablen): z. B. $ c < a_1 < a_2 > \ldots a_n > \$ $

Suche am weitesten links stehendes $ >$, dann das nächste davon links stehende $ <$, wende Regel auf Teilwort $ < \ldots >$ an.

Implementierung mit Stack

Konstruiere Ableitungsbaum zu geg. Operator-Grammatik mit Präzedenz

Interface Stack: push(), pop(), top, Interface Eingabe (Scanner): next()

push ('c'); -- linke Rand-Markierung
Token n = next ();
while (('c' != top) || ('$' != n)) {
  if ( top < n ) {
    push (n); n = next ();
  } else {
    while ( top > n ) { pop (); }
  }
}

Bemerkungen

stark vereinfacht. Es fehlen:

Aufgaben (Praktikum):

Übung (10./12. 12. 03) Op-Präzedenz-Parser

$ $Id: bastelop.tex,v 1.1 2003/12/10 10:13:39 joe Exp $ $

Dateien hier: http://www.imn.htwk-leipzig.de/~waldmann/ws03/compilerbau/programme/parser/

kompilieren mit: gmake, erzeugt Echse: operator

ausführen: echo "1 + 2 * 3 + 4" | ./operator


next up previous
Nächste Seite: Keller-Automaten Aufwärts: Syntakt. Analyse (4. 12.) Vorherige Seite: Programmier-Übung (5. 12.)
Johannes Waldmann 2004-01-28