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?