Kompilatorer och interpretatorer

Relevanta dokument
Kompilatorer och interpretatorer

Tentamen i. för D1 m fl, även distanskursen. lördag 26 februari 2011

Programmering C: Tentamen of 5 Prioritet och associativitet hos operatorerna i C De viktigaste operatorerna: Prioritet Kategori Operator

Tentamen i. Programmering i språket C

Tentamen i. för D1 m fl, även distanskursen. lördag 28 maj 2011

Tentamen i Programmering grundkurs och Programmering C

Tentamen i Programmering grundkurs och Programmering C

Tentamen i. Programmering i språket C

Tentamen i Programmering grundkurs och Programmering C

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

Databasteknik för D1, SDU1 m fl

Tentamen i Programmering grundkurs och Programmering C

Tentamen i Programmering grundkurs och Programmering C

Tentamen i. för D1 m fl, även distanskursen. lördag 19 januari 2013

Tentamen i Programmering grundkurs och Programmering C

Tentamen i Programmering grundkurs och Programmering C

Databasteknik för D1, SDU1 m fl

För alla uppgifter på tentan gäller: Man får använda både standard-c++ (som till exempel har pekare som anges med * och objekt som skapas med new) och

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Backcode. Jonathan Crusoe TDP019 Projekt: Datorspråk Linköpings universitet

TDIU01 - Programmering i C++, grundkurs

KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012

Inlämningsuppgift MiniPlotter

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

kind spelling Scanning

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

Tentamen i Programmering grundkurs och Programmering C

lex källkod lex.l lexkompilator lex.yy.c C- kompilator lex.yy.c a.out sekvens av tokens a.out input specifikation av tokens mha reguljära uttryck

Tentamen *:58/ID100V Programmering i C Exempel 3

Automatateori (2) Idag: Sammanhangsfria språk. Dessa kan uttryckas med Grammatik PDA

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Omtentamen i Programmering C, Fri, Kväll,

Tentamen i Grundläggande programmering STS, åk

Föreläsning 7: Syntaxanalys

Programmeringsteknik med C och Matlab

Kompilatorteknik. Görel Hedin Datavetenskap Lunds Tekniska Högskola. Temaföreläsning, Datorer i system, 2009

Tentamen i Objektorienterad Programmering 5p, Au, D, Fri, Pr,

Tentamen i Grundläggande programmering STS, åk 1 fredag

Parsning. TDP007 Konstruktion av datorspråk Föreläsning 6. Peter Dalenius Institutionen för datavetenskap

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

PDA-applikationer med.net

Tentamen i Grundläggande programmering STS, åk 1 lördag

Kompilatorteknik. Görel Hedin Datavetenskap Lunds Tekniska Högskola. Temaföreläsning, Datorer i system, 2010

Kompilatorteknik. Görel Hedin Datavetenskap Lunds Tekniska Högskola. Temaföreläsning, Datorer i system, 2011

Lämna in en ifylld kursvärdering tillsammans med tentan! Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl

TENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13:15

Välkommen till. Datastrukturer, algoritmer och programkonstruktion. eller DOA

Linköpings universitet Innovativ Programmering TDP019 Projekt: Datorspråk. flip/flop. ett helt flippat språk

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

DD1361 Programmeringsparadigm. Formella Språk & Syntaxanalys. Per Austrin

Tentamen Datastrukturer (DAT036)

Objektorienterad Programmering (TDDC77)

Kompilatorteknik. Görel Hedin Datavetenskap Lunds Tekniska Högskola. Temaföreläsning, Datorer i system, 2014

Övning från förra gången: readword

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl 13. Omtentamen i Programmering C, 5p, A1, D1, PA1, Fri,

TDDC76 - Programmering och Datastrukturer

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

OMTENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13: 15

Tentamen i Algoritmer & Datastrukturer i Java

Grundläggande programmering med C# 7,5 högskolepoäng. Provmoment: Ladokkod: Tentamen ges för: TEN1 NGC011 ADAEK17, ASYST17 samt öppen för alla

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

1 Språket C Valet av språket C++ för kompendiet. 1.2 Språket. 1.3 Att programmera. 1.4 Hello World Börja programmera

ÖREBRO UNIVERSITET. Lösningarna till tentamensuppgifterna sätts ut på kurssidan på nätet i dag kl 13.

Tentamen i Grundläggande programmering STS, åk

Prov i DAT 312: Algoritmer och datastrukturer för systemvetare

Översikt. Varför lära sig detta? Motivering Syntax och semantik Imperativa språkets byggstenar och Python. PL-boken Kap 1 (repetition):

1 Funktioner och procedurell abstraktion

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Programmering: att instruera en maskin att utföra en uppgift, kräver olika språk:

Program & programmering

Imperativ programmering. Föreläsning 2

Tentamen Grundläggande programmering

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

TDDC74 Programmering, abstraktion och modellering. Tentamen

Grammatik. BNF-grammatik

TDDC30/725G63. Objektorienterad programmering i Java, datastrukturer och algoritmer

Tentamen i Grundläggande programmering STS, åk 1 fredag

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl

729G04 Programmering och diskret matematik

729G04 Programmering och diskret matematik TEN kl 8-12

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Tentamen, EDAA20/EDA501 Programmering

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

2 b) Följande finns definierat: public class Käk String titel = "Chili con carne"; Krydda[] kryddor = new Krydda[10]; kryddor[0] = new Krydda("Svartpe

Föreläsning 3. Programmering, C och programmeringsmiljö

Introduktion till programmering och Python Grundkurs i programmering med Python

Tentamen ges för: Tentamensdatum: Tid:

Uppgifter till tenta i 729G04 Programmering och diskret matematik. 17 december 2015, kl 14:00-18:00

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

2 b) Följande finns definierat: public class Spel String titel = "Spel"; Dice[] tärningar = new Dice[10]; tärningar[0] = new Dice("Röd"); tärningar[1]

INFORMATIK - MED SYSTEMVETENSKAPLIG INRIKTNING, GRK/A (1-30 HP)

PROMETHEUS. Ett typat, objektorienterat programmeringsspråk av Tim Andersson.

GPT- föreläsning 10. För en vecka sedan Problemlösning på lägre nivå kan sortera funktioner Förra gången

Transkript:

1 of 6 Örebro universitet Institutionen för teknik Thomas Padron-McCarthy (Thomas.Padron-McCarthy@oru.se) Tentamen i Kompilatorer och interpretatorer för Dataingenjörsprogrammet m fl lördag 7 november 2009 Gäller som tentamen för: DT3004 Datateknik C, Kompilatorer och interpretatorer, provkod 0100 TDK104 Kompilatorer och interpretatorer, provkod 0100 Hjälpmedel: Inga hjälpmedel. Poängkrav: Maximal poäng är 40. För godkänt betyg (3 respektive G) krävs 20 poäng. Resultat: Meddelas på kursens hemsida eller via e-post senast lördag 28 november 2009. Återlämning av tentor: Examinator och jourhavande: Efter att resultatet meddelats kan tentorna hämtas på institutionen. Man kan också få sin rättade tenta hemskickad. Thomas Padron-McCarthy, telefon 070-73 47 013. Skriv tydligt och klart. Lösningar som inte går att läsa kan naturligtvis inte ge några poäng. Oklara och tvetydiga formuleringar kommer att misstolkas. Skriv den personliga tentamenskoden på varje inlämnat blad. Skriv inte namn eller personnummer på bladen. Skriv bara på en sida av papperet. Använd inte röd skrift. Antaganden utöver de som står i uppgifterna måste anges. Skriv gärna förklaringar om hur du tänkt. Även ett svar som är fel kan ge poäng, om det finns med en förklaring som visar att huvudtankarna var rätt. LYCKA TILL!

2 of 6 Scenario till (en del av) uppgifterna En träningsdagbok är en dagbok där man antecknar sina träningspass, som till exempel löpning och styrketräning. Vi vill att man ska kunna skriva sin träningsdagbok som en fil, och så ska ett program läsa filen och göra olika typer av bearbetning. Här är ett exempel på hur en fil med en sådan träningsdagbok ska kunna se ut: typ löpning; typ motionscykling; 2009-10-19 löpning; typ styrketräning ; 2009-10-19 styrketräning; 2009-10-20 löpning 43:12.2; 2009-10-21 löpning 1:44:00.62 ; 2009-10-21 styrketräning 1:00:00 ; 2009-10-22 motionscykling 1:09:22.1; slut; Som synes ska filen kunna skrivas på fritt format, vilket betyder att blanktecken och radslut inte spelar någon roll, annat än för att skilja orden från varandra. Man kan skriva in vilka sporter man ägnar sig åt med "satser" som börjar med nyckelordet typ. Man kan skriva in träningspass med "satser" som börjar med ett datum, följt av namnet på en sport (som tidigare måste ha deklarerats med en typ-sats), eventuellt följt av en tid. Dessutom finns en slut-sats som markerar slutet på träningsdagboken. Alla satser avslutas med semikolon. Det finns alltså ett "träningsdagboks-språk" som beskriver hur träningsdagboken ser ut, och ett program som ska kunna läsa och förstå träningsdagboken måste kunna läsa och förstå det språket.

3 of 6 Uppgift 1 (5 p) Vi antar att datum och tid är två egna tokentyper (även kallade terminaler). a) (2p) Vilka övriga tokentyper ingår i träningsdagboks-språket? b) (1p) Ett exempel på hur ett datum kan se ut är 2009-10-19. Datum ska bestå av årtal med fyra siffror, ett bindestreck, månad med två siffror, ännu ett bindestreck, och till sist datum med två siffror. Skriv ett reguljärt uttryck som beskriver tokentypen datum. c) (2p) Den träningstid som man kan ange för en träning kan bestå av timmar, minuter, sekunder och decimaldelar av en sekund, som till exempel 1:09:22.1 och 117:00:09.6293845. Minuterna och sekunderna måste vara med, men timmarna och sekunddecimalerna kan uteslutas, som till exempel 09:22.17, 1:09:22 och 0:09. Skriv ett reguljärt uttryck som beskriver tokentypen tid. Uppgift 2 (5 p) a) (3p) Skriv en grammatik för träningsdagboks-språket. Använd terminalerna från uppgift 1. Startsymbolen ska heta dagbok, och ska beskriva hela innehållet på filen, enligt scenariot. b) (2p) Om grammatiken från a-uppgiften inte lämpar sig för implementation i form av en prediktiv recursive-descent-parser, så transformera den så den passar. (Om den redan är lämplig, behöver du inte göra om den, utan du får 2 poäng på den här deluppgiften i alla fall.) Uppgift 3 (3 p) Ett parse-träd (ibland kallat "konkret syntaxträd") innehåller noder för alla icke-terminaler. I ett syntax-träd (ibland kallat "abstrakt syntaxträd") har man tagit bort alla "onödiga" inre noder, och flyttat upp operatorerna. Här är en kort träningsdagbok: typ vila; 2009-10-19 vila 24:00:00; 2009-10-20 fika 1:00:00; slut; Rita upp ett parse-träd för denna träningsdagbok, med din grammatik från (b-)uppgiften ovan.

4 of 6 Uppgift 4 (5 p) Skriv en prediktiv recursive-descent-parser för träningsdagboks-språket. Gör detta i ett språk som åtminstone liknar något vanligt känt programmeringsspråk, till exempel C. Du behöver inte skriva exakt korrekt programkod, men det ska framgå vilka procedurer som finns, hur de anropar varandra, och vilka jämförelser med tokentyper som görs. Förklara gärna sådant som kan antas vara oklart för läraren. Du kan anta att det redan finns en funktion som heter scan, och att den returnerar typen på nästa token. Uppgift 5 (4 p) Här är ett C-program: #include <stdlib.h> #include <stdio.h> int x = 1; int apa(int a, int b) { int* p = malloc(sizeof(int)); *p = a; x = a; if (a <= 2) { /* Här! */ return 3; else { return apa(a - 4, b); void svamp(int a, int y) { int z; z = 5; z = apa(6, x); int main(void) { int a; int y; a = 7; y = 8; svamp(a, y); a = 9; return 0; Ett programs adressrymd kan delas upp i fyra delar: programkod och konstanter, statiska data, heap och stack. Rita upp hur stacken, heapen och statiska data ser ut när programkörningen kommer till kommentaren "Här!".

5 of 6 Uppgift 6 (7 p) Det här är ett programavsnitt i ett C-liknande språk: i = 0; j = 10; n = 0; while (i < j) { if (i % 2 == 0) i = i + 2; else j = j - 1; n = (j - i - 1) / 2; Översätt ovanstående programavsnitt till var och en av följande tre typer av mellankod. a) ett abstrakt syntaxträd (genom att rita upp trädet!) b) postfixkod för en stackmaskin c) treadresskod Uppgift 7 (5 p) I en syntaxstyrd översättning (på engelska: "syntax-directed translation") associerar man grammatikregler med vad som ska hända. Den finns i två varianter: syntax-styrd definition (på engelska: "syntax-directed definition"), där produktionerna associeras med semantiska regler, som anger hur attribut ska få värden, och syntax-styrt översättningsschema (på engelska: "syntax-directed translation scheme"), där man stoppar in semantiska aktioner. a) Skriv en grammatikregel för while-satsen i C. b) Välj en form av mellankod (bland dem från uppgift 6 ovan), och tala om vilken du valde. Skriv sedan en syntax-styrd definition eller ett syntaxstyrt översättningsschema (och tala om vilken du valde) för översättning av while-satsen till mellankod. Uppgift 8 (6 p) En intresserad (men ibland kanske något förvirrad) person ställer frågor om kompilatorer. Svara på frågorna! Det kan kanske behövas en del förklaringar för att reda ut missuppfattningar som personen har. a) Kompilatorn har ju faser som "scanning", "parsning" och så vidare. Varför finns det ingen fas i kompilatorn som heter "skräpsamling"? Skräpsamling är ju ett ändå ganska viktigt begrepp i modern programmering, och man vill slippa krångla med manuella free och delete.

6 of 6 b) Jag tycker att man borde sluta med kompilatorer och bara använda interpretatorer, för interpretatorer måste ju vara mycket snabbare. En kompilator översätter ju först källkoden, innan den kan köras, medan en interpretator börjar köra programmet direkt! c) Bison säger att jag har en massa "shift/reduce-konflikter" här i min grammatik. Vad är det för nåt? Vad beror det på? Är det farligt?