FACIT TILL OMTENTAMEN I PROGRAMSPRÅK DVG C01 150108 kl. 08:15-13:15 Ansvarig Lärare: Donald F. Ross Hjälpmedel: Bilaga A: BNF-definition Betygsgräns: Kurs: Max 60p, Med beröm godkänd 50p, Icke utan beröm godkänd 40p, Godkänd 30p (varav minimum 20p från tentan, 10p från labbarna Tenta: Max 40p, Med beröm godkänd 34p, Icke utan beröm godkänd 27p, Godkänd 20p Labbarna: Max 20p, Med beröm godkänd 18p, Icke utan beröm godkänd 14p, Godkänd 10p SKRIV TYDLIGT LÄS UPPGIFTERNA NOGGRANT 1. Ange kortfattade svar på följande uppgifter: (a Ge en definition av (i aktuell parameter samt (ii formell parameter. (b Vad är svansrekursion? I vilket sammanhang förekommer den? (c Vad används den statiska länken i en stackframe till? (d Ange för- och nackdelar till värdeanrop ( call-by-value jämfört med referensanrop ( call-by-reference (e Ange ett exempel av en Lisp programmingcliché. (f Vad är förhållendet mellan en programmeringparadigm och ett programspråk? (g Ange ett exempel av bindningar vid fyra olika tidspunkter i processen språkdesign till programexekvering (totalt 4 olika exempel. (h Vilka är de två absolut nödvändligaste flödeskontrollkonstructionerna ( flow-of-control constructions för att kunna skriva ett program. (i Vad händer under den lexikaliska analysfasen? (j Vilka aspekter av att programspråk skulle man ta hänsyn till när man vill snabbt sätta sig in i ett språk? (a Ge en definition av (i aktuell parameter samt (ii formell parameter. Totalt 5p - an actual parameter is an expression (this includes id! - a formar parameter is an identifier (b Vad är svansrekursion? I vilket sammanhang förekommer den? - when the last statement in a function is a recursive call to the function - e.g. id_list( { match(id; if (lookahead == ',' { match(','; id_list(; - auxiliary functions in Lisp DFR/AA 150108 PS omtentamen Sidan 1 av 16
(c Vad används den statiska länken i en stackframe till? - to point back to the lexically enclosing environment (d Ange för- och nackdelar till värdeanrop ( call-by-value jämfört med referensanrop ( call-by-reference - call-by-value +ve: conceptually cleaner no side effects -ve: for large structures / arrays, a copy must be made takes more space - call-by-reference +ve: saves space -ve: allows side effects (e Ange ett exempel av en Lisp programmingcliché. (defun book-author-writer (book author (if (eql 'author (first (first book (cons (list 'author author (rest book (cons (first book (book-author-writer (rest book author (f Vad är förhållendet mellan en programmeringparadigm och ett programspråk? - a paradigm - is more abstract - may be viewed as a way of thinking - is more priented towards design - a programming language - is an implementation (realisation of a paradigm - nowadays is an implementation of several paradigms - a programming language may be evaluated by the extent to which it implements one (or more paradign(s (g Ange ett exempel av bindningar vid fyra olika tidspunkter i processen språkdesign till programexekvering (totalt 4 olika exempel. Historical Boolean boung to a domain {True, False Program design time integer bound to a specific range (-x +x Compile time a data object name bound to a type e.g. x : integer Run-time a data object bound to a value e.g. x := 3; DFR/AA 150108 PS omtentamen Sidan 2 av 16
(h Vilka är de två absolut nödvändligaste flödeskontrollkonstructionerna ( flow-of-control constructions för att kunna skriva ett program. sequence goto L / if x goto L i.e. GOTO (conditional / unconditional (i Vad händer under den lexikaliska analysfasen? The source code is read in as a string of characters White space (spaces, tabs, newlines are removed The lexemes in the program are identified o User defined identifiers o Keywords in the language o Numbers o Special character sequences The corresponding token (class is identified for each lexeme The (lexeme, token pair is returned (usually to the Parser (j Vilka aspekter av att programspråk skulle man ta hänsyn till när man vill snabbt sätta sig in i ett språk? The type system basic types The data structures Primitive operations in the language (usually on the basic types Flow-of-control Code and data packaging (modules, packages, classes Scope, visibility and name spaces (environments DFR/AA 150108 PS omtentamen Sidan 3 av 16
2. Programmeringsspråk Titta noggrant på grammatiken i bilaga A. Förklara ingående hur man kan skriva en RDPP (Recursive Descent Predictive Parser utifrån grammatiken. 5p From the grammar G = (S, P, NT, T and production rules (P, the rules of thumb are o NTs procedure o Ts match and advance procedure If the productions have left recursive definitions, these must be re-written as equivalent right recursive definitions (explain how this is done For each production X ::= T1 T2 Tn the intersection of the first(ti sets must be empty Syntac & semantic errors: what are they and how are they handled? Marks for good points, examples and explanations. DFR/AA 150108 PS omtentamen Sidan 4 av 16
3. Felhantering och återhämting Diskutera det generella problemet med återsynkronisering och felåterhämtning i en parser. Titta på grammatiken nedan. I den Right Recursive Grammar skriv pseudokod till varje icke-terminal symbol (dvs line, expr, R1, term, R2 samt factor och visa hur och var man kan hantera syntaktiska fel. Finns det någon tumregel/några tumregler för att bestämma när och var man kan införa syntaxkontroll i denna grammatik? 3p Original Grammar! Right Recursive Grammar! line -> expr {;expr ; '\n'! line -> expr {;expr ; '\n'! expr -> expr + term term! expr -> term R1! R1 -> e '+' term R1! term -> term * factor factor! term -> factor R2! R2 -> e '*' factor R2! factor -> '(' expr '' DIGIT! factor -> '(' expr '' DIGIT!! (e = empty 2p Rules of Thumb Totalt 5p 1. If the rule consists of non-terminals only then no check can be made. (expr & term 2. If the rule contains an empty production then no check can be made. (R1 & R2 3. Only if the rule contains terminal symbols (and no empty symbol can syntax checks be performed. (line & factor See the examples below. void factor( { if (lookahead == '(' { match('('; expr(; if (lookahead == '' match(''; else error("*** '' EXPECTED *** (in procedure factor"; return; else if (lookahead == DIGIT { match(lookahead; return; else error("*** UNEXPECTED SYMBOL *** (in procedure factor"; printf("\n *** Skipping input symbol *** \n "; plookahead(; lookahead = yylex(; /* skip over symbol - no synch!!! */ DFR/AA 150108 PS omtentamen Sidan 5 av 16
void R2( { if (lookahead == '*' { match('*'; factor(; R2(; ; ; void term( { factor(; R2(; void R1( { if (lookahead == '+' { match('+'; term(; R1(; ; void expr( { term(; R1(; void line( { do { iserror = 0; expr(; plookahead(; if (lookahead == ';' match(';'; else error("*** ';' EXPECTED *** (in procedure line"; if (!iserror printf(" \n Parse Successful! \n"; else printf(" \n Parse Failed! \n"; while (lookahead!= '\n'; if (lookahead == '\n' match('\n'; else error("*** NEWLINE EXPECTED *** (in procedure line"; ; DFR/AA 150108 PS omtentamen Sidan 6 av 16
4. Parseträd expr term R1 R1 e '+' term R1 (e = empty term factor R2 R2 e '*' factor R2 factor '(' expr '' DIGIT Titta noggrant på grammatiken ovan. Rita parseträdet för uttrycket (2+2*2. 5p DFR/AA 150108 PS omtentamen Sidan 7 av 16
expr factor term R2 R1 e ( expr * factor R2 digit e term R1 2 factor R2 + term R1 digit e factor R2 e 2 digit e 2 ( 2 + 2 * 2 DFR/AA 150108 PS omtentamen Sidan 8 av 16
5. Parametrar Diskutera ingående hur parametrar hanteras vid exekverings-tid (engelska: run-time environment. Marks for good answers. See the revision notes on the web. 5p DFR/AA 150108 PS omtentamen Sidan 9 av 16
6. Lisp (defun make-book (title author class (list (list 'title title (list 'author author (list 'class class (defun book-author-writer (book author (if (eql 'author (first (first book (cons (list 'author author (rest book (cons (first book (book-author-writer (rest book author (defun book-class-add (book class ;; att skriva (setf book (make-book '(Common Lisp '(Guy Steele '(Computer Languages (book-author-writer book '(Guy L Steele (book-class-add book 'Lisp MAKE-BOOK BOOK-AUTHOR-WRITER BOOK-CLASS-ADD ((TITLE (COMMON LISP (AUTHOR (GUY STEELE (CLASS (COMPUTER LANGUAGES ((TITLE (COMMON LISP (AUTHOR (GUY L STEELE (CLASS (COMPUTER LANGUAGES ((TITLE (COMMON LISP (AUTHOR (GUY STEELE (CLASS (COMPUTER LANGUAGES LISP Bye. 1. Skriv Lisp-koden till functionen book-class-add. Ange alla antagande. 2p 2. Förklara stegvis och ingående hur din function book-class-add fungerar. 3p Totalt 5p DFR/AA 150108 PS omtentamen Sidan 10 av 16
NOTE: Book-author-writer replaces a value in the author element in the book object. Book-class-add adds an attribute to the class element in the book object. Book-author-writer is an example of a programming cliché The question is, whether book-author-writer can be adapted to produce book-class-add? (defun book-author-writer (book author (if (eql 'author (first (first book (cons (list 'author author (rest book (cons (first book (book-author-writer (rest book author Step 1: change the name above to give (defun book-class-add (book author (if (eql 'author (first (first book (cons (list 'author author (rest book (cons (first book (book-class-add (rest book author Step 2: change the category above from author to class to give (defun book-class-add (book class (if (eql 'class (first (first book (cons (list 'class class (rest book??? (cons (first book (book-class-add (rest book class Step 3: the line after the if now needs to be modified. What do we want to do? Answer: add another value in the class list lisp append! Note that the class list is the second element. What is required is (CLASS (COMPUTER LANGUAGES is changed to (CLASS (COMPUTER LANGUAGES LISP Step 4: look at the line (cons (list 'class class (rest book The ( cons is required as well as the (rest book part, which leaves the middle part to be substituted DFR/AA 150108 PS omtentamen Sidan 11 av 16
Step 5: think again what is require, working back from the answer (CLASS (COMPUTER LANGUAGES LISP First of this is the symbol CLASS and second is the list (COMPUTER LANGUAGES The addition is to made to second so we could start with (append (second (first book (list CLASS ;the value of CLASS is LISP --- recall that the second argument to append must be a list This will give the required result (COMPUTER LANGUAGES LISP The category (CLASS has then to be added to give the final result (CLASS (COMPUTER LANGUAGES LISP 1. one solution would be (list class (append (second (first book (list class 2. another would be (list (first (first book (append (second (first book (list class Since at this point we know that (first (first book is CLASS This gives the final solution for the function. (defun book-class-add (book class (if (eql 'class (first (first book (cons (list class (append (second (first book (list class (rest book (cons (first book (book-class-add (rest book class (defun book-class-add (book class (if (eql 'class (first (first book (cons (list class (append (second (first book (list class (rest book (cons (first book (book-class-add (rest book class DFR/AA 150108 PS omtentamen Sidan 12 av 16
7. Objektorientering (5p A. Vad betyder det att en klass är abstrakt? (0.5p B. Varför deklarerar man vissa klasser som abstrakta? (1.0p C. Vad innebär det att en medlemsvariabel är private? (0.5p D. Vad innebär det att en metod INTE är virtuell? (0.5p E. Givet följande program skrivet i Java. Vad skrivs ut när programmet körs och varför? Utöver att ange rätt utskrift från programmet så skall du även redovisa för de mekanismer som gör att utskriften blir som den blir. class Person { void print( { System.out.println("Person"; (2.5p class Teacher extends Person { void print( { System.out.println("Teacher"; public class Program { static void print(person person { person.print(; public static void main(string[] args { Person person = new Person(; Teacher teacher = new Teacher(; Person xenomorph = new Teacher(; print(person; print(teacher; print(xenomorph; DFR/AA 150108 PS omtentamen Sidan 13 av 16
A. Det går ej att skapa instanser/objekt av klassen. Klassen kan innehålla abstrakta metoder, men inte nödvändigtvis. Abstrakta klasser kan innehålla icke-abstrakta metoder. Abstrakta klasser används inte för att instansiera objekt utan som basklasser för arv. Man kan se en abstrakt klass som en mall från vilken man kan härleda fler utökade klasser via arv. B. Flera anledningar: 1. Man vill inte att klassen skall instansieras av någon anledning. Kan vara tex ett mattebibliotek med statiska/klass-metoder. Genom att göra klassen abstrakt så förhindrar man att onödiga objekt instansieras från klassen. 2. Den mer vanliga anledningen är att klassen innehåller minst en abstrakt metod(dvs en metod utanimplementering/kropp och då är klassen per automatik abstrakt. C. En medlemsvariabel som är private kan endast nås(läsas/modifieras av metoder inom den egna klassen. Alla metoder i utomstående klasser(inklusive subklasser har ej tillgång. D. Om en metod inte är virtuell så är dennas implementation/kropp konstant. Dvs dess implementation kan inte skrivas över/omdfefinieras av en ärvande klass. E. Följande kommer skrivas ut: Person Teacher Teacher Person är en basklass med en printmetod. Teacher är en härledd klass från Person som har en egen printmetod och därför skriver över/omdefinierar printmetoen. Klassen Program har också sin egen printmetod, men klassen program är inte inblandad i något arv. Program skapar tre stycken objekt. 1styck instans av klassen Person och två stycken instanser av klassen Teacher. Den andra instansen av klassen Teacher lagras i ett dataobjekt av typen Person. Detta är helt godkännt tack vara subtyp-polymorphism som säger att dataobjekt av typen Person kan lagra instanser av klassen Person och alla subtyper(härledda klasser av klassen Person vilket klassen Teacher är. När anropet till metoden print från metoden main sker så är det metoden print i samma klass som main(dvs Program som anropas. Denna metod förväntar sig ett objekt av typen Person, men tack vara subtyp-polymorphism så accepterar den även subtyper av Person. Metoden Program.print anropar i sin tur objektets egna printmetod. När ett objekt av klassen Person skickas till metoden Program.print så kommer metoden Person.print att anropas och "Person" skrivs ut. När ett objekt av klassen Teacher skickas till metoden Program.print så kommer metoden Teacher.print att anropas och "Teacher" skrivs ut. Detta gäller för bägge instanserna av klassen Teacher. Oavsett vad vi angett för datatyp när vi lagrade objektet så är fortfarande objektet en instans av klassen Teacher och kommer "agera" därefter DFR/AA 150108 PS omtentamen Sidan 14 av 16
8. Prolog 1. Skriv ett predikat, ersatt_alla(+inelem, +UtElem, +InLista, -UtLista, där alla förekomster av elementet InElem i listan InLista ersätts med elementet UtElem och returnerar listan Utlista. Predikatet måste skrivas så att inte falska lösningar kan erhållas när man trycker ; Exempel på körning:?- ersatt_alla(a, b, [a, c, a, d, a], L. L = [b, c, b, d, b] (2,5 p 2. Beskriv utförligt med egna ord och med kodexempel hur parserdelen i laborationen kontroller om tokenlistan är korrekt enligt grammatikreglerna. Beskriv också hur vissa av de givna grammatikreglerna måste modifieras för att koden skall fungera. (2,5 p Totalt 5p (1 ersatt_alla(e1, E2, [], []. /* Basfall 0,5 p */ ersatt_alla(e1, E2, [E1 R1], [E2 R2] :-!, ersatt_alla(e1, E2, R1, R2. /* Rekursivt fall 1 p */ ersatt_alla(e1, E2, [F R1], [F R2] :- E1 \= F, ersatt_alla(e1, E2, R1, R2. /* Rekursivt fall 1 p */ För undvikande av falska lösningar skall antingen cut (! användas i regel 2 eller villkoret i regel 3, annars 0,5 p avdrag. /* Totalt 2,5 p */ (2 Här kan man tänka sig stor variation i svaren. Lite kod av typen prog --> prog_header, var_part, stat_part. var_dec_list --> var_dec. var_dec_list --> var_dec, var_dec_list. /* Högerrekursion */ var --> 259. /* Terminal symbol */ bör finnas med. Dessutom ska koden kommenteras med egna ord. I samband med var_dec_list kan man kommentera vikten av högerrekursion som ju är den modifiering som krävs av grammatikregler för att koden skall fungera. Kommenterar man att skrivsättet med --> är ett förkortat skrivsätt för att slippa skriva ut 2 parametrar i varje predikat är det ett plus. /* Totalt 2,5 p */ DFR/AA 150108 PS omtentamen Sidan 15 av 16
Bilaga A - Grammatik: Pascallik språk 1. [prog] ::= [prog header] [var part] [stat part] 2. [prog header] ::= program id ( input, output ; 3. [var part] ::= var [var dec list] 4. [stat part] ::= begin [stat list] end. 5. [var dec list] ::= [var dec] [var dec list] [var dec] 6. [var dec] ::= [id list] : [type] ; 7. [stat list] ::= [stat] [stat list] ; [stat] 8. [stat] ::= [assign stat] 9. [assign stat] ::= id := [expr] 10. [expr] ::= [term] [R1] 11. [R1] ::= e + [term] [R1] 12. [term] ::= [factor] [R2] 13. [R2] ::= e * [factor] [R2] 14. [factor] ::= ( [expr] [operand] 15. [type] ::= integer 16. [id list] ::= id [id list], id 17. [operand] ::= id number DFR/AA 150108 PS omtentamen Sidan 16 av 16