Grammatikregeln -- Backus-Naur-Form (BNF)

Werbung
Expression (arithmetische Ausdröcke)
Beispiel
$ CLASSPATH=. java Expression
2+3*4
14.0
Grammatikregeln -- Backus-Naur-Form (BNF)
Formal besteht eine Grammatik aus einer Menge von Eingabesymbolen, einer Menge von
Grammatikbegriffen, daraus einem Startbegriff, und einer Menge von Regeln, das heiût, bestimmten
Paaren von Folgen von Grammatikbegriffen und Eingabesymbolen; alle Mengen und Folgen
mössen endlich sein.
Typischerweise schreibt man nur die Regeln auf und verlangt bei kontextfreien Grammatiken, daû
die linke Seite einer Regel immer ein Grammatikbegriff sein muû. Nach Konvention steht der
Startbegriff auf der linken Seite der ersten Regel und man faût rechte Seiten zum gleichen
Grammatikbegriff als Alternativen zusammen. Die Wiederholungen der Syntaxgraphen muû man
durch rekursive Verweise modellieren. För arithmetische Ausdröcke sieht das etwa so aus:
sp.tiff )sum : product | sum '+' product | sum '-' product ;
891731_sp.tiff )product : term | product '*' term | product '/' term | product '%' term ;
892781_sp.tiff )term :€ '+' term | '-' term€ | '(' sum ')' | Number ;
trennt linke und rechte Seite, | trennt Alternativen, ; steht nach allen rechten Seiten zum gleichen
Grammatikbegriff. Eingabesymbole werden mit einfachen Anföhrungszeichen zitiert. Da Number nicht
links vorkommt, muû Number (implizit) eine Klasse von Eingabesymbolen reprÙsentieren. Man
kðnnte auch folgende Regeln hinzufögen:
:
893816_sp.tiff )Number : digit | Number digit ;
894794_sp.tiff )digit : '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' ;
In unserem Beispiel liefert das Scanner-Objekt als Objekt einer Unterklasse von
java.io.StreamTokenizer das Eingabesymbol Number als ein erkanntes Symbol, aber auch alle
anderen Zeichen wie +, -, usw. einzeln.
¶
Grammatikregeln -- Erweiterte Backus-Naur-Form (EBNF)
Syntaxgraphen korrespondieren wesentlich intuitiver zu Grammatikregeln, wenn man sich auf
Schreibweisen för Wiederholungen und relativ standardisierte Graphen einigt, zum Beispiel
alt : ( one | two ) ; 735435_paste.eps ¬
some : { body } ;
701800_paste.eps ¬
opt : [ body ] ;
many : [{ body }] ;
862105_paste.eps ¬
104554_paste.eps ¬
( )
|
{ }
zur Zusammenfassung
för Alternativen
einmal oder mehrfach
hðchstens einmal
kombiniert: beliebig oft
[ ]
EBNF ist als Schreibweise för Wiederholungen eine verkörzende Schreibweise för BNF. För die
meisten Menschen ist EBNF intuitiver als BNF. Die traditionelle Schreibweise för Wiederholungen in
EBNF hat Probleme bei 1-n Wiederholungen. Hier muû man Teile der Grammatik verdoppeln.
konventionelle Schreibweise:
{...}
0-n mal wiederholen
[...]
0 oder 1 mal erkennen
unsere Schreibweise:
{...}
1-n mal wiederholen
[...]
0 oder 1 mal erkennen
Analog zu den folgenden Syntaxgraphen sehen arithmetische Ausdröcke dann etwa so aus:
496460_sp.tiff )sum : product [{ ('+'|'-') product }];
497538_sp.tiff )product : term [{ ('*'|'/'|'%') term }];
498529_sp.tiff )term : [{'+'|'-'}] ( Number | '(' sum ')' ) ;
¶
Syntaxgraph
Die zu der EBNF-Grammatik der arithmetischen Ausdröcke
193647_sp.tiff )sum : product [{ ('+'|'-') product }];
289367_sp.tiff )product : term [{ ('*'|'/'|'%') term }];
389135_sp.tiff )term : [{'+'|'-'}] ( Number | '(' sum ')' ) ;
korrespondierenden Syntaxgraphen kennen Sie bereits (teilweise) aus der Vorlesung:
SyntaxGraphExpression.gif ¬
rekursiver Abstieg
Idee: Pro Graph wird eine Funktion implementiert, die diesen Teil der Grammatik erkennt. Die
Funktionen rufen sich gegenseitig (auch rekursiv) auf. Man steigt so in Richtung der BlÙtter (auch
rekursiv) in der Erkennung ab. Hat die Funktion einen Teil erkannt, föhrt sie entsprechende Aktionen
aus. Im Expression-Beispiel kðnnte das Ergebnis des Teilausdrucks sofort berechnet werden, oder
es wird wie in der Vorlesung ein Baum gebaut, der die erkannte Informationen reprÙsentiert. Wenn
alle Knoten und BlÙtter im Baum Unterklassen von java.lang.Number sind, kann der Wert des
arithmetischen Ausdrucks öber die Methoden der Number-Klasse in verschiedenen Typen berechnet
werden.
¶
BÙume för arithmetische Ausdröcke
Hier zwei Beispiel för BÙume, die einen arithm. Ausdruck speichern. Das Programm gibt nun auch
den Baum textuell aus.
 5-6*8:
819131_paste.eps ¬
$ pwd; make stdin
...../java99/Uebungen/Blatt6/AddOn/expr
CLASSPATH=.. java expr.Expression
5-6*8
tree:
BinarySub
5
BinaryMul
6
8
-43.0
9-+-9*-(-3*(3-2))
123046_paste.eps ¬
Expression kann (noch) nicht / und % als binÙre und + und - als unÙre Operatoren. Auch das
Klammern von Ausdröcken bleibt noch zu tun. Beides wird eine Aufgabe des neuen Aufgabenblatts
sein.
Herunterladen