Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Parser - Verfahren: Rekursiver Abstieg

Ähnliche Präsentationen


Präsentation zum Thema: "Parser - Verfahren: Rekursiver Abstieg"—  Präsentation transkript:

1 Parser - Verfahren: Rekursiver Abstieg
Richard Göbel

2 Inhalt Konstruktion eines Parsers aus der BNF Scanner

3 Beispiel Grammatik <tasks> ::= ´(´ <activity> {, <activity>} ´)´ <activity> ::= <name>: ( (<duration> <resources> ) | <tasks> ) <resources> ::= '[' <name> {, <name> } ']' <name> ::= <letter> { <letter> | <digit> | <special> } <duration> ::= <digit> { <digit> } <letter> ::= a | b | | z | A | B | | Z <digit> ::= 0 | 1 | 2 | | 9 <special> ::= _ | . | /

4 Backus-Naur-Form - Beispiel Text
(Datenbanksysteme_1: (Vorlesung_1: (Vorbereitung: 70 [Goebel], Durchfuehrung: 90 [Goebel], Nachbereitung: 40 [Goebel]), Vorlesung_2: Vorlesung_3: Nachbereitung: 40 [Goebel])), Symbolische_Verfahren_1: . . .

5 Backus-Naur-Form – Ansatz für die Abbildung
Erzeuge für jedes Nichtterminalsymbol eine Funktion Bilde die Regel eines Nichtterminalsymbols auf den Rumpf der Funktion ab. Erzeuge aus den BNF-Symbolen entsprechende Kontrollstrukturen.

6 Backus-Naur-Form – Beispiel für die Abbildung
parseTasks() ( Vorlesung_1: (Vorbereitung: 70 [ Goebel ], Durchfuehrung: 90 [ Goebel ], Nachbereitung: 40 [ Goebel ] ) parseActivity() parseTasks() parseName() parseDuration() parseName() parseRessources() parseActivity()

7 Backus-Naur-Form - Abbildung von Alternativen
v1 | v2 | | vn if ( ) { /* hier v1 einlesen */ } . . . else if ( ) /* hier vn einlesen*/ else /* Fehler */

8 Backus-Naur-Form - Abbildung von Optionen
[w] if (. . . ) { /* hier w einlesen */ }

9 Backus-Naur-Form - Abbildung von Wiederholungen
while ( ) { /* hier w einlesen */ }

10 Backus-Naur-Form - Steuerung der Kontrollstrukturen
Bedingung überprüft das nächste Zeichen in der Eingabe Das nächste Zeichen sollte immer bereits zur Verfügung stehen: am Anfang einer Funktion am Anfang einer Kontrollstruktur Für diesen Ansatz muss die Grammatik eindeutig sein

11 Backus-Naur-Form - Eindeutigkeit
Alle Alternativen müssen mit unterschiedlichen Terminalsymbolen beginnen. Bei einer Option oder einer Wiederholung muss der geklammerte Ausdruck v mit anderen Terminalsymbolen beginnen als der folgende Ausdruck w Optionen oder Wiederholungen am Ende einer Regel: Alle Regeln mit dem zugehörigen Nichtterminalsymbol untersuchen Die Zeichenkette nach dem Nichtterminal muss mit einem anderen Terminalsymbol als die Zeichenkette aus der Option oder der Wiederholung beginnen.

12 Backus-Naur-Form - Beispiel: Mehrdeutige Grammatik
<date> ::= [ [ <day> ] <month> ] <year> <day> ::= <digit> <digit> . <month> ::= <digit> <digit> . <year> ::= <digit> <digit> <digit> <digit>  Mehrdeutigkeiten lassen sich durch zusätzlich Terminalsymbole beseitigen.

13 Parser- Tokenizer Aufgabe des Tokenizer : liest Sequenzen von Zeichen (z.B. Namen, Zeichenketten) als Symbole ein Überspringt beliebige Sequenzen von White Space Character (z.B. Leerzeichen, Tabs) als Trennsymbole überspringt Kommentare . . .

14 Aufgabe eines Tokenizer
Lesen eines Token: Zahl Zeichenkette als Name Sonderzeichen Überspringen von so genannten White Space Character (Leerzeichen, Tabulator, Zeilenendezeichen, . . .) Überspringen von Kommentaren Andere Bezeichnungen: Scanner, lexikographische Analyse, . . .

15 Lesen einer Zeichenkette mit einem Tokenizer
(Vorlesung_1: // Dies ist ein Kommentar (Vorbereitung: 70 [Goebel], Durchfuehrung: 90 [Goebel], Nachbereitung: 40 [Goebel]) Token (Symbol) Typ ( Sonderzeichen Vorlesung_1 Zeichenkette : Sonderzeichen Vorbereitung Zeichenkette 70 Zahl [ Sonderzeichen Goebel Zeichenkette

16 Grammatik für einen Tokenizer - Beispiel: Activities
<tasks> ::= ´(´ <activity> {, <activity>} ´)´ <activity> ::= <name>: ( <duration> <resources> ) | <tasks> <resources> ::= '[' <name> {, <name> } ']' <name> ::= <zeichenkette> <duration> ::= <zahl>

17 Stream Tokenizer in Java - Lesen von Token
tok = new StreamTokenizer(new FileReader(filename)); tok.nextToken(); if (tok.ttype == StreamTokenizer.TT_WORD) { . . . tok.sval } // tok.sval: String else if (tok.ttype == StreamTokenizer.TT_NUMBER) { . . . tok.nval } // tok.nval: double else if (tok.ttype == '[') { . . . } else if (tok.ttype == StreamTokenizer. TT_EOF) {

18 Stream Tokenizer in Java - Konfiguration
tok.resetSyntax(); tok.slashSlashComments(true); tok.slashStarComments(true); tok.wordChars('a','z'); tok.wordChars('A','Z'); tok.wordChars('0','9'); tok.wordChars('_','_'); . . . tok.whitespaceChars(' ',' '); tok.whitespaceChars('\n', '\n'); tok.parseNumbers();

19 Stream Tokenizer in Java - Weitere Möglichkeiten
lineno() liefert die aktuelle Zeilennummer commentChar(int c) ermöglicht ein eigenes Kommentarzeichen noch weitere Möglichkeiten: siehe Dokumentation


Herunterladen ppt "Parser - Verfahren: Rekursiver Abstieg"

Ähnliche Präsentationen


Google-Anzeigen