Kompilatorer och interpretatorer

Relevanta dokument
Kompilatorer och interpretatorer

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

Tentamen i. för D1 m fl, även distanskursen. lördag 28 maj 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. Programmering i språket C

Tentamen i Programmering grundkurs och Programmering C

Tentamen i Programmering grundkurs och Programmering C

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

Tentamen i Programmering grundkurs och Programmering C

Tentamen i Programmering grundkurs och Programmering C

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

Databasteknik för D1, SDU1 m fl

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

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

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

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

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

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

Tentamen *:58/ID100V Programmering i C Exempel 3

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

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

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

PDA-applikationer med.net

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

Inlämningsuppgift MiniPlotter

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

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

Föreläsning 4. Val, boolska värden, läsbarhet, osv

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

Tentamen i Grundläggande programmering STS, åk

Programmering i C, 7,5 hp

Tentamen Datastrukturer för D2 DAT 035

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

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

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN1 - Teoretisk tentamen Tid: Torsdagen den 20 oktober 2011,

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

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

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

Lösningar till uppgifterna sätts ut på kurssidan och på WebCT (Gamla Tentor) i dag kl 19. Tentamen i Programmering C, 5p, Distans, övriga,

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

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

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Tentamen ges för: Tentamensdatum: Tid:

FÖRSLAG TILL LÖSNING AV Tentamen i Objektorienterad programmering C++ I

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

Operativsystem (IS1350) :00-12:00

OOP Tentamen

Belopp Belopp > procent

2 Pekare och dynamiska variabler.

Tentamen i Algoritmer & Datastrukturer i Java

Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00

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

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

Introduktion C-programmering

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

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

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,

Repetition C-programmering

Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp :00-18:00

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

Tentamen i Programmering

TENTAMEN 8 jan 2013 Tid: Kurs: Matematik 1 HF1901 (6H2901) 7.5p Lärare:Armin Halilovic

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

Pekare och arrayer. Indexering och avreferering

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

DAI2 (TIDAL) + I2 (TKIEK)

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

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

OOP Tentamen

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

OOP Tenta

TENTAMEN. Luleå tekniska universitet

Lösningar till uppgifterna sätts ut på kurssidan på nätet idag kl Omtentamen i Programmering C, 5p, A1, D1, E1, Fri, Pr1, Te/Ek1,

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

Tentamen, EDAA20/EDA501 Programmering

Komplettering: 9 poäng på tentamen ger rätt till komplettering (betyg Fx).

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Lämna in ifylld kursvärdering tillsammans med tentamen! Lösningarna till tentamensuppgifterna sätts ut på kurssidan på nätet i dag kl 13.

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 9 juni 2016, kl 14 18

Programmering, grundkurs, 8.0 hp HI1024, TEN1. Fredagen den 2 mars 2012

KTH, NADA, Vahid Mosavat. 1. Flervalsfrågor (5p)

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

Switch, Array (fält) switch break, continue, goto (scary) Sammansatta tilldelningar Kommentarer Array Sortering

*Pekarvärden *Pekarvariabler & *

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

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

Transkript:

1 of 8 Örebro universitet Institutionen för naturvetenskap och teknik Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se) Tentamen i Kompilatorer och interpretatorer för Dataingenjörsprogrammet m fl fredag 8 januari 2016 Gäller som tentamen för: DT3030 Datateknik C, Kompilatorer och interpretatorer, provkod 0100 Hjälpmedel: Inga hjälpmedel. Poängkrav: Maximal poäng är 36. För godkänt betyg krävs totalt minst 21 poäng, varav minst 8 poäng på uppgift 1. Resultat: Återlämning av tentor: Examinator och jourhavande: Meddelas på kursens hemsida eller via e-post senast fredag 29 januari 2016. Efter att resultatet meddelats kan tentorna hämtas på universitetets centrala tentamensutlämning. 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 8 Formelsamling 1. Eliminering av vänsterrekursion En vänsterrekursiv grammatik kan skrivas om så att den inte är vänsterrekursiv. Antag att en regel (eller, korrektare uttryckt, två produktioner), i grammatiken ser ut så här: A -> A x y A är en icke-terminal, men x och y står för godtyckliga konstruktioner som består av terminaler och icke-terminaler. Regeln ersätts av följande två regler (eller, korrektare uttryckt, tre produktioner), som beskriver samma språk men som inte är vänsterrekursiva: A -> y R R -> x R empty 2. Vänsterfaktorisering Antag att grammatiken innehåller dessa två produktioner: A -> x y x z A är en icke-terminal, men x, y och z står för godtyckliga konstruktioner som består av terminaler och icke-terminaler. Skriv om till dessa tre produktioner: A -> x R R -> y z

3 of 8 Uppgift 1 (10 p) En kompilators arbete brukar delas in i ett antal faser. Ange vilka det är, och förklara kort vad varje fas gör. Vad är in- och utdata från respektive fas? Uppgift 2 (6 p) Det här är ett programavsnitt i ett C-liknande språk: a = 0; b = 14; if (a == c) { while (a!= d) { a = c - d - 2; c = c + 1; d = 4; else { c = c * 2 + 1; d = 3; Översätt ovanstående programavsnitt till två av följande tre typer av mellankod. a) ett syntaxträd, även kallat abstrakt syntaxträd (genom att rita upp trädet!) b) postfixkod för en stackmaskin c) treadresskod Observera: Det finns tre deluppgifter i uppgiften ovan. Välj ut och besvara (högst) två av dessa. (Skulle du svara på alla tre, räknas den med högst poäng bort.)

4 of 8 Uppgift 3 (4 p) Här är ett C-program. Ett programs adressrymd kan delas upp i fyra delar: programkod och konstanter, statiska data, heap och stack. Rita upp hur stacken (med aktiveringsposter), heapen och statiska data ser ut, med innehåll, när programkörningen första gången kommer till utskriften med printf. #include <stdlib.h> #include <stdio.h> int a = 10, b = 20; int g(int a) { int z; int *p; if (a == 0) return 1000; z = a - 1; p = malloc(sizeof(int)); *p = 2000; printf("z = %d\n", z); z = g(z); return z; int f(int x, int y) { int z; int *p; x = x + y; z = 100; p = malloc(sizeof(int)); *p = 200; a = g(x); return a; int main(void) { int a, c; a = 1; b = 2; c = 3; a = f(a, b); return 0;

5 of 8 Uppgift 4 (5 p) En hälsning kan, antar vi, vara antingen "hej" eller "hej på dig". Här är en grammatik för hälsningar: a) hälsning -> hej hej på dig Här är ett utdrag ur en prediktiv recursive-descent-parser, skriven i C, för hälsningar: void halsning() { if (lookahead == HEJ) { match(hej); else if (lookahead == HEJ) { match(hej); match(pa); match(dig); else { error(); Det finns ett problem med den parsern. Förklara vad problemet är, och hur man kan lösa det. b) Här är ett utdrag ur en Bison-fil för att skapa en parser för samma hälsningar som ovan: halsning : HEJ HEJ PA DIG ; Finns samma problem här som med recursive-descent-parsern ovan? Varför, eller varför inte?

6 of 8 Scenario till de övriga uppgifterna Du hittar en prediktiv recursive-descent-parser, skriven i C, som har källkoden nedan. #include <stdlib.h> #include <stdio.h> #include "tokenkoder.h" // Ovanstående ger tokenkoderna: // STARTA PA GA METER I RIKTNING TAL TILL KLART extern int scan(); int lookahead; void error() { printf("det har tyvärr uppstått ett fel.\n"); exit(exit_failure); void match(int expected) { if (lookahead!= expected) error(); else lookahead = scan(); void program(), startkommando(), gakommandon(), gakommando(), vart(); void program() { startkommando(); gakommandon(); match(klart); void startkommando() { match(starta); match(pa); match(tal); match(tal); void gakommandon() { if (lookahead == GA) { gakommando(); gakommandon(); else { /* tomt */ void gakommando() { match(ga); vart(); void vart() { if (lookahead == TAL) { match(tal); match(meter); match(i); match(riktning); match(tal);

7 of 8 else if (lookahead == TILL) { match(till); match(tal); match(tal); else if (lookahead == GA) { match(ga); match(ga); else if (lookahead == PA) { match(pa); else { error(); void parse() { lookahead = scan(); program(); printf("ok.\n"); int main() { printf("mata in inmatningen.\n"); printf("avsluta med \"klart\" och EOF.\n"); parse(); /************Inte med!*************/ // Behövs för Lex int yywrap() { return 1; Du hittar också en scannerspecifikation för Flex, som hör till parsern ovan, och som ser ut enligt nedan: %{ % #include "tokenkoder.h" %% [\n\t ] { /* Ignorera whitespace */ "starta" { return STARTA; "på" { return PA; "gå" { return GA; "meter" { return METER; "i" { return I; "riktning" { return RIKTNING; "till" { return TILL; "klart" { return KLART; [0-9]+(\.[0-9]+)? { return TAL;. { fprintf(stderr, "Ignorerar felaktigt tecken: '%c'\n", *yytext %% int scan() {

8 of 8 return yylex(); Uppgift 5 (4 p) Ange grammatiken för det språk som parsern i scenariot förstår. Uppgift 6 (4 p) Ange en tillåten inmatning för språket som parsern i scenariot förstår. Försök göra ett exempel som tydligt visar hur språket ser ut. Uppgift 7 (3 p) Ange en tillåten inmatning för språket som parsern i scenariot förstår. Det kan vara samma inmatning som i uppgiften ovan, eller en mycket enklare. Rita sedan upp parse-trädet (även kallat konkret syntaxträd) för inmatningen.