Programmiersprachenentwurf
|
|
|
- Lothar Pfaff
- vor 8 Jahren
- Abrufe
Transkript
1 Programmiersprachenentwurf 4. Übung Lösungen Syntaktische Analyse Material: Für diese Aufgabenserie benötigen Sie als Ausgangsmaterial die folgenden Übersetzer von der Kurs-Seite Modellcompiler expressionparser0 Analyse einfacher arithmetischer Ausdrücke PL0-Parser0 PL0-Parser (Basisversion) In den Übungsaufgaben entwickeln Sie daraus Parser, die Sprachen mit erweiterter oder modifizierter Syntax analysieren. Implementierung der Lösung: Den Programmcode mit der Implementierung der Syntaxerweiterungen können Sie hier downloaden. expressionparser1 Analyse einfacher arithmetischer Ausdrücke PL0-Parser1 PL0-Parser (Basisversion) Aufgabe 1 Analysieren Sie mit dem PL/0-Parser (Programm PL0-Parser0) das folgende PL/0-Programm. Verfolgen Sie dabei die Inhalte der Symboltabelle und die Aufruffolge der syntaktischen Prozeduren! const a=10, b=15 ; var min, max, mean ; begin min := a ; max := b ; mean := (a+b)/2 ; if a > b then begin min := b ; max := a ; end end. Die Aufruffolge wird vom Parser protokolliert, wenn man im Hauptprogramm den Aufruf P.setParserProtocol (on); aktiviert. Sie ist hier mit einem Editor nachbearbeitet: constdeclaration constdeclaration vardeclaration vardeclaration vardeclaration statement : statement : expression : term : factor statement : expression : term : factor statement : expression : term : factor : expression : term : factor : term : factor : factor statement : condition : expression : term : factor : expression : term : factor statement : statement : expression : term : factor statement : expression : term : factor statement
2 Die Symboltabelle erhält folgende Einträge: Symbol Table for block Main index name kind level addr size a constobj 10 2 b constobj 15 3 min varobj max varobj mean varobj Aufgabe 2 Erweitern Sie den Recursive Descent-Parser für arithmetische Ausdrücke expressionparser0 für arithmetische Ausdrücke zu einem Parser, der beliebige logische Ausdrücke mit den Operatoren and, or, xor, not analysiert. Beispiele für solche Ausdrücke: a; a and b; (a and b); a and (b or c); a and b or c and d; a and (b or c) and d. Die Syntax der logischen Ausdrücke ist wie folgt festgelegt: lexpr lterm or lterm xor lterm lterm lfact and lfact lfact condition ident ( lexpr ) not lfact Zeigen Sie, daß die Grammatik vom Typ LL(1) ist und implementieren Sie einen Recursive Descent-Parser dafür. Nur die dritte Produktionsregel enthält mehrere rechte Seiten, die mit den (verschiedenen Terminalzeichen condition, ident, ( sowie not beginnen und daher disjunkte FIRST-Mengen besitzen. Da die Grammatik keine ε -Produktionen enthält, ist die LL(1)-Bedingung E2 gar nicht relevant. Somit ist die Grammatik vom Typ LL(1). Die Syntaxgraphen der Grammatik sind: lexpr lterm or lterm lterm lfact xor lfact and 2
3 lfact condition not lfact ( lexpr ) Der Code, mit dem der Parser logische Ausdrücke dieser Form analysiert ist: void exprparser::lexpression (void) lterm(); while((sym==orsym) (sym == xorsym)) lterm(); void exprparser::lterm(void) lfactor(); while (sym==andsym) lfactor(); void exprparser::lfactor(void) switch (sym) case ident: case notsym: lfactor(); case lparen: lexpression (); if (sym == rparen) cout << "Symbol can t follow an lexpression!\n"; default: cout << "lfactor expected!" << endl; 3
4 Aufgabe 3 Erweitern Sie den Recursive Descent-Parser für Ausdrücke expressionparser0 für arithmetische Ausdrücke zu einem Parser, der Vergleiche (conditions) analysiert von der folgenden Form: a = b; x-17 < a+(b-c); alpha + beta # pi*2/(radius1-radius2); (x17 - x18) / 15 <= a*b+c. Zeigen Sie, daß die Grammatik vom Typ LL(1) ist und implementieren Sie einen Recursive Descent-Parser dafür. Die Syntaxdiagramme zu dieser Sparcherweiterung sind: condition odd expr # = expr < expr > expr + term + term term fact fact ident fact / number ( expr ) 4
5 Zur Überprüfung der LL(1)-Eigenschaften bestimmen wir zunächst die FIRST- und FOLLOW- Mengen der Nichtterminalen Zeichen: X N FIRST( X ) FOLLOW( X ) condition ( ident number + odd expr ( ident number + = > >= < <= ) term ( ident number = > >= < <= ) + fact ( ident number = > >= < <= ) + / Zum Nachweis der LL(1) - Eigenschaft von Γ sind die folgenden Bedingungen notwendig: 1. Das Diagramm für condition besitzt zwei Alternativen, dern FIRST-Mengen FIRST(odd) FIRST(expr) disjunkt sind. 2. Das Diagramm für expr besitzt drei Alternativen, daher müssen die folgenden FIRST-Mengen paarweise disjunkt sein: FIRST ( + TERM + TERM TERM ) FIRST ( TERM + TERM TERM ) FIRST ( TERM + TERM TERM ) 3. Das Diagramm für fact besitzt drei Alternativen, daher müssen die folgenden FIRST-Mengen paarweise disjunkt sein: FIRST ( ident ) FIRST ( number ) FIRST ( ( expr ) ) Wie man sieht sind diese Bedingungen alle erfüllt. Damit ist sichergestellt, daß mit Γ arithmetische Ausdrücke sackgassenfrei analysiert werden können. Der Code von expressionparser0 kann daher für die Analyse von conditions wie folgt erweitert werden: void exprparser::condition (void) if (sym == oddsym) expression(); if ( (sym == ident) (sym == number) (sym == lparen) (sym == plus ) (sym == minus ) ) expression(); if ( (sym == eql) (sym == neq) (sym == lss) (sym == leq) (sym == gtr) (sym == geq) ) expression(); 5
6 Aufgabe 4 Entwickeln Sie den Recursive Descent-Parser für arithmetische Ausdrücke expressionparser0 weiter zu zu einem Parser, der Listen analysiert von der folgenden Form: (); (a, b, c); (a, ((b,c), d)). Eine Grammatik zu dieser Sprache ist: N T P = = L ident,(, ) L ident ( L,L ) = Begründen Sie dazu zunächst, dass die Grammatik vom Typ LL(1) ist. Modifizieren Sie dann expressionparser0. Da die Grammatik nur eine Produktion ohne Alternativen enthält, muss keine der LL(1)- Bedingungen überprüft werden. Der Code von expressionparser0 kann daher für die Analyse dieser Listen wie folgt erweitert werden. void exprparser::l(void) switch (sym) case ident: case lparen: if (sym == rparen) L(); while (sym==comma) L(); if (sym == rparen) cout << "')' expected!!" << endl; 6
7 Aufgabe 5 Erweitern Sie die Basisversion des Parser PL0-Parser0 um die folgenden Syntaxerweiterungen: 5.1 Verhindern von Mehrfach-Deklarationen Der PL/0-Parser erkennt in der vorgebenen Form nicht, wenn innerhalb eines Blocks Namen mehrfach deklariert werden. Ändern Sie ihn so ab, daß Mehrfachdeklarationen innerhalb eines Blocks erkannt und als Fehler protokolliert werden. Wie werden Mehrfachdeklarationen auf verschiedenen Stufen einer Blockhierarchie dabei behandelt? Mehrfachdeklarationen auf verschiedenen Stufen einer Blockhierarchie werden wie in C und ähnlichen Sprachen behandelt nach den dort üblichen Gültigkeitsregeln. void pl0parser::block() int ppos; ppos = tx; int i; // symtable position above this block // save symtable position above this block // symtable index of new objects... while (sym == procsym) if (sym == ident) i = position(id); if (i<=ppos) // parse procedure declarations // get procedure name // if it is an identifier // if identifier is not yet // defined in this block enter(procobj); // put it into the symbol table // error(35); // multiple defined error(4); if (sym == semicolon) error(5); block(); if (sym == semicolon) error(5);... // check if ";" is present // parse the prodedure body // check if ";" is present void pl0parser::constdeclaration (int ppos) int i; if (sym == ident) // if the next symbol is a // constant identifier if (sym == eql) // check, if "=" is present if (sym == number) // check if const value is present i = position(id); // if identifier is not yet if (i<=ppos) // defined in this block enter(constobj); // put it into the symbol table // error(35); // error(2); error(3); error(4); 7
8 void pl0parser::vardeclaration (int ppos) int i; parserprotocol("vardeclaration"); // output parser protocol if (sym == ident) // if next symbol is a variable i = position(id); // if identifier is not yet if (i<=ppos) // defined in this block enter(varobj); // put it into the symbol table error(35); error(4); 5.2 Exponentiation als zusätzliche arithmetische Operation Erweitern Sie den Parser für PL/0 so, daß er die Exponentiation als arithmetische Operation mit der höchsten Priorität zuläßt: Welche Erweiterungen sind an den Syntaxgraphen vorzunehmen? Ist die erweiterte Grammatik immer noch vom Typ LL(1)? Erweitern Sie den Programmcode des Parser! Die Teilgrammatik von PL0 für arithmetische Ausdrücke ist zu erweitern wie folgt: expr + term + term term fact fact / fact sfact sfact ^ sfact ident number ( expr ) 8
9 Zum Nachweis. dass die erweiterte Grammatik immer noch vom Typ LL(1) ist, bestimmen wir zunächst die First- und Follow-Mengen der Nonterminals: X FIRST(X) FOLLOW (X) expr ( ident number + ). ; = # < <= > >= then do end term ( ident number ). ; = # < <= > >= then do end + fact ( ident number ). ; = # < <= > >= then do end + / sfact ( ident number ). ; = # < <= > >= then do end + / ^ Bezuüglich der LL(1)-Eigenschaft E1 fallen gegenüber früher für die Produktionen expr..., term... die selben Prüfungen an, da die zu prüfenden Mengen-Durchschnitte die selben sind. Für die neue Produktion fact... gibt es keine alternativen rechten Seiten. Für die neue Produktion sfact... sind die zu überprüfenden Durchschnitte alle leer: FIRST(ident) FIRST(number) FIRST( (expr) ) FIRST(number) FIRST( (expr) ) FIRST(ident) Bezüglich der LL(1)-Eigenschaft E2 ergibt sich auch keine neue Situation, da die Regel statement ε weiterhin die einzige ε-produktion ist und die Mengen FIRST(statement) und FOLLOW(statement) gleich bleiben. Da in den übrigen Teilen der PL0-Grammatik nur expr vorkommt, und FIRST( (expr) ) sowie FOLLOW( (expr) ) sich nicht geändert haben, sind auch dort weiterhin die LL(1)-Bedingungen erfüllt. Daher ist die PL0-Grammatik weiterhin vom Typ LL(1)! Erweiterter Programm-Code des PL0-Parser: void pl0parser::expression(void) if ((sym==plus) (sym == minus)) // if there is a sign operator +/- term(); // accept sign and parse the first term // if there is no sign term(); // parse the first term while((sym==plus) (sym == minus)) // parse following +term -term structures term(); void pl0parser::term(void) factor(); // parse the first factor while ((sym==times) (sym == slash)) // parse *factor /factor structures factor(); 9
10 void pl0parser::factor(void) sfactor(); while ( sym==expo ) sfactor(); // parse the first factor // parse all following ^factor structures void pl0parser::sfactor(void) int i; switch (sym) case ident: i = position(id); // search identifier in the symbol table if (i == 0) // identifier not found in the table error(11); if (symtable[i].kind == procobj) error(21); // neither variable nor constant // proceed to the next symbol case number: // factor is a number case lparen: // factor is "( expression )" expression(); if (sym == rparen) error (22); default: error(23); // no factor found 5.3 repeat-statement In P/L0 ist eine repeat-anweisung aufzunehmen, die in Syntax und Semantik der repeat- Anweisung von PASCAL entspricht. Die folgenden Produktionen beschreiben ihre Syntax: repeat-anw. repeat-rumpf until condition repeat-rumpf repeat-symbol Anw.folge Anw.folge repeat-symbol repeat statement Anw.folge ; statement Warum ist die PL/0-Grammatik mit diesen Erweiterungen zunächst nicht mehr vom Typ LL(1)? Die Produktion Anw.folge statement Anw.folge ; statement ist linksrekursiv, und genügt daher nicht der LL(1)-Bedingung E1 Modifizieren Sie das Produktionensystem so, daß sich wieder eine LL(1)-Grammatik ergibt! Die Umwandlung der linksrekursiven Produktion in eine iteration hilft: repeat-anw. repeat-rumpf until condition repeat-rumpf repeat-symbol Anw.folge Anw.folge statement ; Anw.folge repeat-symbol repeat 10
11 Geben Sie die Syntaxgraphen dazu an! repeat-anweisung : repeat-rumpf until condition repeat-rumpf : repeat statement statement ; Erweitern Sie den PL/0 - Parser so, daß er auch repeat-anweisungen korrekt analysiert! Erweiterung von PL0Parser.cpp: void pl0parser::statement() int i; switch (sym) // switch to the actual statement type... case repeatsym: // now we have while-statement // get next symbol after "while" statement(); while (sym == semicolon) statement(); / if (sym == untilsym) // test if "until" is present error(36); condition(); // parse the condition Erweiterung von Scanner.h: const NORW = 16; // (2 additional reserved words!) enum symbol nul, ident, number, plus, minus, times, slash, oddsym, eql, neq, lss, leq, gtr, geq, lparen, rparen, comma, semicolon, period, becomes, beginsym, endsym, ifsym, thensym, whilesym, dosym, callsym, constsym, varsym, procsym, expo, repeatsym, untilsym, Sym, colon, casesym, ofsym ; Erweiterung des Konstruktors in Scanner.cpp Scanner::Scanner ()... // table of reserved words strcpy (word[ 0], "begin "); strcpy (word[ 1], "call "); strcpy (word[ 2], "case "); strcpy (word[ 3], "const "); strcpy (word[ 4], "do "); strcpy (word[ 5], " "); strcpy (word[ 6], "end "); strcpy (word[ 7], "if "); strcpy (word[ 8], "odd "); strcpy (word[ 9], "of "); strcpy (word[10], "procedure "); strcpy (word[11], "repeat "); strcpy (word[12], "then "); strcpy (word[13], "until "); strcpy (word[14], "var "); strcpy (word[15], "while "); 11
12 // internal representation of reserved words wsym[ 0] = beginsym ; wsym[ 1] = callsym ; wsym[ 2] = casesym ; wsym[ 3] = constsym ; wsym[ 4] = dosym ; wsym[ 5] = Sym ; wsym[ 6] = endsym ; wsym[ 7] = ifsym ; wsym[ 8] = oddsym ; wsym[ 9] = ofsym ; wsym[10] = procsym ; wsym[11] = repeatsym ; wsym[12] = thensym ; wsym[13] = untilsym ; wsym[14] = varsym ; wsym[15] = whilesym ; Zweig in if-statements Die Programmiersprache PL/0 ist so zu erweitern, daß bedingte Anweisungen auch einen - Zweig besitzen können. Der Aufbau bedingter Anweisungen ist dann: entweder : if condition then statement oder: if condition then statement statement Ergänzen Sie die Syntaxdiagramme von PL/0 entsprechend! if-statement : condition then statement statement Erweitern Sie den PL/0-Parser, so daß er bedingte Anweisungen in dieser Form akzeptiert! Erweiterung von PL0Parser.cpp: void pl0parser::statement() int i; switch (sym)... // switch to the actual statement type case ifsym: // now we have an if-statement // proceed to the first symbol of the condition condition(); // parse the condition if (sym==thensym) /// check if "then" is present error(16); statement(); // parse then-alternative if (sym==sym) // alternative present? // statement(); // Erweiterung von Scanner.h: const NORW = 16; // (1 additional reserved words!) enum symbol nul, ident, number, plus, minus, times, slash, oddsym, eql, neq, lss, leq, gtr, geq, lparen, rparen, comma, semicolon, period, becomes, beginsym, endsym, ifsym, thensym, whilesym, dosym, callsym, constsym, varsym, procsym, expo, repeatsym, untilsym, Sym, colon, casesym, ofsym ; 12
13 Erweiterung des Konstruktors in Scanner.cpp Scanner::Scanner ()... // table of reserved words strcpy (word[ 0], "begin "); strcpy (word[ 1], "call "); strcpy (word[ 2], "case "); strcpy (word[ 3], "const "); strcpy (word[ 4], "do "); strcpy (word[ 5], " "); strcpy (word[ 6], "end "); strcpy (word[ 7], "if "); strcpy (word[ 8], "odd "); strcpy (word[ 9], "of "); strcpy (word[10], "procedure "); strcpy (word[11], "repeat "); strcpy (word[12], "then "); strcpy (word[13], "until "); strcpy (word[14], "var "); strcpy (word[15], "while "); // internal representation of reserved words wsym[ 0] = beginsym ; wsym[ 1] = callsym ; wsym[ 2] = casesym ; wsym[ 3] = constsym ; wsym[ 4] = dosym ; wsym[ 5] = Sym ; wsym[ 6] = endsym ; wsym[ 7] = ifsym ; wsym[ 8] = oddsym ; wsym[ 9] = ofsym ; wsym[10] = procsym ; wsym[11] = repeatsym ; wsym[12] = thensym ; wsym[13] = untilsym ; wsym[14] = varsym ; wsym[15] = whilesym ; case-statement PL/0 ist um eine case-anweisung zu erweitern. Ihre Syntax wird durch das folgende Diagramm beschrieben. Ergänzen Sie den PL/0-Parser so, daß er auch case-anweisungen analysiert. case expr of end ; statement : number Die folgenden Erweiterungen des PL0-Parsers sind notwendig: Erweiterung von PL0Parser.cpp: void pl0parser::statement()... switch (sym)... // switch to the actual statement type case casesym: expression(); if (sym == ofsym) error(37); while (sym == number) if (sym == colon) // now we have a case-statement // get next symbol after "case" // test if "of" is present // loop for case alternatives // read the number // test if ":" is present 13
14 error(38); statement(); // parse body of this alternative if (sym == semicolon) // test if ";" is present error(5); / if (sym == endsym) error(17); condition(); Erweiterung von Scanner.h: // test if "end" is present const NORW = 16; // (2 additional reserved words!) enum symbol nul, ident, number, plus, minus, times, slash, oddsym, eql, neq, lss, leq, gtr, geq, lparen, rparen, comma, semicolon, period, becomes, beginsym, endsym, ifsym, thensym, whilesym, dosym, callsym, constsym, varsym, procsym, expo, repeatsym, untilsym, Sym, colon, casesym, ofsym ; Erweiterung des Konstruktors in Scanner.cpp Scanner::Scanner ()... // table of reserved words strcpy (word[ 0], "begin "); strcpy (word[ 1], "call "); strcpy (word[ 2], "case "); strcpy (word[ 3], "const "); strcpy (word[ 4], "do "); strcpy (word[ 5], " "); strcpy (word[ 6], "end "); strcpy (word[ 7], "if "); strcpy (word[ 8], "odd "); strcpy (word[ 9], "of "); strcpy (word[10], "procedure "); strcpy (word[11], "repeat "); strcpy (word[12], "then "); strcpy (word[13], "until "); strcpy (word[14], "var "); strcpy (word[15], "while "); // internal representation of reserved words wsym[ 0] = beginsym ; wsym[ 1] = callsym ; wsym[ 2] = casesym ; wsym[ 3] = constsym ; wsym[ 4] = dosym ; wsym[ 5] = Sym ; wsym[ 6] = endsym ; wsym[ 7] = ifsym ; wsym[ 8] = oddsym ; wsym[ 9] = ofsym ; wsym[10] = procsym ; wsym[11] = repeatsym ; wsym[12] = thensym ; wsym[13] = untilsym ; wsym[14] = varsym ; wsym[15] = whilesym ;... 14
Programmierkurs Java
Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE3-Syntaxdiagramme (Stand 05.11.2010) Aufgabe 1: Entwickeln Sie Regeln zur Übersetzung von EBNF in Syntaxdiagramme. Aufgabe 2: Eine Zahl ist entweder
Modellierung und Programmierung 1
Modellierung und Programmierung 1 Prof. Dr. Sonja Prohaska Computational EvoDevo Group Institut für Informatik Universität Leipzig 4. November 2015 Administratives Zur Abgabe von Übungsaufgaben Nein, wir
Fachseminar. Semantische Analyse
Fachseminar Vortragender: Arton Berisha Thema : Semantische Analyse Kursleiter: Prof. Dr. Helmut Weber Agenda 1. Einleitung 1.1 Phasen eines Compilers 1.2 Symboltabelle 2. Semantische Analyse 2.1 Was ist
9.4 Grundlagen des Compilerbaus
Kap09.fm Seite 717 Dienstag, 7. September 2010 2:06 14 9.4 Grundlagen des Compilerbaus 717 so dass die Benutzung dieser Regeln zum Aufbau eines + -Knotens bzw. eines Negations- Knotens im abstrakten Syntaxbaum
Exercise 6. Compound Types and Control Flow. Informatik I für D-MAVT. M. Gross, ETH Zürich, 2017
Exercise 6 Compound Types and Control Flow Daniel Bogado Duffner Slides auf: Informatik I für D-MAVT [email protected] n.ethz.ch/~bodaniel Agenda Recap/Quiz Structures Unions Enumerations Loops
Ein Fragment von Pascal
Ein Fragment von Pascal Wir beschreiben einen (allerdings sehr kleinen) Ausschnitt von Pascal durch eine kontextfreie Grammatik. Wir benutzen das Alphabet Σ = {a,..., z, ;, :=, begin, end, while, do} und
Angewandte Mathematik und Programmierung
Angewandte Mathematik und Programmierung Einführung in das Konzept der objektorientierten Anwendungen zu mathematischen Rechnens WS 2013/14 Operatoren Operatoren führen Aktionen mit Operanden aus. Der
Informatik - Übungsstunde
Informatik - Übungsstunde Jonas Lauener ([email protected]) ETH Zürich Woche 08-25.04.2018 Lernziele const: Reference const: Pointer vector: iterator using Jonas Lauener (ETH Zürich) Informatik
Informatik für Mathematiker und Physiker Woche 7. David Sommer
Informatik für Mathematiker und Physiker Woche 7 David Sommer David Sommer 30. Oktober 2018 1 Heute: 1. Repetition Floats 2. References 3. Vectors 4. Characters David Sommer 30. Oktober 2018 2 Übungen
if ( Logischer Operator ) { } else { Anweisungen false
if ( Logischer Operator ) { Anweisungen true else { Anweisungen false Bedingte Anweisungen Operatoren verknüpfen Variable zu neuen Ausdrücken, wir unterscheiden Arithmetische Operatoren Berechnung von
Grundlagen der Programmierung in C++ Kontrollstrukturen
Block Keine Kontrollstruktur im eigentlichen Sinn Grundlagen der Programmierung in C++ Kontrollstrukturen Wintersemester 2005/2006 G. Zachmann Clausthal University, Germany [email protected] Dient
Software Entwicklung 1. Fallstudie: Arithmetische Ausdrücke. Rekursive Klassen. Überblick. Annette Bieniusa / Arnd Poetzsch-Heffter
Software Entwicklung 1 Annette Bieniusa / Arnd Poetzsch-Heffter Fallstudie: Arithmetische Ausdrücke AG Softech FB Informatik TU Kaiserslautern Bieniusa/Poetzsch-Heffter Software Entwicklung 1 2/ 33 Überblick
Informatik I Übung, Woche 40
Giuseppe Accaputo 1. Oktober, 2015 Plan für heute 1. Nachbesprechung Übung 2 2. Vorbesprechung Übung 3 3. Zusammenfassung der für Übung 3 wichtigen Vorlesungsslides Informatik 1 (D-BAUG) Giuseppe Accaputo
Struktur des MicroJava-Compilers
Struktur des MicroJava-Compilers Compiler Parser.mj Scanner Code- Generator.obj Symboltabelle UE zu Übersetzerbau Lexikalische Analyse 1 Grammatik ohne Scanner Expr = Term { "+" Term }. Term = Factor {
Übungs- und Praktikumsaufgaben zur Systemprogrammierung Dipl.-Ing. H. Büchter (Lehrbeauftragter) FH-Dortmund WS 2001/2002 / SS 2002
1. Stellen Sie die schrittweise Verbesserung eines Compilers durch das Bootstrap- Verfahren mit Hilfe von T-Diagrammen dar. Gegeben ist ein auf der Maschine M lauffähiger Compiler C 1, der in S geschrieben
Struktur des MicroJava-Compilers
Struktur des MicroJava-Compilers Compiler.mj.obj UE zu Übersetzerbau Lexikalische Analyse 1 Struktur des MicroJava-Compilers Compiler.mj Scanner.obj UE zu Übersetzerbau Lexikalische Analyse 2 Struktur
Pascal Schärli
Informatik I - Übung 8 Pascal Schärli [email protected] 12.04.2019 1 Was gibts heute? Best-Of Vorlesung: Prefix / Infix EBNF Vorbesprechung Problem of the Week 2 Vorlesung 3. 1 Prefix Notation Infix
Konzepte von Programmiersprachen
Konzepte von Programmiersprachen Kapitel 3: Ausdrücke Phillip Heidegger Universität Freiburg, Deutschland SS 2009 Phillip Heidegger (Univ. Freiburg) Konzepte von Programmiersprachen KvP 1 / 17 Inhalt Let
Begriffe (Wiederholung)
Begriffe (Wiederholung) Sprache Menge aller Sätze Alphabet terminales / nicht terminales terminales A. Zeichen aus denen die Sätze der Sprache bestehen nicht terminales A. Hilfszeichen zum Bilden von Regeln
Elementare Konzepte von
Elementare Konzepte von Programmiersprachen Teil 2: Anweisungen (Statements) Kapitel 6.3 bis 6.7 in Küchlin/Weber: Einführung in die Informatik Anweisungen (statements) in Java Berechnung (expression statement)
Ursprünge. Die Syntax von Java. Das Wichtigste in Kürze. Konsequenzen. Weiteres Vorgehen. Rund um Java
Ursprünge Die Syntax von Java Borland Software Corp 1995 Syntax: Pascal Objektorientierte Prorammierung optional Plattformen: Windows (Linux, Mac OS X) Sun Microsystems 1995 Syntax: C/C++ Objektorientiert
Lexikalische Programmanalyse der Scanner
Der Scanner führt die lexikalische Analyse des Programms durch Er sammelt (scanned) Zeichen für Zeichen und baut logisch zusammengehörige Zeichenketten (Tokens) aus diesen Zeichen Zur formalen Beschreibung
Herzlich willkommen!
Programmiertechnik 1 Herzlich willkommen! Dozent: Dipl.-Ing. Jürgen Wemheuer Teil 6: Zusammenfassung und Beispiele Mail: [email protected] Online: http://cpp.ewla.de/ Zusammenfassung (1) 2 1. Programm in
Verwenden Sie für jede Aufgabe die C++ IDE von Eclipse (pro Aufgabe ein Projekt).
3 Erste Programme 3.1 Übungsaufgabe Verwenden Sie für jede Aufgabe die C++ IDE von Eclipse (pro Aufgabe ein Projekt). 3.1.1 Aufgabe 1 Schreiben Sie ein C++ Programm, das einen String einliest und testet,
Syntax der Sprache PASCAL
Syntax der Sprache PASCAL Buchstaben A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z Ziffern 0 1 2 3 4 5 6 7 8 9 Sonderzeichen und Wortsymbole +
Alphabet, formale Sprache
n Alphabet Alphabet, formale Sprache l nichtleere endliche Menge von Zeichen ( Buchstaben, Symbole) n Wort über einem Alphabet l endliche Folge von Buchstaben, die auch leer sein kann ( ε leere Wort) l
3.1 Reservierte Wörter
3.1 Reservierte Wörter int Bezeichner für Basis-Typen; if, else, while Schlüsselwörter aus Programm-Konstrukten; (,), ",, {,},,,; Sonderzeichen. 62 3.2 Was ist ein erlaubter Name? Schritt 1: Angabe der
Grundlagen der Informatik 4. Kontrollstrukturen I
4. Kontrollstrukturen I Anweisungen und Blöcke Grundlagen der Informatik (Alex Rempel) 1 Anweisungen und Blöcke Anweisungen ("statements") Immer mit Semikolon abzuschließen "Leere" Anweisung besteht aus
EXCEL VBA Cheat Sheet
Variable Declaration Dim As Array Declaration (Unidimensional) Dim () As Dim ( To ) As
6 Kontextfreie Grammatiken
6 Kontextfreie Grammatiken Reguläre Grammatiken und damit auch reguläre Ausdrücke bzw. endliche Automaten haben bezüglich ihres Sprachumfangs Grenzen. Diese Grenzen resultieren aus den inschränkungen,
Allgemeine Hinweise:
TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Lehrstuhl für Sprachen und Beschreibungsstrukturen SS 2011 Einführung in die Informatik I Midtermklausur Prof. Dr. Helmut Seidl, A. Lehmann, A. Herz,
Struktur des MicroJava- Compilers
Struktur des MicroJava- Compilers Compiler Parser.mj Scanner Code- Generator.obj Symboltabelle UE zu Übersetzerbau Lexikalische Analyse 1 Grammatik ohne Scanner Expr = Term { "+" Term }. Term = Factor
Programmieren I. Kapitel 5. Kontrollfluss
Programmieren I Kapitel 5. Kontrollfluss Kapitel 5: Kontrollfluss Ziel: Komplexere Berechnungen im Methodenrumpf Ausdrücke und Anweisungen Fallunterscheidungen (if, switch) Wiederholte Ausführung (for,
Informatik für Mathematiker und Physiker Woche 2. David Sommer
Informatik für Mathematiker und Physiker Woche 2 David Sommer David Sommer 25. September 2018 1 Heute: 1. Self-Assessment 2. Feedback C++ Tutorial 3. Modulo Operator 4. Exercise: Last Three Digits 5. Binary
Informatik I Übung, Woche 40
Giuseppe Accaputo 2. Oktober, 2014 Plan für heute 1. Fragen & Nachbesprechung Übung 2 2. Zusammenfassung der bisherigen Vorlesungsslides 3. Tipps zur Übung 3 Informatik 1 (D-BAUG) Giuseppe Accaputo 2 Nachbesprechung
Programmieren in Java
Programmieren in Java Vorlesung 10: Ein Interpreter für While Prof. Dr. Peter Thiemann Albert-Ludwigs-Universität Freiburg, Germany SS 2015 Peter Thiemann (Univ. Freiburg) Programmieren in Java JAVA 1
Vorlesung Programmieren
Vorlesung Programmieren 3. Kontrollstrukturen 04.11.2015 Prof. Dr. Ralf H. Reussner Version 1.1 LEHRSTUHL FÜR SOFTWARE-DESIGN UND QUALITÄT (SDQ) INSTITUT FÜR PROGRAMMSTRUKTUREN UND DATENORGANISATION (IPD),
Einführung - Parser. Was ist ein Parser?
Gliederung 1. Einleitung 1.1 Was ist ein Parser? 1.2 Was ist ein tabellengesteuerter TD-Parser? 1. Tabellengesteuerter TD-Parser 2.1 Funktionsweise 2.2 Darstellung als Pseudocode 2.3 Konstruktion von prädiktiven
Boolean Wertemenge: Wahrheitswerte {FALSE,TRUE}, auch {0,1} Deklaration:
Boolean Wertemenge: Wahrheitswerte {,}, auch {,} Deklaration: VAR present,billig,laut,gefunden : BOOLEAN; Ein-/Ausgabe: keine! Operatoren: Negation, Verneinung NOT ~ Konjunktion, logisches UND AND & Disjunktion,
15. Rekursion. Rekursive Funktionen, Korrektheit, Terminierung, Aufrufstapel, Bau eines Taschenrechners, BNF, Parsen
453 15. Rekursion Rekursive Funktionen, Korrektheit, Terminierung, Aufrufstapel, Bau eines Taschenrechners, BNF, Parsen Mathematische Rekursion 454 Viele mathematische Funktionen sind sehr natürlich rekursiv
Algorithmen zur Datenanalyse in C++
Algorithmen zur Datenanalyse in C++ Hartmut Stadie 16.04.2012 Algorithmen zur Datenanalyse in C++ Hartmut Stadie 1/ 39 Einführung Datentypen Operatoren Anweisungssyntax Algorithmen zur Datenanalyse in
Einstieg in die Informatik mit Java
Vorlesung vom 6.11.07, Weitere Anweisungen Übersicht 1 Verbundanweisung 2 Bedingte Anweisung 3 Auswahlanweisung 4 for Schleife 5 while Schleife 6 do Schleife 7 break Anweisung 8 continue Anweisung 9 Leere
Technische Universität München WS 2004/2005 Fakultät für Informatik 11. Dezember 2004 Prof. Dr. Seidl
Name: Vorname: Matr. Nr.: Technische Universität München WS 2004/2005 Fakultät für Informatik 11. Dezember 2004 Prof. Dr. Seidl Zwischenklausur zu Einführung in die Informatik I Hinweis: In dieser Zwischenklausur
3. Wahrheitswerte. Boolesche Funktionen; der Typ bool; logische und relationale Operatoren; Kurzschlussauswertung; Assertions und Konstanten
114 3. Wahrheitswerte Boolesche Funktionen; der Typ bool; logische und relationale Operatoren; Kurzschlussauswertung; Assertions und Konstanten Wo wollen wir hin? 115 int a; std::cin >> a; if (a % 2 ==
Programmierkurs I. Gliederung: Deklarationsteil als BNF 2. Blöcke in Ada95 (Lebenszeit, Sichtbarkeit von Variablen)
Programmierkurs I 11.11.2002 Gliederung: 1. Deklarationsteil als BNF 2. Blöcke in Ada95 (Lebenszeit, Sichtbarkeit von Variablen) EBNF: Wiederholung Die EBNF (Erweiterte Backus-Naur-Form) wurde in der Vorlesung
C++11. neu in C++11: range-based for. Objektorientierte Programmierung mit C++ Ersetzung durch: 1. Elementares C++ int array[] = { 1, 2, 3, 4, 5 };
neu in C++11: range-based for int array[] = { 1, 2, 3, 4, 5 ; for (int x : array) // value x *= 2; C++11 for (int& x : array) // reference x *= 2; Ersetzung durch: { auto && range = range-init; for ( auto
Informatik II Übung 3. Pascal Schärli
Informatik II Übung 3 [email protected] Warm up Ist das ein Baum? Left child: Right child: Parent: [A B C _ E _ G H I _] 0 2 3 4 5 6 7 8 9 1 2*i + 1 2*i + 2 (i-1)/2 2 Überblick Serie 3 Aufgabe 1
Informatik 1. Prüfung im Wintersemester 1997/98
Informatik 1 Prüfung im Wintersemester 1997/98 Fachhochschule für Technik und Wirtschaft Reutlingen, Fachbereich Elektronik Prüfungsfach/Studiengang/Semester: Informatik 1 in Elektronik 1 Prüfer: Prof.
1 Bedingte Anweisungen. 2 Vergleiche und logische Operatoren. 3 Fallunterscheidungen. 4 Zeichen und Zeichenketten. 5 Schleifen.
Themen der Übung Kontrollstrukturen, Pseudocode und Modulo-Rechnung CoMa-Übung III TU Berlin 9.10.01 1 Bedingte Anweisungen Vergleiche und logische Operatoren 3 Fallunterscheidungen 4 Zeichen und Zeichenketten
Einstieg in die Informatik mit Java
1 / 41 Einstieg in die Informatik mit Java Weitere Anweisungen Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 41 1 Überblick 2 Verbundanweisung 3 Bedingte Anweisung 4 Auswahlanweisung
Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 29
Kapitel 2 Einführung in C++ Seite 1 von 29 C++ Zeichensatz - Buchstaben: a bis z und A bis Z. - Ziffern: 0 bis 9 - Sonderzeichen: ; :,. # + - * / % _ \! < > & ^ ~ ( ) { } [ ]? Seite 2 von 29 Höhere Elemente
Konstruieren der SLR Parsing Tabelle
Konstruieren der SLR Parsing Tabelle Kontextfreie Grammatik (CFG) Notation 1. Diese Symbole sind Terminals: (a) Kleinbuchstaben vom Anfang des Alphabets wie a, b, c. (b) Operator Symbole wie +,, usw. (c)
Grundlagen der Programmierung in C++ Kontrollstrukturen
Grundlagen der Programmierung in C++ Kontrollstrukturen Wintersemester 2005/2006 G. Zachmann Clausthal University, Germany [email protected] Block Keine Kontrollstruktur im eigentlichen Sinn Dient
Steuerungsstrukturen. Ablaufsteuerung der PL/SQL Ausführung. IF Anweisungen. Einfaches IF
Steuerungsstrukturen Ablaufsteuerung der PL/SQL Ausführung Der logische Ablauf der Ausführung kann mit If und Loop Strukturen verändert werden Bedingte Anweisungen: IF-THEN-END IF IF-THEN-ELSE-END IF IF-THEN-ELSIF-END
Teil IX. Eine kleine Programmiersprache
Teil IX Eine kleine Programmiersprache 1 Teil IX.1 Syntaktische Beschreibungsmittel 2 Chomsky Grammatik Eine Chomsky Grammatik wird beschrieben mit einem Quadrupel G = (N, T, P, S). Dabei ist: N die Menge
Fachseminar Compilerbau
Fachseminar Compilerbau WS 08/09 Matthias Schiller Syntaktische Analyse 1. Prinzip der Top-Down-Analyse 2. LL(1)-Grammatiken Modell-Vorstellung Der Scanner liefert als Ergebnis der lexikalischen Analyse,
Java Tools JDK. IDEs. Downloads. Eclipse. IntelliJ. NetBeans. Java SE 8 Java SE 8 Documentation
Java Tools JDK http://www.oracle.com/technetwork/java/javase/ Downloads IDEs Java SE 8 Java SE 8 Documentation Eclipse http://www.eclipse.org IntelliJ http://www.jetbrains.com/idea/ NetBeans https://netbeans.org/
17. Rekursion 2. Bau eines Taschenrechners, Ströme, Formale Grammatiken, Extended Backus Naur Form (EBNF), Parsen von Ausdrücken
564 17. Rekursion 2 Bau eines Taschenrechners, Ströme, Formale Grammatiken, Extended Backus Naur Form (EBNF), Parsen von Ausdrücken Motivation: Taschenrechner 565 Beispiel Eingabe: 3 + 5 Ausgabe: 8 Binäre
Programmieren in Java
Programmieren in Java Vorlesung 07: Parsen Prof. Dr. Peter Thiemann Albert-Ludwigs-Universität Freiburg, Germany SS 2015 Peter Thiemann (Univ. Freiburg) Programmieren in Java JAVA 1 / 32 Inhalt Vorlesungsüberblick
Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 1. Teil
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++ 1. Teil 11. April 2012 Organisatorisches MÜNSTER Übung zur Vorlesung Wissenschaftliches
RO-Tutorien 3 / 6 / 12
RO-Tutorien 3 / 6 / 12 Tutorien zur Vorlesung Rechnerorganisation Christian A. Mandery WOCHE 2 AM 06./07.05.2013 KIT Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft
1 Formale Sprachen, reguläre und kontextfreie Grammatiken
Praktische Informatik 1, WS 2001/02, reguläre Ausdrücke und kontextfreie Grammatiken 1 1 Formale Sprachen, reguläre und kontextfreie Grammatiken Ein Alphabet A ist eine endliche Menge von Zeichen. Die
Vorlesung Programmieren
Vorlesung Programmieren 3. Kontrollstrukturen 09.11.2016 Jun.-Prof. Dr.-Ing. Anne Koziolek Version 1.1 ARBEITSGRUPPE ARCHITECTURE-DRIVEN REQUIREMENTS ENGINEERING (ARE) INSTITUT FÜR PROGRAMMSTRUKTUREN UND
Grundlagen der Programmiersprache C für Studierende der Naturwissenschaften
Grundlagen der Programmiersprache C für Studierende der Naturwissenschaften Teil 3: Anweisungen, Blöcke und Programmfluss Martin Nolte Abteilung für Angewandte Mathematik Universität Freiburg i. Br. Vorlesung
