Grammatik Objektorienterad modellering och diskreta strukturer / design Grammatik Reguljära uttryck klarar inte av att beskriva mängden av aritmetiska uttryck. Lennart Andersson Reviderad 2010 10 07 2010 Om vi tillåter att man sätter namn på reguljära uttryck och använder dessa rekursivt kan vi beskriva språk med mer komplicerad struktur. OMD 2010 F12-1 Grammatik för aritmetiska uttryck OMD 2010 F12-2 BNF-grammatik Backus Naur-form Ett uttryck består av en eller flera termer separerade av enkla plus- eller minus-tecken. En term består i sin tur av en eller flera faktorer separerade av enkla multiplikations- eller divisions- tecken. En faktor är ett tal, en variabel eller ett uttryck inom parenteser. expr ::= term (addop term)* term ::= factor (mulop factor)* factor ::= NUMBER NAME ( expr ) addop ::= + - mulop ::= * / OMD 2010 F12-3 OMD 2010 F12-4
Begrepp Som i Algol 60 Report syntaxsymboler, N = {expr, term, factor, addop, mulop slutsymboler, Σ = {+, -, *, /, (, ), NUMBER, NAME produktioner, R = {expr ::= term (addop term),... startsymbol, S = expr <expr> ::= <term> (<addop> <term>)* <term> ::= <factor> (<mulop> <factor>)* <factor> ::= NUMBER NAME ( <expr> ) <addop> ::= + - <mulop> ::= * / G = (N, Σ, R, S) OMD 2010 F12-5 Härledning L[G] OMD 2010 F12-6 expr term addop term factor addop term NUMBER addop term NUMBER addop term NUMBER + term NUMBER + factor NUMBER + NAME expr NUMBER + NAME L[G] G = (N, Σ, R, S) = {w Σ S w OMD 2010 F12-7 OMD 2010 F12-8
En härledning En annan härledning expr ::= expr "+" expr expr ::= expr "*" expr expr ::= INT expr ::= expr "+" expr expr ::= expr "*" expr expr ::= INT Härledning av INT + INT * INT. Härledningsträd Härledning av INT + INT * INT. Härledningsträd expr => expr + expr => expr expr + expr * expr => / \ INT + expr * expr => expr + expr INT + INT * expr => / \ INT + INT * INT INT expr * expr INT INT expr => expr * expr => expr expr + expr * expr => / \ INT + expr * expr => expr * expr INT + INT * expr => / \ INT + INT * INT expr + expr INT INT INT OMD 2010 F12-9 Tvetydig grammatik OMD 2010 F12-10 Syntaxanalys av aritmetiska uttryck En grammatik är tvetydig om det finns mer än ett härledningsträd för någon sträng i språket. Om en grammatik är tvetydig måste man försöka hitta en grammatik som inte är det och som genererar samma språk. I det aktuella fallet vill man ha en grammatik som respekterar gängse precedens för operatorerna. expr ::= term (addop term)* term ::= factor (mulop factor)* factor ::= ID INT ( expr ) addop ::= + - mulop ::= * / OMD 2010 F12-11 OMD 2010 F12-12
Syntaxanalys av en faktor factor ::= ID INT ( expr ) private Expr factor() { switch (token) { case Scanner.ID : String name = scanner.token(); token = scanner.nexttoken(); return new Variable(name); case Scanner.INT : String number = scanner.token(); token = scanner.nexttoken(); return Integer.parseInt(number); case ( : token = scanner.nexttoken(); Expr e = expr(); // Check that token== ) token = scanner.nexttoken(); return e; OMD 2010 F12-13 Kompilatorteknik Syntaxanalys av en term term ::= factor (mulop factor)* private Expr term() { Expr result, factor; result = factor(); while (token == * token == / ) { int op = token; token = scanner.nexttoken(); factor = factor(); switch (op) { case * : result = new Mul(result, factor); break; case / : result = new Div(result, factor); break; return result; OMD 2010 F12-14 Laboration 4 Lexikalanalys - Reguljära uttryck och automater Syntaxanalys - Recursive descent och LR-parsing Semantisk analys - Namn- och typkontroll Kodgenerering Aspektorienterad programmering - Vertyg: javacc, jastadd, ddd Projekt - Bygg en egen kompilator Kursen ges i VT1-2 expr ::= primary ( -> primary)? primary ::= term ( term)* term ::= factor ( & factor)* factor ::= ID! factor ( expr )? betyder upprepning ingen eller en gång. OMD 2010 F12-15 OMD 2010 F12-16
Scanner är given public class Scanner { public static final int EOF = -1, VARIABLE = -2, IMPLIES = -3; public Scanner(String string) public int nexttoken() public String token() Ett skelett till Parser är givet public class Parser { private Scanner scanner; private int token; public Expr build(reader reader) { scanner = new Scanner(reader); token = scanner.nexttoken(); Expr expr = expr(); if (token == Scanner.EOF) { return expr; else { throw new ParserException( "Trailing garbage after " + scanner.token()); OMD 2010 F12-17 Laboration 4 OMD 2010 F12-18 Laboration 4 public Expr build(string input) { return build(new StringReader(input)); private Expr expr() { Expr result; result = primary(); return result; private Expr primary() { Expr result; result = term(); return result; private Expr term() { Expr result; result = factor(); return result; private Expr factor() { switch (token) { default: throw new ParserException( "Unexpected " + scanner.token()); OMD 2010 F12-19 OMD 2010 F12-20
Hjälpmedel på tentamen Tillåtet Martin: Agile Software Development Andersson: UML-syntax Andersson: Diskreta strukturer Föreläsningsbilder Java snabbreferens (finns tillgänglig) Ej tillåtet andra läroböcker övningar med lösningar projekt och laborationer med lösningar gamla tentor... Exempel på relationer 1 3 2 1 Per Erik friend(per, erik) 3 {1, 3, 5 expr + expr INT + expr OMD 2010 F12-21 Relation OMD 2010 F12-22 Aktivitet En binär relation har två operander. Om den första operanden tillhör mängden A och den andra mängden B så är det en relation mellan A och B. När vi diskuterar naturliga tal och skriver 3 {1, 3, 5 och 5 {1, 5 så är en relation mellan två mängder; Vilka? Mängden av relationer mellan A och B betecknas A B. Om A = B så säger vi att det är en relation på A. OMD 2010 F12-23 OMD 2010 F12-24
En binär relation mellan mängden A och mängden B är en delmängd av A B. Example Om vi har en mängd av fyra personer {per, erik, anna, eva så kan det gälla att friend = {(erik, anna), (anna, erik), (per, anna). OMD 2010 F12-25 OMD 2010 F12-26 Likhetsrelationen = = {(x, x) x A x ρ y = (x, y) ρ = A = {(x, x) x A OMD 2010 F12-27 OMD 2010 F12-28
Aktivitet Vad är det för fel på = {(x, y) N N x y = {(x, y) N N z N. x + z = y OMD 2010 F12-29 OMD 2010 F12-30 Mängdoperationer på relationer Eftersom relationer är mängder så kan vi använda relationer tillsammans med mängdoperationerna. = < = Låt ρ vara en relation mellan A och B. dom (ρ) = {x A y. (x, y) ρ ran (ρ) = {y B x. (x, y) ρ < = = OMD 2010 F12-31 OMD 2010 F12-32
Example Med friend = {(erik, anna), (anna, erik), (per, anna) så är dom (friend) = {per, erik, anna ran (friend) = {erik, anna Ibland definierar man bilden av x under relationen ρ, x ρ, samt argumentmängden till y under ρ, ρ y Låt ρ vara en relation mellan A och B med x A och y B. x ρ = {y B x ρ y ρ y = {x A x ρ y OMD 2010 F12-33 Aktivitet Finns det något enkelt sätt att beskriva mängden av alla relationer mellan A och B med hjälp av våra mängdoperationer? A B = OMD 2010 F12-35 OMD 2010 F12-34 Om equals i Object The equals method implements an equivalence relation on non-null object references: It is reflexive: for any non-null reference value x, x.equals(x) should return true. It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true. It is transitive: for any non-null reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true. It is consistent: for any non-null reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified. For any non-null reference value x, x.equals(null) should return false. OMD 2010 F12-36
Egenskaper Låt ρ vara en relation på A. ρ är reflexiv om x ρ x för alla x A ρ är symmetrisk om x ρ y x ρ y för alla x, y A ρ är transitiv om x ρ y y ρ z x ρ z för alla x, y, z A ρ är antisymmetrisk om x ρ y y ρ x x = y för alla x, y A Låt ρ 1 vara en relation mellan A och B och ρ 2 en relation mellan B och C. Sammansättningen av ρ 1 och ρ 2 är ρ 1 ρ 2 = {(x, z) A C y B. x ρ y y ρ z OMD 2010 F12-37 OMD 2010 F12-38 Aktivitet Vad betyder < 2 på mängden N? Låt ρ vara en relation mellan A och B. Inversen till ρ är ρ 1 = {(y, x) B A x ρ y Låt cousin(x, Y ) betyda att X är kusin till Y. Betyder cousin 2 samma sak som nästkusin (tremänning)? OMD 2010 F12-39 OMD 2010 F12-40
Låt ρ vara en relation mellan A och B. Motsatsen till ρ är ρ = A A ρ Låt ρ vara en relation på A. Vi definierar ρ n där n N med ρ 0 = = ρ n+1 = ρ ρ n, n N OMD 2010 F12-41 OMD 2010 F12-42 Låt ρ vara en relation på A. Vi definierar ρ n där n N med ρ 0 = = ρ n+1 = ρ ρ n, n N Det transitiva höljet till ρ är ρ = i=0 ρ i OMD 2010 F12-43 OMD 2010 F12-44
Funktioner Example not(b) = { F, om b = T T, om b = F f (x) = x + 1 sqr(y) = y 2 { abs(x) = x, om x 0 x, om x < 0 not = {(F, T), (T, F) OMD 2010 F12-45 OMD 2010 F12-46 f är en funktion från A till B om och endast om f A B och (a 1, b 1 ), (a 1, b 2 ) f (b 1 = b 2 ) A B = {f A B (a 1, b 1 ), (a 1, b 2 ) f (b 1 = b 2 ) OMD 2010 F12-47 OMD 2010 F12-48
Domän, kodomän och sammansättning dom och ran definieras som för relationer sammansättning definieras som för relationer; sammansättningen av två funktioner är en funktion unionen av två funktioner är oftast inte en funktion. Varför? OMD 2010 F12-49