Københavns Universitet Naturvidenskabelig Embedseksamen Oversættere / Datalogi 1E Skriftlig eksamen onsdag d. 26. januar 2005 Eksamenstiden er to timer. Opgavernes vægt i procent er angivet ved hver opgave. Den skriftlige eksamen i Oversættere er bestået, hvis minimum 50% af opgaven er besvaret tilfredsstillende, eller en proportionalt større del er løst delvist tilfredsstillende. Hver opgaves vægt i procent er angivet ved opgavens start. Ligeledes er de enkelte spørgsmåls andel i denne vægt angivet. Opgavesættet bruges sammen med eksamen i Arkitektur også som deleksamen i reeksamen i Datalogi 1E. I dette tilfælde bedømmes de to besvarelser samlet efter 13-skalaen. Alle de sædvanlige hjælpemidler må benyttes, herunder også lydløse elektroniske lommeregnere og PDA ere (f.eks. Palm Pilot), dog ikke hvis disse har trådløs netadgang eller telefoni. En almindelig bærbar PC vil ikke være tilstrækkelig lydløs p.g.a. blæser, harddisk og støjende tastatur. I tvivlstilfælde gælder eksamensvagtens afgørelse. Det er tilladt at bruge blyant til besvarelsen, såfremt denne er tydeligt læselig.
Skriftlig eksamen onsdag d. 26. januar 2005 i Oversættere side 1 af 4 Opgave 1: Regulære udtryk (17%) Som angivet i afsnit 2.10 i Basics of Compiler Design, er regulære sprog lukket under præfiks. Det betyder, at der til ethvert regulært udtryk s findes mindst et regulært udtryk t, der genererer alle præfikser af tegnfølger, som s genererer. Spørgsmål 1.1 (5%) Givet at s er det regulære udtryk ab c, find et regulært udtryk t, sådan at t genererer alle præfikser af tegnfølger, som s genererer. Spørgsmål 1.2 (12%) Man kan definere en funktion prefix fra regulære udtryk til regulære udtryk, sådan at når t = prefix(s), så genererer t alle præfikser af tegnfølger, som s genererer. prefix(ab c) vil f.eks. således være en løsning til spørgsmål 1.1. prefix(s) kan laves som en rekursiv funktion over strukturen af det regulære udtryk s. Herunder er vist en ukomplet definition af denne funktion. Gør definitionen færdig ved at skrive de manglende højresider til de to sidste nedenstående regler. s og t er regulære udtryk, mens a repræsenterer et vilkårligt alfabetsymbol. prefix(ε) = ε prefix(a) = a? prefix(s t) = prefix(s) prefix(t) prefix(st) = prefix(s ) = Opgave 2: Syntaksanalyse (33%) Vi betragter gramatikken G: Spørgsmål 2.1 (5%) 1 T T T 2 T \ T 3 T num Vis at G er tvetydig, ved at finde en tegnfølge med to forskellige syntakstræer. Vis træerne.
Skriftlig eksamen onsdag d. 26. januar 2005 i Oversættere side 2 af 4 Spørgsmål 2.2 (5%) Find FIRST (T ) og FOLLOW(T ). Spørgsmål 2.3 (7%) Herunder er vist en delvis konstruktion af en SLR tabel for G: Vi udvider med en startproduktion: og laver NFA er for produktionerne: 0 T A B 1 T T C D E \ 2 T F G H num 3 I J 0 T T NFA erne udvides med epsilonovergange: A C D G ε Derefter bruges delmængdekonstruktionen til at lave en DFA: num \ T 0 A, s2 s3 g1 1 B, D, s2 s3 g4 2 J 3 G, s2 s3 g5 4 D, E, s2 s3 g4 5 D, H, s2 s3 g4 Gør konstruktionen færdig ved at indsætte reduce- og acceptaktioner i tabellen. Du behøver ikke at gentage mængden af NFA tilstande i den færdige tabel.
Skriftlig eksamen onsdag d. 26. januar 2005 i Oversættere side 3 af 4 Spørgsmål 2.4 (8%) Da grammatikken er tvetydig, er der konflikter i tabellen. Brug følgende præcedensregler til at fjerne konflikterne: Sammenstilling (som i produktion 1) binder stærkere end \. Sammenstilling er venstreassociativ. Spørgsmål 2.5 (8%) I spørgsmål 2.4 eliminerede vi tvetydigheden ved at fjerne konflikter i SLR tabellen. Et alternativ er at omskrive grammatikken, så den bliver entydig. Vis en entydig grammatik for sproget med samme præcedensregler som i spørgsmål 2.4, og vis syntakstræet for den tegnfølge, som du i spørgsmål 2.1 brugte til at vise, at den oprindelige grammatik er tvetydig. Opgave 3: Bootstrapping (18%) Du har følgende komponenter: a) En maskine, der kan køre x86 maskinkode. b) En compiler fra C til x86 maskinkode skrevet i x86 maskinkode. c) En fortolker for CAML bytekode skrevet i C. d) En compiler fra MosML til CAML bytekode skrevet i CAML bytekode. Spørgsmål 3.1 (4%) Vis Bratmandiagrammer (T-diagrammer) for hvert af komponenterne. Spørgsmål 3.2 (14%) Vis med Bratmandiagrammer, hvordan man givet ovenstående komponenter kan køre et program skrevet i MosML.
Skriftlig eksamen onsdag d. 26. januar 2005 i Oversættere side 4 af 4 Opgave 4: Kodegenerering og registerallokering (32%) Vi udvider mellemkodesproget fra Basics of Compiler Design (Grammar 6.1) med følgende betingede tildelingsinstruktioner: Instruction IF id relop Atom THEN id := Atom Instruction IF id relop Atom THEN id := unop Atom Instruction IF id relop Atom THEN id := id binop Atom Semantikken er, at tildelingen kun udføres, hvis betingelsen er sand. Vi ser i de følgende spørgsmål specielt på disse to eksempler på de nye mellemkodeinstruktioner: 1: IF x y THEN z := v 2: IF x<y THEN z := v+w Spørgsmål 4.1 (9%) Vis hvordan de to ovenstående instruktioner kan oversættes til sekvenser af MIPS instruktioner. Brug notation som i figur 7.1 i Basics of Compiler Design og brug kun MIPS instruktioner, der er brugt i denne figur. Hvis du bruger ekstra registre til mellemresultater, så kald dem t 1, t 2, osv. Forsøg at lave instruktionssekvenserne så korte som muligt. Spørgsmål 4.2 (8%) Vi udvider MIPS instruktionssættet med en betinget tildelingsinstruktion MOVC r d, r s, r t, hvis semantik er at r d tildeles r t s værdi, hvis r s 0, og ellers bevares uændret. Lav ligesom i spørgsmål 4.3 MIPS instruktionssekvenser for de to mellemkodeinstruktioner, men brug nu den nye MIPS instruktion til at gøre instruktionssekvenserne hopfri. Spørgsmål 4.3 (8%) Vis gen og kill for de to instruktioner på samme måde som i figur 8.1 i Basics of Compiler Design. Spørgsmål 4.4 (7%) Definitionen af interference (definition 8.2 i Basics of Compiler Design) bør modificeres for at tage højde for betingede tildelingsinstruktioner. Vis den modificerede definition. Vink: Ændringen kan afhænge af svaret på spørgsmål 4.3.