FACIT TILL OMTENTAMEN I PROGRAMSPRÅK -- DVG C01 140109 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 AP: An expression, which can be a value or a variable name, used as an argument in a call to a procedure/function/method. The actuall parameter is bound to the formal parameter att time of call. The binding is determined by the parameter passing semantics. FP: A name, usually typed, used in the body of the procedure/function/method for symbolic manipulation. An actuall parameter is bound to the formal parameter att time of call. The binding is determined by the parameter passing semantics (b) Vad är ett program? program: A program is a sequence of instructions for a machine (½) better - A program is a description of values, properties, methods, problems and solutions. (A Model!) The role of a machine is to speed up the manipulation and evaluation of these descriptions DFR 140109 PS omtentamen FACIT Sidan 1 av 13
(c) Ge en definition av (i) lexeme, (ii) sträng samt (iii) mönster (pattern). Vad är skillnaden de emellan? sträng (string) A finite sequence of characters drawn from some alphabet Σ lexem (lexeme) a sub-string (of a string representing a sentence in a given grammar) of symbols corresponding to a regular expression e.g. "<", "<=", "=", "!=", ">=", ">" and which can be categorised as a token. mönster (pattern) a string used to find a lexeme (substring) in the source code (input string) either by use of regular expressions (where a pattern can be a string literal or a regular expression) or by extracting lexemes from the source code and comparing the lexeme with string literals (patterns) in a table. The usual major difference is that the token ID may have an infinity of lexemes. This aspect is usually solved by defining an ID as beginning with a letter and then any combination of letters and numbers (sometimes also symbols such as underscore). This becomes a regular expression. (d) Vad är förhållandet mellan lexemer och tokens? A lexeme is a substring of the input program text and represents an instance of a class of lexemes which correspond to a token. The function of the lexer is to convert lexemes to tokens for the parser. In most cases, the class of lexemes will contain only 1 pattern e.g. program for the token program. In the case of the token ID, there are a potentially infinite number of lexemes so that the pattern must be specified using for e.g. regular expressions [A..Za..z][A..Za..z0..9]* i.e. alphanumeric strings beginning with a letter. (e) Hur definierar man skillnaden mellan lokala och icke-lokala omgivningar? Lexical (static) semantics, the non-local environment is the next surrounding environment defined in the program text Dynamic semantics the non-local environment is defined as being the environment of the previous call in a call sequence. Totalt 5p DFR 140109 PS omtentamen FACIT Sidan 2 av 13
2. BNF-definitioner Titta noggrant på grammatiken i bilaga A. Utöka denna BNF-definition för att hantera funktioner. Ange alla antagande. 5p [function def list] ::= e [function def] [function def list] [function def] [function def] ::= [function header] [var part] [stat part] [function header] ::= function id ( [parameter list] ) : [ type] ; [parameter list] [param dec list] [param dec] ::= e [param dec list] ::= [param dec] [param dec list], [param dec] ::= { var } [id list] : [type] Now add the [function def list] into the grammar [program] ::= [prog header] [var part] [function def list] [stat part] NB it is also an idea to update [operand] [operand] ::= id number [function call] [function call] ::= id ( [actual param list] ) [actual param list] ::= e [expression list] [expression list] ::= [expr] [expression list], [expr] By analogy with a program The parameter list may be empty (design decision) This is also similar to a [var dec list] except that it is separated by a comma and not terminated by a semicolon The var part is optional here I use EBNF [param dec] ::= var [id list] : [type] [id list] : [type] Would be the alternative DONE! DFR 140109 PS omtentamen FACIT Sidan 3 av 13
3. Parser En parser delas upp i 2 komponenter (i) den lexikaliska analysatorn och (ii) den syntaktiska analysatorn. Varför gör man en sådan uppdelning. Vilka uppgifter har dessa 2 komponenter? Använd gärna konkreta exempel i ditt svar. Svar ingående. 5p Example: program testok1(input, output); var A, B, C: integer; begin A := B + C * 2 end. Lexer Analyses the input program text (above) and identifies lexemes which fall into 3 categories 1. strings beginning with a letter ID names or Keywords 2. strings beginning with a digit numbers 3. all other strings For the above program the lexemes are:- "program testok1 ( input, output ) ; var A, B, C : integer ; begin A := B + C * 2 end. The ID name/keyword distinction may be solved by using a keyword table to identify keywords if the lexeme is not found in the table then the lexeme is considered an ID The lexer returns a token stream to the parser (on demand). For the above program these tokens will be:- PROGRAM ID LP INPUT COMMA OUTPUT RP SCOLON VAR ID COMMA ID COMMA ID COLON INTEGER SCOLON BEGIN ID ASSIGN ID PLUS ID TIMES NUM END DOT In addition, the lexer will remove white space. Each lexeme is held in a buffer for use by the parser which for example in the case of Ids may load DFR 140109 PS omtentamen FACIT Sidan 4 av 13
the corresponding ID (variable name) into the symbol table together with other attributes such as type, kind, size, address (offset). Parser The parser requests tokens from the lexer which it tries to match with terminal symbols in the grammar (See Appendix A). In a Recursive Descent Predictive Parser (RDPP), the nonterminal symbols in the grammar are implemented as procedure calls which trace out a virtual parse tree. For IDs, the parser will add these to the symbol table in the var_part phase. This allows the following semantoc checks to be made 1. doubly declared identifiers 2. undeclared identifiers in the stat_part phase 3. type checking in expressions and assignment The parser may also calculate the space required for the data objects in the program and enter this information in the symbol table. You could draw the parse tree for the above program. DFR 140109 PS omtentamen FACIT Sidan 5 av 13
4. Parameterhantering Ge detaljerade och konkreta programexempel för att illustrera hur värdeanrop ( call-byvalue ), referensanrop ( call-by-reference ) samt värderetur ( call-by-value-return ). I varje fall, förklara vilka mekanismer man använder sig av när man implementerar parameteröverförning ( parameter passing ) och rita bilder av stackrammar ( stack frames ) för att visa hur detta fungerar i ett exekveringssystem. See the revision notes (or previous facits) for examples of these marks for good illustrations and explanations. Points to note Discuss both f(ap) and f(2+2) i.e. an actual parameter which is an ID and one which is an expression What happened in call-by-reference with expressions? 5p DFR 140109 PS omtentamen FACIT Sidan 6 av 13
5. Parseträd expr -> term R1 R1 -> e '+' term R1 term -> factor R2 R2 -> e '*' factor R2 factor -> '(' expr ')' DIGIT (e = empty) Titta noggrant på grammatiken ovan. Rita parseträdet för uttrycket (2+2)*2. 5p DFR 140109 PS omtentamen FACIT Sidan 7 av 13
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 140109 PS omtentamen FACIT Sidan 8 av 13
6. Prolog Predikat Skriv predikatet append(+lista1,+lista2,-lista3), som tar Lista1 och Lista2 som inparametrar och skapar en ny lista, Lista3, där elementen från Lista1 placeras före elementen från Lista2 Exempel:?-append([1, 2, 3], [a, b], X). X = [1, 2, 3, a, b] (1 p) Laborationen I laboration 2 skulle du skriva en parser för ett enkelt Pascalprogram. Parsningsprogrammet kunde delas upp i tre delar: inläsning från fil, lexikalanalys och syntaxanalys. Lexikalanalysdelen fick en lista med fyra typer av lexem (= nyckelord, specialtecken, variabelnamn och heltal) från inläsningsdelen och den listan omvandlades ett lexem i taget till en lista av tokens för vidare behandling i syntaxanalysdelen. a) Skriv predikatet lexer som med hjälp av predikatet match gör om ett lexem i taget till motsvarande token. (1 p) b) Beskriv utförligt, gärna med hjälp av kod, hur match gör omvandlingen till tokens. Beskrivningen skall innehålla minst tre olika typer av lexem. (3 p) Totalt 5p DFR 140109 PS omtentamen FACIT Sidan 9 av 13
7. Objektorientering 5 poäng: A. Vilka följder får det att en klass är abstrakt inom objektorientering? Varför deklarerar man vissa klasser abstrakta? B. Givet följande program skrivet i Java. Vad skrivs ut när programmet utförs och varför? Utöver att ange rätt utskrift från programmet ska du alltså även redogöra för de mekanismer som gör att utskriften blir som den blir. class A { public void f() {System.out.println ("A.f");} } (1p) (1,5p) class B extends A { public void f() {System.out.println ("B.f");} } class Program { static void p(a o) {o.f();} public static void main(string[] args) { A a = new A(); B b = new B(); A ab = new B(); p(a); p(b); p(ab); } // main } // class Program C. Antag att följande klass Integer är definierad i Java med metoderna getvalue som läser av det aktuella värdet och setvalue som definierar ett nytt: class Integer { public Integer(int value) {setvalue(value);} public int getvalue() {return value;} public void setvalue(int newvalue) {value = newvalue;} //... more functions... private int value; }; // Integer (2,5p) Vi önskar definiera addition av heltal och utvidgar därför klassdefinionen av Integer med följande metoder och tillhörande implementationer: void add1(integer i) {setvalue(getvalue() + i.getvalue());} void add2(integer i) {this.setvalue(this.getvalue() + i.getvalue());} Integer add3(integer i) {return new Integer(value + i.getvalue());} Integer add4(integer i) {return new Integer(getValue() + i.getvalue());} void add5(integer i, Integer j) {j = new Integer(getValue() + i.getvalue());} Förklara och kommentera skillnaden i synsätt, utförande och resultat mellan följande par av funktioner: i. add1 och add2 ii. add1 och add4 iii. add3 och add4 iv. add4 och add5 DFR 140109 PS omtentamen FACIT Sidan 10 av 13
För vart och ett av de fem förslagen, kommentera om namnet add på funktionen (bortse från numret) är lämplig och föreslå ev ett bättre namn, allt enligt minsta förvåningens princip *. *) Minsta förvåningens princip (The Principle of Least Astonishment, POLA eller PLA) sager bl.a.: Speciellt ska en programmerare försöka tänka på vilket beteende som kommer att förvåna någon som använder sig av programmet minst, snarare än det beteende som verkar mest naturligt för någon som känner till programmets inre arbetssätt. Totalt 5p DFR 140109 PS omtentamen FACIT Sidan 11 av 13
8. Lisp Läs noggrant Lispkoden nedan. 1. Förklara hur procedurerna p och q fungerar. Vad är utskriften efter varje setf? Svar ingående och ange alla antagande. 4p 2. Om man skriver om (if (eql y (first (first x))) till (if (eql y (second (first x))) vad är skillnaden i utskriften? (defun p (x y z) (list (list 'x x) (list 'y y) (list 'z z) ) ) 1p (defun q (x y z) (if (eql y (first (first x))) (cons (list y z) (rest x)) (cons (first x) (q (rest x) y z)) ) ) (setf x (p 'x 'y 'z)) (setf x (q x 'x 'y)) (setf x (q x 'y 'z)) (setf x (q x 'z 'x)) (exit) Answers: Totalt 5p ((X X) (Y Y) (Z Z)) ((X Y) (Y Y) (Z Z)) ((X Y) (Y Z) (Z Z)) ((X Y) (Y Z) (Z X)) ((X X) (Y Y) (Z Z)) ((X Y) (Y Y) (Z Z)) ((Y Z) (Y Y) (Z Z)) ((Z X) (Y Y) (Z Z)) DFR 140109 PS omtentamen FACIT Sidan 12 av 13
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 140109 PS omtentamen FACIT Sidan 13 av 13