HJEMMEEKSAMEN 2 INF3110/4110 HØSTEN 2003 - ADDENDUM - Spørsmål og svar ---------------------------------------------------------------------- Her følger noen endringer og tips i forhold til hjemmeeksamen 2. [Sist oppdatert: 19:22 14/11/2003] ------------ ENDRINGER ----------------------------------------------- Et par små endringer har blitt gjort på den utdelte koden i filen 'compiler.sml'. Endringene gjelder *kun* funksjonene under ProcBindings og VarBindings med tilhørende kommentarer. Det meste er skjønnhetsfeil (kommentarene er nå riktige og feilmeldingene litt mer presise), men en funksjon er lagt til, removeVarBindings(n), som fjerner de n siste variabelbindingene som er foretatt. Det er derfor anbefalt å laste ned en ny versjon eller bytte ut denne delen av koden, hvis det er behov for det. ------------ SKOPREGLER ---------------------------------------------- Skopet til en en prosedyredeklarasjon er fra deklarasjonsstedet og ut programmet. Dvs. at prosedyrer kan kalle på tidligere deklarerte prosedyrer, men ikke omvendt. Skopet til lokale variable er fra deklarasjonsstedet til første forekomst av end. Deklarasjon av lokale variable skygger for deklarasjon av globale variable på vanlig måte. ------------ OM INNLEVERINGEN ---------------------------------------- I tillegg til å levere oppgave 1 elektronisk, som en kjørbar(!) SML-fil, bør dere i den skriftlige versjonen legge til hvilke endringer dere har gjort i forhold til den utdelte koden. Ikke ta med all koden dere sitter igjen med til slutt, men kun endringer og tillegg. Dette er for å gjøre rettingen enklere. Generelt står dere ganske fritt til å gjøre endringer, også på den delen av koden som er utdelt, forutsatt at dere gjør rede for og kommenterer endringene på en god og oversiktlig måte. ------------ NOEN SPØRSMÅL OG SVAR ----------------------------------- ------------ SPØRSMÅL 1 ---------------------------------------------- Når jeg kompilerer følgende kode, så får jeg feilmelding. Hvorfor? 1 var a; 2 begin 3 ?a; 4 !a; 5 end ------------ SVAR 1 -------------------------------------------------- Linje 4 inneholder et semikolon for mye! En må slutte med en , som ikke slutter med en semikolon. Tenk på semikolon som noe som forteller parseren/kompilatoren at det kommer enda et eller en . Eksempel: - compile(scan "var a; begin ?a; !a; end") handle x => errorhandler x; ERROR when compiling: STATEMENT val it = [End] : token list Denne feilmeldingen forteller at feilen forekommer i STATEMENT-funksjonen og at argumentlisten har vært [End]. STATEMENT ble kalt fordi det var et semikolon etter forrige , så programmet forventer et nytt , men et slikt kan ikke ha 'End' som første token. ------------ SPØRSMÅL 2 ---------------------------------------------- Er det meningen at det skal gå an med indirekte rekursjon i språket L2? ------------ SVAR 2 -------------------------------------------------- Nei, det er ikke meningen. Det stod dessverre ingenting om skopreglene i oppgaveteksten, så det er nå lagt til noen kommentarer om dette. (Se under SKOPREGLER over.) Direkte rekursjon er derimot tillatt. ------------ SPØRSMÅL 3 ---------------------------------------------- I oppgave 4c gis det utrykk med tegnene '^' 'v' og et annet kryptisk tegn. Er disse grunnsymboler i grammatikken eller andre spesialtegn som er spesifikke for BNF-syntaksen? ------------ SVAR 3 -------------------------------------------------- De er grunnsymboler. (Gjetter dere hva de står for?) ------------ SPØRSMÅL 4 ---------------------------------------------- I oppgave 2 blir det ganske enorme tabeller for L2. ------------ SVAR 4 -------------------------------------------------- Hei, hei. Vær lur og ikke lag enorme tabeller (selv om du *kan* gjøre det); gi heller et godt argument, sammen med eksempler og forklaringer. Det viktige med denne (og andre) innleveringer er å vise at man forstår hva dette dreier seg om, ikke å ramse opp det ene eller det andre (det viser ikke nødvendigvis noen forståelse). ------------ SPØRSMÅL 5 ---------------------------------------------- Når jeg skal sette returpeker, tenkte jeg å bruke det som står i boka, nemlig "SET D[1], ip + 4". Hvordan kan jeg få tak i 'ip'? ------------ SVAR 5 -------------------------------------------------- HINT: Når en SIMPLESEM-instruksjon som "SET D[1], ip + 4" leses; hva er 'ip' da og hva vil 'ip + 4' være? Hvordan kan man få tak i verdien til 'ip'? ------------ SPØRSMÅL 6 ---------------------------------------------- IP'en er vel 0 under kompilering, og derfor kan vi ikke bruke funksjonen getIP(), hvordan skal vi klare å få tak i den IP'en som gjelder under kjøring? ------------ SVAR 6 -------------------------------------------------- Se forrige spørsmål/svar. Når man genererer kode, så må man ta høyde for hva som kan skje under kjøring. Tenk over hva som er statisk (som vi kan vite før kjøring) og hva som er dynamisk (som første får vite under kjøring) informasjon. Hvilke egenskaper har den IP'en som gjelder under kjøring? ------------ SPØRSMÅL 7 ---------------------------------------------- Har jeg forstått det riktig at det ikke er noe mulighet for å gi returverdier fra prosedyrer i L2? Hvordan vil isåfall en prosedyre som fact se ut? ------------ SVAR 7 -------------------------------------------------- Ja, det er riktig at prosedyrene ikke gir noen returverdi. 'fact' kan programmeres uten å bruke returverdier. (Se ukeoppgavene for uke 45.) ------------ SPØRSMÅL 8 ---------------------------------------------- Hva er terminaler og hva er ikke terminaler i de ulike grammatikkene? I oppgave 4b, linje 3 ("A -> ab"), er "a" og "b" begge terminaler, eller bare "ab"? ------------ SVAR 8 -------------------------------------------------- Her er både "a" og "b" terminaler/grunnsymboler. "ab" er sammensetningen av to grunnsymboler. I en produksjon som "A -> begin B" er det rimelig å tolke "begin" som et grunnsymbol. ------------ SPØRSMÅL 9 ---------------------------------------------- I koden til PROGRAM står kommentaren "(* CODE FOR PROCEDURES CAN GO HERE *)". Betyr det at koden skal inn *nøyaktig* her? ------------ SVAR 9 -------------------------------------------------- Nei, det er ikke nødvendigvis så enkelt at man bare kan ta ut denne kommentaren og skrive inn noen linjer akkurat her. Koden til PROGRAM må endres på, og det er en del av oppgaven å finne ut hvordan. ------------ SPØRSMÅL 10---------------------------------------------- Hva er vektingen av de ulike oppgavene? ------------ SVAR 10 ------------------------------------------------- Det er ikke endelig bestemt, men her er en tilnærming: Oppgave 1: rundt 8 poeng Oppgave 2: rundt 1 poeng Oppgave 3: rundt 3 poeng Oppgave 4: rundt 6 poeng Oppgave 5: rundt 2 poeng ------------ SPØRSMÅL 99 --- (Denne må dere finne ut av selv!) ------- Kommer du til å svare nei på dette spørsmålet?