compileren & interpreteren - compileren: vertalen (omzetten) - interpreteren: vertolken

Vergelijkbare documenten
Deeltentamen Grammatica s en ontleden 22 december 2005

Als een PSD selecties bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk.

Het omzetten van reguliere expressies naar eindige automaten, zie de vakken Fundamentele Informatica 1 en 2.

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

colleges recursieve datastructuren college 9 prioriteit van operatoren prioriteit in recursive descent parser

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Zelftest Inleiding Programmeren

10 Meer over functies

Compilers.

Programmeermethoden. Recursie. week 11: november kosterswa/pm/


HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren

Tentamen Object Georiënteerd Programmeren TI januari 2013, Afdeling SCT, Faculteit EWI, TU Delft

Modelleren en Programmeren

REEKS I. Zaterdag 6 november 2010, 9u

9 Meer over datatypen

Opdrachten herhalen. public void tekenscherm (object o, PEA pea) { int x; x = 1; zolang de voorwaarde geldig is

Kwis (3) class X { public void a() { System.out.println("x"); public static void main(string[] args) { X x = new X();

Programmeermethoden. Recursie. Walter Kosters. week 11: november kosterswa/pm/

Modelleren en Programmeren

Vakgroep CW KAHO Sint-Lieven

Aanvullende toets Gameprogrammeren (INFOB1GP) Woensdag 24 december 2014, uur

Programmeren in Java les 3

Voortgezet Prog. voor KI

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Inleiding Programmeren 2

17 Operaties op bits Bitoperatoren en bitexpressies

Modelleren en Programmeren

Inleiding Programmeren 2

Tentamen Informatica (8C010), 16 augustus 2002, u. Het tentamen bestaat uit 6 opgaven verdeeld over 4 pagina s.

Modelleren en Programmeren

Modelleren en Programmeren

Datastructuren Programmeeropdracht 3: Expressies. 1 Expressies. Deadline. Dinsdag 8 december 23:59.

Tentamen Imperatief Programmeren

Modelleren en Programmeren

Modelleren en Programmeren

import java.io.*; één klasse public class Hallo { public static void main (String[] a) ...met één functie System.out.println("Hallo!

Python. Vraag 1: Expressies en types. Vraag 1 b: Types -Ingebouwde functies- Vraag 1 a 3/10/14

Elementary Data Structures 3

Datastructuren: stapels, rijen en binaire bomen

Syntax- (compile), runtime- en logische fouten Binaire operatoren

Hoofdstuk 0. Van Python tot Java.

Niet-numerieke data-types

Informatica: C# WPO 11

Recursie. public static int faculteit( int n ){ // Deze functie berekent n! // pre: n = N en n >= 0 // post: faculteit = N!

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, uur

Ingebouwde klassen & methodes

Variabelen en statements in ActionScript

Informatica. Deel II: les 1. Java versus Python. Jan Lemeire Informatica deel II februari mei Parallel Systems: Introduction

Een topprogrammeur in het OO programmeren is Graig Larman. Hij bedacht de volgende zin:

Informatica: C# WPO 2

Recursive-Descent Parsing

Controle structuren. Keuze. Herhaling. Het if statement. even1.c : testen of getal even of oneven is. statement1 statement2

inleiding theoretische informatica practicum 1 deadline woensdag 20 februari 2008 om uur

Game of Life in Java

Datastructuren en algoritmen

Recursie: definitie. De som van de kwadraten van de getallen tussen m en n kan als volgt gedefinieerd worden:

public boolean equaldates() post: returns true iff there if the list contains at least two BirthDay objects with the same daynumber

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Informatie. Voorbeeld. Voorbeeld: toegangsprijs

Programmeren 1 23 januari 2013 Prof. T. Schrijvers

Informatica. Deel II: les 1. Java versus Python. Jan Lemeire Informatica deel II februari mei Parallel Systems: Introduction

Overerving & Polymorfisme

1 Inleiding in Functioneel Programmeren

Tentamen Objectgeorienteerd Programmeren TI februari Afdeling ST Faculteit EWI TU Delft

vandaag èn vrijdag deadline maandag 12 dec.

MMI. The Digital World 4. Peter van Kranenburg

Jörg R. Hörandel Afdeling Sterrenkunde.

Recursion. Introductie 37. Leerkern 37. Terugkoppeling 40. Uitwerking van de opgaven 40

Inleiding programmeren

recursie Hoofdstuk 5 Studeeraanwijzingen De studielast van deze leereenheid bedraagt circa 6 uur. Terminologie

Scala. Korte introductie. Sylvia Stuurman

Datastructuren Programmeeropdracht 2: Expressies. 1 Expressies. Deadlines. Woensdag 12 oktober 23:59, resp. woensdag 2 november 23:59.

Java Les 3 Theorie Herhaal structuren

Uitwerkingen derde deeltentamen Gameprogrammeren Vrijdag 6 november 2015, uur

eerste voorbeelden in Java

Tentamen Object Georiënteerd Programmeren TI oktober 2014, Afdeling SCT, Faculteit EWI, TU Delft

Tentamen Bionformatica deel A(8C074), 18 januari 2007, u.

Samenvatting hst. 3 sec. 1-3

Uitbreiding van de Model Specification Language (MSL) compiler. Thierry Cornelis

College Introductie


In de tweede regel plaatsen we in het gereserveerde stukje geheugen een getal.

Voorbeelden. Sorteren. Voorbeeld: n = 5. # intsort.py: sorteren van een rij getallen

Tentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld

TEST INFORMATICA 1STE BACHELOR IN DE INGENIEURSWETENSCHAPPEN - ACADEMIEJAAR

REEKS II. Zaterdag 6 november 2010, 11u


Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, uur

Programmeermethoden. Functies vervolg. Walter Kosters. week 5: 1 5 oktober kosterswa/pm/

Oefeningen Java Oplossingen

Algoritmiek. 15 februari Grafen en bomen

SPOJ oplossingen Gilles Callebaut 7 augustus 2015

Lab Webdesign: Javascript 3 maart 2008

Practicum Programmeerprincipes

NAAM: Programmeren 1 Examen 29/08/2012

Opgaven. Python Assessment

Tweede college algoritmiek. 12 februari Grafen en bomen

DIAGNOSTISCHE TOETS Softwaresystemen UITWERKING

Transcriptie:

compileren & interpreteren - compileren: vertalen (omzetten) - interpreteren: vertolken - belangrijkste punten: - ontleden van de programmatekst - bijhouden van de datastructuren Data Structuren en Algoritmen - Sorteren september 2013 1

voorbeeldprogramma in Java void main (String [] args) { int k = 1, kw = 1; while (k < 10) /* invariant: kw = k 2 */ { kw += k ++; kw += k; Data Structuren en Algoritmen - Sorteren september 2013 2

ontleedboom Data Structuren en Algoritmen - Sorteren september 2013 3

vertalen naar 68000 assembly registergebruik: d1 = k d2 = kw move.w #1, d1 ; k = 1 move.w #1, d2 ; kw = 1 while: cmp.w #10, d1 ; if (k < 10) bge endwhile ; add.w d1, d2 ; kw = kw + k add.w #1, d1 ; k = k + 1 add.w d1, d2 ; kw = kw + k bra while endwhile: vertaling komt tot stand door ontleedboom te doorlopen while-lus nagebootst met sprongen naar labels Data Structuren en Algoritmen - Sorteren september 2013 4

interpretatie in een opzoektabel staan de namen van de variabelen met hun waarde Data Structuren en Algoritmen - Sorteren september 2013 5

interpretatie interpreteren is dus (recursief) ontleedboom doorlopen en opdrachten nabootsen Data Structuren en Algoritmen - Sorteren september 2013 6

ontleden Data Structuren en Algoritmen - Sorteren september 2013 7

ontleden void main (String []) { int k = 1, kw = 1; while (k < 10) { kw += k ++; kw += k; Data Structuren en Algoritmen - Sorteren september 2013 8

lexicon - woordenboek - token woord uit tekst + tokentype - beschrijvingsmiddel reguliere expressies - ebnf-notatie ::= definitie keuze [ ] optioneel (0 of 1 keer) { herhaling ( 0) - voorbeelden letter ::= 'A'... 'Z' 'a'... 'z' cijfer ::= '0'... '9' identifier ::= ( '_' letter ) { '_' letter cijfer getal ::= [ ' ' '+' ] cijfer { cijfer Data Structuren en Algoritmen - Sorteren september 2013 9

lexicale analysator enum Token {Ident, Number, LPar, RPar, Plus, Times, Minus, Divide, Eof, Invalid; class Tokenizer { public Tokenizer(String ins) ; // initialize with string public Tokenizer(File ins); // initialize with file public void close(); // close tokenizer public Token gettokentype(); // return type of token public String gettokenstring(); // return string of token public int gettokenvalue(); // return value of integer token public void getnexttoken(); // shift to next token Data Structuren en Algoritmen - Sorteren september 2013 10

lexicale analysator (vervolg) - een lexicale analysator wordt in het algemeen gemaakt vanuit een reguliere expressie - dit proces kan worden geautomatiseerd - de reguliere expressie wordt daartoe eerst omgezet in een eindige automaat - van de eindige automaat wordt een programma afgeleid - gereserveerde woorden worden meestal opgezocht in een tabel Data Structuren en Algoritmen - Sorteren september 2013 11

grammatica - een grammatica beschrijft de structuur van de zinnen van een taal via produktieregels - (vgl. redekundig ontleden) voorbeeld: statements van C startsymbool: statement eindsymbolen: de tokens van de lexicale analyse produkties: statement ::= if_statement assignment... if_statement ::= if ( expressie ) rest_if rest_if ::= statement [ else statement ] etc. Data Structuren en Algoritmen - Sorteren september 2013 12

probleem schrijf een programma dat een rekensom inleest en het antwoord afdrukt voorbeelden van rekensommen 12 100 25 20 + 3 8 (9 3) / 2 + 7 (3 1) een rekensom bestaat uit: - getallen (zonder teken) - haken (netjes in paren) - operatoren '+', ' ', ' ', '/' '+' en ' ' hebben dezelfde prioriteit ' ' en '/' hebben dezelfde prioriteit ' ' en '/' gaan voor '+' en ' ' Data Structuren en Algoritmen - Sorteren september 2013 13

lexicale analyse getal ::= ('1'... '9') { '0'... '9' lhaak rhaak plus min maal deel ::= '(' ::= ')' ::= '+' ::= ' ' ::= ' ' ::= '/' scheidingsteken ::= '\n ' semantiek (= betekenis) waarde (getal) wordt bepaald door - waarde (c 0 ) = c 0 - '0' - waarde (c n-1... c 0 ) = 10 waarde (c n-1... c 1 ) + waarde (c 0 ) Data Structuren en Algoritmen - Sorteren september 2013 14

grammatica: eerste poging startsymbool : expressie expressie ::= getal expressie plus expressie expressie min expressie expressie maal expressie expressie deel expressie lhaak expressie rhaak Data Structuren en Algoritmen - Sorteren september 2013 15

semantiek semantische regels voor waarde (expressie): waarde (getal) = getal waarde (expressie 1 plus expressie 2 ) = waarde (expressie 1 ) + waarde (expressie 2 ) waarde (expressie 1 min expressie 2 ) = waarde (expressie 1 ) waarde (expressie 2 ) waarde (expressie 1 maal expressie 2 ) = waarde (expressie 1 ) waarde (expressie 2 ) waarde (expressie 1 deel expressie 2 ) = waarde (expressie 1 ) / waarde (expressie 2 ) waarde (lhaak expressie rhaak) = waarde (expressie) Data Structuren en Algoritmen - Sorteren september 2013 16

voorbeelden grammatica is ambigu (= dubbelzinnig) Geef een andere parsetree die ook bij deze expressie mogelijk is. Data Structuren en Algoritmen - Sorteren september 2013 17

grammatica: tweede poging startsymbool : expressie expressie ::= term { ( plus min ) term term ::= factor { ( maal deel ) factor factor ::= getal lhaak expressie rhaak de keuze van de produkties hangt samen met de prioriteiten van de operatoren voorbeeld semantische regel: waarde (term 1 - term 2 + term 3 ) = waarde (term 1 ) - waarde (term 2 ) + waarde (term 3 ) Data Structuren en Algoritmen - Sorteren september 2013 18

voorbeelden deze afleiding kan worden gevonden door boven in de boom te beginnen met het startsymbool expressie een expressie begint altijd met een term een term begin altijd met een factor het token is getal, dus factor gevonden het volgende token is plus, dus term gevonden nu op zoek naar de volgende term van expressie Data Structuren en Algoritmen - Sorteren september 2013 19

recursieve ontleedfuncties voor lexicale analyse: enum Token{ Ident,, Eof, Invalid ; Token gettokentype; int gettokenvalue;/* waarde getal */ String gettokenstring(); void getnexttoken (); /* shift next*/ voor ontleding: int expressie (); int term (); int factor (); invariant: gettokentype() geeft eerstvolgende tokentype elke functie leest / berekent een zo groot mogelijke expressie, term of factor Data Structuren en Algoritmen - Sorteren september 2013 20

recursieve ontleedfuncties int expressie() throws Exception { int waarde = term(); while (tkn.gettokentype() == Token.Plus tkn.gettokentype() == Token.Minus) { if (tkn.gettokentype() == Token.Plus) { tkn.getnexttoken(); waarde += term(); else { tkn.getnexttoken(); waarde -= term(); return waarde; int term() throws Exception { int waarde = factor(); while (tkn.gettokentype() == Token.Times tkn.gettokentype() == Token.Divide) { if (tkn.gettokentype() == Token.Times) { tkn.getnexttoken(); waarde *= factor(); else { tkn.getnexttoken(); waarde /= factor(); return waarde; Data Structuren en Algoritmen - Sorteren september 2013 21

recursieve ontleedfuncties int factor() throws Exception { int waarde = 0; if (tkn.gettokentype() == Token.Number) { waarde = tkn.gettokenvalue(); tkn.getnexttoken(); // voor invariant else if (tkn.gettokentype() == Token.LPar) { tkn.getnexttoken(); waarde = expressie(); if (tkn.gettokentype()!= Token.RPar) { throw new Exception(") expected"); tkn.getnexttoken(); // voor invariant else { throw new Exception("Unexpected token " + tkn.gettokentype()); return waarde; Factor leest getallen en haakjes. Expressie en term lezen de operatoren! Bij foute invoer wordt er een exceptie gegenereerd. Data Structuren en Algoritmen - Sorteren september 2013 22

recursieve ontleedfuncties het ontleden wordt gestart met: tkn = new Tokenizer(input); tkn.getnexttoken(); // invariant int result = expressie(); dezelfde structuur kan worden gebruikt om een ontleedboom op te bouwen als je eenmaal een geschikte grammatica hebt, is het tamelijk eenvoudig de recursieve ontleedfuncties te schrijven helaas is niet elke grammatica geschikt voor deze ontleedmethode valkuilen: oneindige recursie meer dan één keuzemogelijkheid (tokentype geeft geen uitsluitsel) het is wel altijd mogelijk een grammatica om te werken zodat deze wel geschikt wordt! Data Structuren en Algoritmen - Sorteren september 2013 23

waarom hier geen oneindige recursie dus elke functie consumeert een stuk van de invoer (en aan het eind van de invoer stopt factor) waarom hier geen keuzeproblemen expressie ::= term { ( plus min ) term term ::= factor { ( maal deel ) factor factor ::= getal lhaak expressie rhaak aan tokentype kan direct worden afgelezen welke keuze gemaakt moet worden Data Structuren en Algoritmen - Sorteren september 2013 24