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.