Grammatik
Objektorienterad modellering och diskreta strukturer / design
Regulj¨ara uttryck klarar inte av att beskriva m¨angden av aritmetiska uttryck.
Grammatik Lennart Andersson Om vi till˚ ater att man s¨atter namn p˚ a regulj¨ara uttryck och anv¨ander dessa rekursivt kan vi beskriva spr˚ ak med mer komplicerad struktur.
Reviderad 2010–10–07
2010
OMD 2010
F12-1
Grammatik f¨or aritmetiska uttryck
OMD 2010
F12-2
BNF-grammatik
Backus–Naur-form I
Ett uttryck best˚ ar av en eller flera termer separerade av enkla plus- eller minus-tecken.
I
En term best˚ ar i sin tur av en eller flera faktorer separerade av enkla multiplikations- eller divisions- tecken.
I
En faktor ¨ar ett tal, en variabel eller ett uttryck inom parenteser.
OMD 2010
F12-3
expr ::= term (addop term)* term ::= factor (mulop factor)* factor ::= NUMBER | NAME | ’(’ expr ’)’ addop ::= ’+’ | ’-’ mulop ::= ’*’ | ’/’
OMD 2010
F12-4
Begrepp
Som i Algol 60 Report
syntaxsymboler, M N = {expr, term, factor, addop, mulop} M
::= ( )* ::= ( )* ::= NUMBER | NAME | ( ) ::= + | ::= * | /
slutsymboler, Σ = {+, -, *, /, (, ), NUMBER, NAME} produktioner, R = {expr ::= term (addop term)∗, . . . } M
startsymbol, S = expr
M
G = (N, Σ, R, S)
OMD 2010
F12-5
OMD 2010
F12-6
L[G ]
H¨arledning
expr ⇒ term addop term ⇒ factor addop term ⇒ NUMBER addop term ⇒ NUMBER addop term ⇒ NUMBER + term ⇒ NUMBER + factor ⇒ NUMBER + NAME
M
G = (N, Σ, R, S)
Definition M
expr
OMD 2010
⇒∗
L[G ] = {w ∈ Σ∗ | S ⇒∗ w }
NUMBER + NAME
F12-7
OMD 2010
F12-8
En h¨arledning
En annan h¨arledning expr
::= expr "+" expr
expr
::= expr "+" expr
expr
::= expr "*" expr
expr
::= expr "*" expr
expr
::= INT
expr
::= INT
H¨arledning av INT + INT * INT. expr => expr + expr => expr + expr * expr => INT + expr * expr => INT + INT * expr => INT + INT * INT
OMD 2010
H¨arledningstr¨ad
/ expr | INT
expr | +
\
/ expr | INT
expr | \ * expr | INT F12-9
Tvetydig grammatik
H¨arledning av INT + INT * INT. expr => expr * expr => expr + expr * expr => INT + expr * expr => INT + INT * expr => INT + INT * INT
H¨arledningstr¨ad expr | \ expr * expr / | \ | expr + expr INT | | INT INT
OMD 2010
/
F12-10
Syntaxanalys av aritmetiska uttryck
En grammatik ¨ar tvetydig om det finns mer ¨an ett h¨arledningstr¨ad f¨or n˚ agon str¨ang i spr˚ aket.
Om en grammatik ¨ar tvetydig m˚ aste man f¨ ors¨ oka hitta en grammatik som inte ¨ar det och som genererar samma spr˚ ak. I det aktuella fallet vill man ha en grammatik som respekterar g¨angse precedens f¨ or operatorerna.
OMD 2010
F12-11
expr ::= term (addop term)* term ::= factor (mulop factor)* factor ::= ID | INT | ’(’ expr ’)’ addop ::= ’+’ | ’-’ mulop ::= ’*’ | ’/’
OMD 2010
F12-12
Syntaxanalys av en faktor
Syntaxanalys av en term
factor ::= ID | INT | ’(’ expr ’)’
term ::= factor (mulop factor)*
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 I
Lexikalanalys - Regulj¨ara uttryck och automater
I
Syntaxanalys - Recursive descent och LR-parsing
I
Semantisk analys - Namn- och typkontroll
I
Kodgenerering
I
Aspektorienterad programmering -
I
Vertyg: javacc, jastadd, ddd
I
Projekt - Bygg en egen kompilator
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; } OMD 2010 } return result; Laboration 4 }
expr primary term factor
::= ::= ::= ::=
F12-14
primary (’->’ primary)? term (’|’ term)* factor (’&’ factor)* ID | ’!’ factor | ’(’ expr ’)’
? betyder upprepning ingen eller en g˚ ang. Kursen ges i VT1-2
OMD 2010
F12-15
OMD 2010
F12-16
Scanner ¨ar given
Ett skelett till Parser ¨ar givet public class Parser { private Scanner scanner; private int token;
public class Scanner { public static final int EOF = -1, VARIABLE = -2, IMPLIES = -3; public Scanner(String string) public int nextToken() public String token() }
OMD 2010
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()); } } F12-17
Laboration 4
OMD 2010
Laboration 4
public Expr build(String input) { return build(new StringReader(input)); }
private Expr term() { Expr result; result = factor(); return result; }
private Expr expr() { Expr result; result = primary(); return result; }
private Expr factor() { switch (token) { default: throw new ParserException( "Unexpected " + scanner.token()); } }
private Expr primary() { Expr result; result = term(); return result; } OMD 2010
F12-18
}
F12-19
OMD 2010
F12-20
Hj¨alpmedel p˚ a tentamen
Exempel p˚ a relationer
Till˚ atet I
Martin: Agile Software Development
I
Andersson: UML-syntax
I
Andersson: Diskreta strukturer
I
F¨ orel¨asningsbilder
I
Java snabbreferens (finns tillg¨anglig)
andra l¨arob¨ ocker
I I
ovningar med l¨ osningar ¨ projekt och laborationer med l¨ osningar
I
gamla tentor
I
...
OMD 2010
2 6≤ 1
Per ♥ Erik
friend(per, erik)
Ej till˚ atet I
1≤3
≤
∈
⇒ F12-21
Relation
3 ∈ {1, 3, 5}
expr ’+’ expr ⇒ INT ’+’ expr
OMD 2010
F12-22
Aktivitet
En bin¨ar relation har tv˚ a operander.
Om den f¨ orsta operanden tillh¨ or m¨angden A och den andra m¨angden B s˚ a ¨ar det en relation mellan A och B.
N¨ar vi diskuterar naturliga tal och skriver 3 ∈ {1, 3, 5} och 5 ∈ {1, 5} s˚ a ¨ar ∈ en relation mellan tv˚ a m¨angder; Vilka?
M¨angden av relationer mellan A och B betecknas A ↔ B. Om A = B s˚ a s¨ager vi att det ¨ar en relation p˚ a A.
OMD 2010
F12-23
OMD 2010
F12-24
Example
Definition
Om vi har en m¨angd av fyra personer {per, erik, anna, eva} s˚ a kan det g¨alla att M friend = {(erik, anna), (anna, erik), (per, anna)}.
En bin¨ar relation mellan m¨angden A och m¨angden B ¨ar en delm¨angd av A × B.
OMD 2010
F12-25
OMD 2010
F12-26
Likhetsrelationen
M
= = {(x, x) | x ∈ A}
Definition M
x ρ y = (x, y ) ∈ ρ M
=A = {(x, x) | x ∈ A}
OMD 2010
F12-27
OMD 2010
F12-28
Aktivitet
Definition
Vad ¨ar det f¨ or fel p˚ a
M
≤ = {(x, y ) ∈ N × N | ∃z ∈ N . x + z = y }
M
≤ = {(x, y ) ∈ N × N | x ≤ y }
OMD 2010
F12-29
OMD 2010
F12-30
M¨angdoperationer p˚ a relationer
Eftersom relationer ¨ar m¨angder s˚ a kan vi anv¨anda relationer tillsammans med m¨angdoperationerna. ≤
<
OMD 2010
M
=
M
=
Definition L˚ at ρ vara en relation mellan A och B. M
< ∪ =
dom (ρ) = {x ∈ A | ∃y . (x, y ) ∈ ρ} M
ran (ρ) = {y ∈ B | ∃x . (x, y ) ∈ ρ}
≤ − =
F12-31
OMD 2010
F12-32
Example
Ibland definierar man bilden av x under relationen ρ, x ρ, samt argumentm¨angden till y under ρ, ρ y M
Med friend = {(erik, anna), (anna, erik), (per, anna)} s˚ a ¨ar dom (friend) = {per, erik, anna}
Definition L˚ at ρ vara en relation mellan A och B med x ∈ A och y ∈ B. M
x ρ = {y ∈ B | x ρ y }
ran (friend) = {erik, anna}
OMD 2010
M
ρ y = {x ∈ A | x ρ y }
F12-33
Aktivitet
OMD 2010
F12-34
Om equals i Object The equals method implements an equivalence relation on non-null object references:
Finns det n˚ agot enkelt s¨att att beskriva m¨angden av alla relationer mellan A och B med hj¨alp av v˚ ara m¨angdoperationer?
I
It is reflexive: for any non-null reference value x, x.equals(x) should return true.
I
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.
I
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.
I
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.
I
For any non-null reference value x, x.equals(null) should return false.
M
A↔B =
OMD 2010
F12-35
OMD 2010
F12-36
Egenskaper
Definition
Definition
L˚ at ρ1 vara en relation mellan A och B och ρ2 en relation mellan B och C . Sammans¨attningen av ρ1 och ρ2 ¨ar
L˚ at ρ vara en relation p˚ a A. I I I I
ρ ¨ar reflexiv om x ρ x f¨ or alla x ∈ A ρ ¨ar symmetrisk om x ρ y → x ρ y f¨ or alla x, y ∈ A
M
ρ1 ◦ ρ2 = {(x, z) ∈ A × C | ∃y ∈ B . x ρ y ∧ y ρ z}
ρ ¨ar transitiv om x ρ y ∧ y ρ z → x ρ z f¨ or alla x, y , z ∈ A ρ ¨ar antisymmetrisk om x ρ y ∧ y ρ x → x = y f¨ or alla x, y ∈ A
OMD 2010
F12-37
OMD 2010
F12-38
Aktivitet
Vad betyder <2 p˚ a m¨angden N?
Definition L˚ at ρ vara en relation mellan A och B. Inversen till ρ ¨ar M
ρ−1 = {(y , x) ∈ B × A | x ρ y } L˚ at cousin(X , Y ) betyda att X ¨ar kusin till Y . Betyder cousin2 samma sak som n¨astkusin (trem¨anning)?
OMD 2010
F12-39
OMD 2010
F12-40
Definition
Definition
L˚ at ρ vara en relation p˚ a A. Vi definierar ρn d¨ar n ∈ N med
L˚ at ρ vara en relation mellan A och B. Motsatsen till ρ ¨ar
=
n+1
M
ρ
OMD 2010
F12-41
M
ρ0
M
ρ = A×A−ρ
=
Definition Det transitiva h¨oljet till ρ ¨ar
OMD 2010
M
ρn+1
=
M
M
= ρ ◦ ρn ,
n∈N
F12-42
L˚ at ρ vara en relation p˚ a A. Vi definierar ρn d¨ar n ∈ N med =
ρ ◦ ρn ,
OMD 2010
Definition ρ0
=
ρ? =
n∈N
∞ [
ρi
i=0
F12-43
OMD 2010
F12-44
Funktioner
( F, not(b) = T,
Example
om b = T om b = F
M
f (x) = x + 1 M
sqr (y ) = y 2 ( x, om x ≥ 0 M abs(x) = −x, om x < 0
OMD 2010
M
not = {(F, T), (T, F)}
F12-45
OMD 2010
F12-46
OMD 2010
F12-48
Definition f ¨ar en funktion fr˚ an A till B om och endast om f ⊆ A × B och (a1 , b1 ), (a1 , b2 ) ∈ f → (b1 = b2 ) M
A → B = {f ⊆ A × B | (a1 , b1 ), (a1 , b2 ) ∈ f → (b1 = b2 )}
OMD 2010
F12-47
Dom¨an, kodom¨an och sammans¨attning
dom och ran definieras som f¨ or relationer
sammans¨attning definieras som f¨ or relationer; sammans¨attningen av tv˚ a funktioner ¨ar en funktion
unionen av tv˚ a funktioner ¨ar oftast inte en funktion. Varf¨ or?
OMD 2010
F12-49