automat med stack kontextfri grammatik …...automat med stack kontextfri grammatik härledning och...
TRANSCRIPT
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Senast
• Ändliga automater• Reguljära uttryck• Regex, ej reguljära
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Idag
• Grammatiker• Lexikal analys• Rekursiv medåkning
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Ändliga automater med stack”Push-down Deterministic Finite Automaton”
Vid en tillståndsövergång:• Läs en literal x• Kan poppa ett element y från stacken• Kan pusha ett element z på stacken
Notation:• x , y/z: Läser x , poppar y , pushar z• x , ε/z: poppar inget, pushar z• x , y/ε: poppar y , pushar ej
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Ändliga automater med stack”Push-down Deterministic Finite Automaton”
Vid en tillståndsövergång:• Läs en literal x• Kan poppa ett element y från stacken• Kan pusha ett element z på stacken
Notation:• x , y/z: Läser x , poppar y , pushar z• x , ε/z: poppar inget, pushar z• x , y/ε: poppar y , pushar ej
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Exempel på PDA
q0 q1
1, 0/ε
1, 0/ε
0, ε/0
• Q = {q0,q1},Qα = {q1}• Accepterar {0n1n}• ⇒ Strikt starkare än en DFA!
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Kontextfria grammatiker
• Definieras över terminaler
• Variabler används för att kombinera ihopterminaler och andra variabler.
• Ihopkombinering m.h.a produktionerEx: a är X eller Y , b är a eller Za.
• Notation: Alternering med lodrätt streck
a→ X |Yb → a|Za
• En variabel är startsymbol
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Kontextfria grammatiker
• Definieras över terminaler• Variabler används för att kombinera ihop
terminaler och andra variabler.
• Ihopkombinering m.h.a produktionerEx: a är X eller Y , b är a eller Za.
• Notation: Alternering med lodrätt streck
a→ X |Yb → a|Za
• En variabel är startsymbol
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Kontextfria grammatiker
• Definieras över terminaler• Variabler används för att kombinera ihop
terminaler och andra variabler.• Ihopkombinering m.h.a produktioner
Ex: a är X eller Y , b är a eller Za.
• Notation: Alternering med lodrätt streck
a→ X |Yb → a|Za
• En variabel är startsymbol
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Kontextfria grammatiker
• Definieras över terminaler• Variabler används för att kombinera ihop
terminaler och andra variabler.• Ihopkombinering m.h.a produktioner
Ex: a är X eller Y , b är a eller Za.• Notation: Alternering med lodrätt streck
a→ X |Yb → a|Za
• En variabel är startsymbol
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Kontextfria grammatiker
• Definieras över terminaler• Variabler används för att kombinera ihop
terminaler och andra variabler.• Ihopkombinering m.h.a produktioner
Ex: a är X eller Y , b är a eller Za.• Notation: Alternering med lodrätt streck
a→ X |Yb → a|Za
• En variabel är startsymbol
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Exempel: RGB-värden hexadecimaltSvart: 000000; rött: FF0000, mörkgrön: 009900,m.m.
Terminaler: {0,1, . . . ,9,A,B, . . . ,F}
Startsymbol: rgb
digit → 0|1|2|3|4|5|6|7|8|9|A|B|C|D|E |Fintensity → digit digit
rgb → intensity intensity intensity
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Exempel: RGB-värden hexadecimaltSvart: 000000; rött: FF0000, mörkgrön: 009900,m.m.
Terminaler: {0,1, . . . ,9,A,B, . . . ,F}
Startsymbol: rgb
digit → 0|1|2|3|4|5|6|7|8|9|A|B|C|D|E |Fintensity → digit digit
rgb → intensity intensity intensity
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Exempel: Icke-reguljärt språk
Binära strängar med “minne”: {0n1n : n ≥ 0}
Terminaler: {0,1}
Startsymbol: b
b → ε|0b1
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Exempel: Binära palindrom
Startsymbol: p
Terminaler: 0 och 1
p → ε|0|1|0p0|1p1
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Binära palindrom igen: BNFStartsymbol: p
Terminaler: 0 och 1
p → ε|0|1|0p0|1p1
Bättre notation med Backus-Naur form, BNF:
p ::= ε| 0| 1| 0 p 0| 1 p 1
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
BNF för programspråksdefinition
Skiss:stmnt ::= BEGIN stmnt_list END
| IF conditional THEN stmnt ELSE stmnt| assignment| procedurecall
stmnt_list ::= stmnt_list ’;’ stmnt| stmnt
assignment ::= lhs ’:=’ rhs
procedurecall ::= proc_name ’(’ params ’)’
. . . med mycket mera.
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Exempel: Newickträd
• T.ex. (mus, (apa, human));
• Enkel version av Newick• Det fuskas med semikolon: gör det valfritt• Terminaler: NAME, SEMI, COMMA, LP, RP
newick ::= tree semiColonsemiColon ::= SEMI
| εtree ::= NAME
| LP tree COMMA tree RP
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Exempel: Newickträd
• T.ex. (mus, (apa, human));
• Enkel version av Newick• Det fuskas med semikolon: gör det valfritt• Terminaler: NAME, SEMI, COMMA, LP, RP
newick ::= tree semiColon
semiColon ::= SEMI| ε
tree ::= NAME| LP tree COMMA tree RP
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Exempel: Newickträd
• T.ex. (mus, (apa, human));
• Enkel version av Newick• Det fuskas med semikolon: gör det valfritt• Terminaler: NAME, SEMI, COMMA, LP, RP
newick ::= tree semiColonsemiColon ::= SEMI
| ε
tree ::= NAME| LP tree COMMA tree RP
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Exempel: Newickträd
• T.ex. (mus, (apa, human));
• Enkel version av Newick• Det fuskas med semikolon: gör det valfritt• Terminaler: NAME, SEMI, COMMA, LP, RP
newick ::= tree semiColonsemiColon ::= SEMI
| εtree ::= NAME
| LP tree COMMA tree RP
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Härledningar
Beskriver hur produktioner har använts för att”skapa” en sträng.
• Exempel: Passar (mus, (apa, human)); in igrammatiken?
• Terminaler:LP NAME COMMA LP NAME COMMA NAME RP RP SEMI
• Härledning:newick⇒ tree SEMI
⇒ LP tree COMMA tree RP SEMI⇒ LP NAME COMMA tree RP SEMI⇒ LP NAME COMMA LP tree COMMA tree RP RP SEMI⇒ LP NAME COMMA LP NAME COMMA NAME RP RP SEMI
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Härledningar
Beskriver hur produktioner har använts för att”skapa” en sträng.
• Exempel: Passar (mus, (apa, human)); in igrammatiken?
• Terminaler:LP NAME COMMA LP NAME COMMA NAME RP RP SEMI
• Härledning:newick⇒ tree SEMI
⇒ LP tree COMMA tree RP SEMI⇒ LP NAME COMMA tree RP SEMI⇒ LP NAME COMMA LP tree COMMA tree RP RP SEMI⇒ LP NAME COMMA LP NAME COMMA NAME RP RP SEMI
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Härledningar
Beskriver hur produktioner har använts för att”skapa” en sträng.
• Exempel: Passar (mus, (apa, human)); in igrammatiken?
• Terminaler:LP NAME COMMA LP NAME COMMA NAME RP RP SEMI
• Härledning:newick⇒ tree SEMI
⇒ LP tree COMMA tree RP SEMI
⇒ LP NAME COMMA tree RP SEMI⇒ LP NAME COMMA LP tree COMMA tree RP RP SEMI⇒ LP NAME COMMA LP NAME COMMA NAME RP RP SEMI
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Härledningar
Beskriver hur produktioner har använts för att”skapa” en sträng.
• Exempel: Passar (mus, (apa, human)); in igrammatiken?
• Terminaler:LP NAME COMMA LP NAME COMMA NAME RP RP SEMI
• Härledning:newick⇒ tree SEMI
⇒ LP tree COMMA tree RP SEMI⇒ LP NAME COMMA tree RP SEMI
⇒ LP NAME COMMA LP tree COMMA tree RP RP SEMI⇒ LP NAME COMMA LP NAME COMMA NAME RP RP SEMI
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Härledningar
Beskriver hur produktioner har använts för att”skapa” en sträng.
• Exempel: Passar (mus, (apa, human)); in igrammatiken?
• Terminaler:LP NAME COMMA LP NAME COMMA NAME RP RP SEMI
• Härledning:newick⇒ tree SEMI
⇒ LP tree COMMA tree RP SEMI⇒ LP NAME COMMA tree RP SEMI⇒ LP NAME COMMA LP tree COMMA tree RP RP SEMI
⇒ LP NAME COMMA LP NAME COMMA NAME RP RP SEMI
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Härledningar
Beskriver hur produktioner har använts för att”skapa” en sträng.
• Exempel: Passar (mus, (apa, human)); in igrammatiken?
• Terminaler:LP NAME COMMA LP NAME COMMA NAME RP RP SEMI
• Härledning:newick⇒ tree SEMI
⇒ LP tree COMMA tree RP SEMI⇒ LP NAME COMMA tree RP SEMI⇒ LP NAME COMMA LP tree COMMA tree RP RP SEMI⇒ LP NAME COMMA LP NAME COMMA NAME RP RP SEMI
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Exempel: Enkel aritmetik
term ::= factor moreFactorsfactor ::= numbermoreFactors ::= ’*’ factor moreFactorsmoreFactors | ’+’ factor moreFactors
| εnumber ::= digit moreDigitsmoreDigits ::= digit moreDigits
| εdigit ::= 0|1|2|3| · · · |9
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
HärledningarHur producera “1 * 17 + 7”?:term ⇒ factor moreFactors
⇒ number moreFactors⇒ digit moreDigits moreFactors⇒ 1 moreDigits moreFactors⇒ 1 moreFactors⇒ 1 ’*’ factor moreFactors
... ⇒ 1 ’*’ 17 moreFactors⇒ 1 ’*’ 17 ’+’ factor moreFactors
... ⇒ 1 ’*’ 17 ’+’ 7Produktion:term ::= factor moreFactors
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
HärledningarHur producera “1 * 17 + 7”?:term ⇒ factor moreFactors
⇒ number moreFactors⇒ digit moreDigits moreFactors⇒ 1 moreDigits moreFactors⇒ 1 moreFactors⇒ 1 ’*’ factor moreFactors
... ⇒ 1 ’*’ 17 moreFactors⇒ 1 ’*’ 17 ’+’ factor moreFactors
... ⇒ 1 ’*’ 17 ’+’ 7Produktion:factor ::= number
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
HärledningarHur producera “1 * 17 + 7”?:term ⇒ factor moreFactors
⇒ number moreFactors⇒ digit moreDigits moreFactors⇒ 1 moreDigits moreFactors⇒ 1 moreFactors⇒ 1 ’*’ factor moreFactors
... ⇒ 1 ’*’ 17 moreFactors⇒ 1 ’*’ 17 ’+’ factor moreFactors
... ⇒ 1 ’*’ 17 ’+’ 7Produktion:number ::= digit moreDigits
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
HärledningarHur producera “1 * 17 + 7”?:term ⇒ factor moreFactors
⇒ number moreFactors⇒ digit moreDigits moreFactors⇒ 1 moreDigits moreFactors⇒ 1 moreFactors⇒ 1 ’*’ factor moreFactors
... ⇒ 1 ’*’ 17 moreFactors⇒ 1 ’*’ 17 ’+’ factor moreFactors
... ⇒ 1 ’*’ 17 ’+’ 7Produktion:digit ::= 1
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
HärledningarHur producera “1 * 17 + 7”?:term ⇒ factor moreFactors
⇒ number moreFactors⇒ digit moreDigits moreFactors⇒ 1 moreDigits moreFactors⇒ 1 moreFactors⇒ 1 ’*’ factor moreFactors
... ⇒ 1 ’*’ 17 moreFactors⇒ 1 ’*’ 17 ’+’ factor moreFactors
... ⇒ 1 ’*’ 17 ’+’ 7Produktion:moreDigits ::= ε
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
HärledningarHur producera “1 * 17 + 7”?:term ⇒ factor moreFactors
⇒ number moreFactors⇒ digit moreDigits moreFactors⇒ 1 moreDigits moreFactors⇒ 1 moreFactors⇒ 1 ’*’ factor moreFactors
... ⇒ 1 ’*’ 17 moreFactors⇒ 1 ’*’ 17 ’+’ factor moreFactors
... ⇒ 1 ’*’ 17 ’+’ 7Produktion:moreFactors ::= ’*’ factor moreFactors
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
HärledningarHur producera “1 * 17 + 7”?:term ⇒ factor moreFactors
⇒ number moreFactors⇒ digit moreDigits moreFactors⇒ 1 moreDigits moreFactors⇒ 1 moreFactors⇒ 1 ’*’ factor moreFactors
... ⇒ 1 ’*’ 17 moreFactors⇒ 1 ’*’ 17 ’+’ factor moreFactors
... ⇒ 1 ’*’ 17 ’+’ 7Produktion:factor ::= number och number ::= digit moreDigits och moreDigits ::= ε
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
HärledningarHur producera “1 * 17 + 7”?:term ⇒ factor moreFactors
⇒ number moreFactors⇒ digit moreDigits moreFactors⇒ 1 moreDigits moreFactors⇒ 1 moreFactors⇒ 1 ’*’ factor moreFactors
... ⇒ 1 ’*’ 17 moreFactors⇒ 1 ’*’ 17 ’+’ factor moreFactors
... ⇒ 1 ’*’ 17 ’+’ 7Produktion:moreFactors ::= ’+’ factor moreFactors
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
HärledningarHur producera “1 * 17 + 7”?:term ⇒ factor moreFactors
⇒ number moreFactors⇒ digit moreDigits moreFactors⇒ 1 moreDigits moreFactors⇒ 1 moreFactors⇒ 1 ’*’ factor moreFactors
... ⇒ 1 ’*’ 17 moreFactors⇒ 1 ’*’ 17 ’+’ factor moreFactors
... ⇒ 1 ’*’ 17 ’+’ 7Produktion:...flera
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Vänster eller högerhärledning?Prova expandera högraste variabeln:term ⇒ factor moreFactors
⇒ factor ’*’ factor moreFactors⇒ factor ’*’ factor ’+’ factor moreFactors⇒ factor ’*’ factor ’+’ factor⇒ factor ’*’ factor ’+’ number⇒ factor ’*’ factor ’+’ digit moreDigits⇒ factor ’*’ factor ’+’ digit⇒ factor ’*’ factor ’+’ 7
... ⇒ factor ’*’ 17 ’+’ 7
... ⇒ 1 ’*’ 17 ’+’ 7
Ekvivalenta men skilda härledningar.
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Vänster eller högerhärledning?Prova expandera högraste variabeln:term ⇒ factor moreFactors
⇒ factor ’*’ factor moreFactors⇒ factor ’*’ factor ’+’ factor moreFactors⇒ factor ’*’ factor ’+’ factor⇒ factor ’*’ factor ’+’ number⇒ factor ’*’ factor ’+’ digit moreDigits⇒ factor ’*’ factor ’+’ digit⇒ factor ’*’ factor ’+’ 7
... ⇒ factor ’*’ 17 ’+’ 7
... ⇒ 1 ’*’ 17 ’+’ 7
Ekvivalenta men skilda härledningar.
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Vänster eller högerhärledning?Prova expandera högraste variabeln:term ⇒ factor moreFactors
⇒ factor ’*’ factor moreFactors⇒ factor ’*’ factor ’+’ factor moreFactors⇒ factor ’*’ factor ’+’ factor⇒ factor ’*’ factor ’+’ number⇒ factor ’*’ factor ’+’ digit moreDigits⇒ factor ’*’ factor ’+’ digit⇒ factor ’*’ factor ’+’ 7
... ⇒ factor ’*’ 17 ’+’ 7
... ⇒ 1 ’*’ 17 ’+’ 7
Ekvivalenta men skilda härledningar.
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Vänster eller högerhärledning?Prova expandera högraste variabeln:term ⇒ factor moreFactors
⇒ factor ’*’ factor moreFactors⇒ factor ’*’ factor ’+’ factor moreFactors⇒ factor ’*’ factor ’+’ factor⇒ factor ’*’ factor ’+’ number⇒ factor ’*’ factor ’+’ digit moreDigits⇒ factor ’*’ factor ’+’ digit⇒ factor ’*’ factor ’+’ 7
... ⇒ factor ’*’ 17 ’+’ 7
... ⇒ 1 ’*’ 17 ’+’ 7
Ekvivalenta men skilda härledningar.
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Vänster eller högerhärledning?Prova expandera högraste variabeln:term ⇒ factor moreFactors
⇒ factor ’*’ factor moreFactors⇒ factor ’*’ factor ’+’ factor moreFactors⇒ factor ’*’ factor ’+’ factor⇒ factor ’*’ factor ’+’ number⇒ factor ’*’ factor ’+’ digit moreDigits⇒ factor ’*’ factor ’+’ digit⇒ factor ’*’ factor ’+’ 7
... ⇒ factor ’*’ 17 ’+’ 7
... ⇒ 1 ’*’ 17 ’+’ 7
Ekvivalenta men skilda härledningar.
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Vänster eller högerhärledning?Prova expandera högraste variabeln:term ⇒ factor moreFactors
⇒ factor ’*’ factor moreFactors⇒ factor ’*’ factor ’+’ factor moreFactors⇒ factor ’*’ factor ’+’ factor⇒ factor ’*’ factor ’+’ number⇒ factor ’*’ factor ’+’ digit moreDigits⇒ factor ’*’ factor ’+’ digit⇒ factor ’*’ factor ’+’ 7
... ⇒ factor ’*’ 17 ’+’ 7
... ⇒ 1 ’*’ 17 ’+’ 7
Ekvivalenta men skilda härledningar.
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Vänster eller högerhärledning?Prova expandera högraste variabeln:term ⇒ factor moreFactors
⇒ factor ’*’ factor moreFactors⇒ factor ’*’ factor ’+’ factor moreFactors⇒ factor ’*’ factor ’+’ factor⇒ factor ’*’ factor ’+’ number⇒ factor ’*’ factor ’+’ digit moreDigits⇒ factor ’*’ factor ’+’ digit⇒ factor ’*’ factor ’+’ 7
... ⇒ factor ’*’ 17 ’+’ 7
... ⇒ 1 ’*’ 17 ’+’ 7
Ekvivalenta men skilda härledningar.
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Vänster eller högerhärledning?Prova expandera högraste variabeln:term ⇒ factor moreFactors
⇒ factor ’*’ factor moreFactors⇒ factor ’*’ factor ’+’ factor moreFactors⇒ factor ’*’ factor ’+’ factor⇒ factor ’*’ factor ’+’ number⇒ factor ’*’ factor ’+’ digit moreDigits⇒ factor ’*’ factor ’+’ digit⇒ factor ’*’ factor ’+’ 7
... ⇒ factor ’*’ 17 ’+’ 7
... ⇒ 1 ’*’ 17 ’+’ 7
Ekvivalenta men skilda härledningar.
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Vänster eller högerhärledning?Prova expandera högraste variabeln:term ⇒ factor moreFactors
⇒ factor ’*’ factor moreFactors⇒ factor ’*’ factor ’+’ factor moreFactors⇒ factor ’*’ factor ’+’ factor⇒ factor ’*’ factor ’+’ number⇒ factor ’*’ factor ’+’ digit moreDigits⇒ factor ’*’ factor ’+’ digit⇒ factor ’*’ factor ’+’ 7
... ⇒ factor ’*’ 17 ’+’ 7
... ⇒ 1 ’*’ 17 ’+’ 7Ekvivalenta men skilda härledningar.
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxträd
• Beskriver härledningen hierarkiskt• Kan påverka tolkningen
Expr ::= Num| Expr * Expr| Expr + Expr
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxträd
• Beskriver härledningen hierarkiskt• Kan påverka tolkningen
Expr ::= Num| Expr * Expr| Expr + Expr
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
SyntaxträdTvå härledningar för 1 + 2 ∗ 3:
Vänsterhärledning
1
Num
Expr +
2
Num
Expr *
3
Num
Expr
"""bbb
Expr
�������"""bbb
Expr
Högerhärledning
1
Num
Expr +
2
Num
Expr
"""bbb
Expr *
3
Num
Expr
"""HHHHXXXXXXX
Expr
Skilda betydelser!
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
SyntaxträdTvå härledningar för 1 + 2 ∗ 3:
Vänsterhärledning
1
Num
Expr +
2
Num
Expr *
3
Num
Expr
"""bbb
Expr
�������"""bbb
ExprHögerhärledning
1
Num
Expr +
2
Num
Expr
"""bbb
Expr *
3
Num
Expr
"""HHHH
XXXXXXX
Expr
Skilda betydelser!
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxträd
• En grammatik med två olika syntaxträd ärtvetydig (eng: ambigous).
• Vill ha entydiga grammatiker• Man kan ofta göra en grammatik entydig• Inget automatiskt sätt att göra det.
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Lexikal analys
• Försteg till syntaxanalys• Opraktiskt att ha literaler som terminaler.• Lexikal analys: Extrahera terminaler
(symboler) från strängen av literaler.• Vanligt med reguljära uttryck för lexikal
analys
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Lexikal analys: praktiska fördelar
• Filtrera bort kommentarer• Känn igen reserverade ord i programspråk• Enklare behandla likvärdiga element
Ex: Alla siffror/tal under en terminal
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
En “lexer” för Newick-träd i Haskell
• Vill läsa in Newick-träd i Haskell m.h.a. BNF.• Hantera kommentarer inom [], t.ex.(mus [men råtta då?], (apa, jag))
• Jobba med terminaler, ej literaler
Symboler som ska hittas:data TreeSyms = LeftParen
| RightParen| Comma| SemiColon| Name Stringderiving (Show, Eq)
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
En “lexer” för Newick-träd i Haskell
• Vill läsa in Newick-träd i Haskell m.h.a. BNF.• Hantera kommentarer inom [], t.ex.(mus [men råtta då?], (apa, jag))
• Jobba med terminaler, ej literaler
Symboler som ska hittas:data TreeSyms = LeftParen
| RightParen| Comma| SemiColon| Name Stringderiving (Show, Eq)
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
lexer: Vad vi vill ha
Hugs> lexer "(mus, (apa, jag))"
[LeftParen,Name "mus",Comma,LeftParen,Name "apa",Comma,Name "jag",RightParen,RightParen]Hugs> lexer "(mus [men råtta då?], (apa, jag))"[LeftParen,Name "mus",Comma,LeftParen,Name "apa",Comma,Name "jag",RightParen,RightParen]
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
lexer: Vad vi vill ha
Hugs> lexer "(mus, (apa, jag))"[LeftParen,Name "mus",Comma,LeftParen,Name "apa",Comma,Name "jag",RightParen,RightParen]Hugs>
lexer "(mus [men råtta då?], (apa, jag))"[LeftParen,Name "mus",Comma,LeftParen,Name "apa",Comma,Name "jag",RightParen,RightParen]
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
lexer: Vad vi vill ha
Hugs> lexer "(mus, (apa, jag))"[LeftParen,Name "mus",Comma,LeftParen,Name "apa",Comma,Name "jag",RightParen,RightParen]Hugs> lexer "(mus [men råtta då?], (apa, jag))"[LeftParen,Name "mus",Comma,LeftParen,Name "apa",Comma,Name "jag",RightParen,RightParen]
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Lexikal analysator
Huvudfunktionen:lexer :: String -> [TreeSyms]lexer "" = []lexer (c : str)
| (c == ’[’) = lexComment str| (c == ’(’) = (LeftParen : lexer str)| (c == ’)’) = (RightParen : lexer str)| (c == ’;’) = (SemiColon : lexer str)| (c == ’,’) = (Comma : lexer str)| (c == ’ ’)|| (c == ’\n’)|| (c == ’\t’) = lexer str
| otherwise = lexString [c] str
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Lexikal analysator
Huvudfunktionen:lexer :: String -> [TreeSyms]lexer "" = []lexer (c : str)
| (c == ’[’) = lexComment str| (c == ’(’) = (LeftParen : lexer str)| (c == ’)’) = (RightParen : lexer str)| (c == ’;’) = (SemiColon : lexer str)| (c == ’,’) = (Comma : lexer str)| (c == ’ ’)|| (c == ’\n’)|| (c == ’\t’) = lexer str
| otherwise = lexString [c] str
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Lexikal analysator
Huvudfunktionen:lexer :: String -> [TreeSyms]lexer "" = []lexer (c : str)
| (c == ’[’) = lexComment str| (c == ’(’) = (LeftParen : lexer str)| (c == ’)’) = (RightParen : lexer str)| (c == ’;’) = (SemiColon : lexer str)| (c == ’,’) = (Comma : lexer str)| (c == ’ ’)|| (c == ’\n’)|| (c == ’\t’) = lexer str
| otherwise = lexString [c] str
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Lexikal analysator
Huvudfunktionen:lexer :: String -> [TreeSyms]lexer "" = []lexer (c : str)
| (c == ’[’) = lexComment str| (c == ’(’) = (LeftParen : lexer str)| (c == ’)’) = (RightParen : lexer str)| (c == ’;’) = (SemiColon : lexer str)| (c == ’,’) = (Comma : lexer str)| (c == ’ ’)|| (c == ’\n’)|| (c == ’\t’) = lexer str
| otherwise = lexString [c] str
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Lexikal analysator
Huvudfunktionen:lexer :: String -> [TreeSyms]lexer "" = []lexer (c : str)
| (c == ’[’) = lexComment str| (c == ’(’) = (LeftParen : lexer str)| (c == ’)’) = (RightParen : lexer str)| (c == ’;’) = (SemiColon : lexer str)| (c == ’,’) = (Comma : lexer str)| (c == ’ ’)|| (c == ’\n’)|| (c == ’\t’) = lexer str
| otherwise = lexString [c] str
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Hjälpfunktioner till lexerlexComment :: String -> [TreeSyms]-- Skip everything until next ’]’lexComment "" = error "File ended in comment"lexComment (’]’ : str) = lexer strlexComment (c : str) = lexComment str
lexString :: String -> String -> [TreeSyms]-- Accumulate strings in input-- Usage: lexString accumulated inputstringlexString buf "" = (Name buf : [])lexString buf (c:str) =
if (isAlpha c) thenlexString (c:buf) str
else(Name (reverse buf) : lexer (c:str))
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Hjälpfunktioner till lexerlexComment :: String -> [TreeSyms]-- Skip everything until next ’]’lexComment "" = error "File ended in comment"lexComment (’]’ : str) = lexer strlexComment (c : str) = lexComment str
lexString :: String -> String -> [TreeSyms]-- Accumulate strings in input-- Usage: lexString accumulated inputstringlexString buf "" = (Name buf : [])lexString buf (c:str) =
if (isAlpha c) thenlexString (c:buf) str
else(Name (reverse buf) : lexer (c:str))
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Koppling till DFA
• Tre funktioner• Motsvarar tre tillstånd:
• Läs symboler och blanka• Filtrera kommentarer• Läs namn
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Rekursiv medåkning
Eng: recursive descent• Strukturerat och etablerat sätt att skriva en
syntaxanalysator: en parser
• Medåkning: Vi läser av symbol efter symboli indata
• Rekursivt: Resultat samlas ihop m.h.a.rekursiva anrop
• Kodstruktur: Följer din kontext-friagrammatik
• Princip: En produktion⇒ en funktion
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Rekursiv medåkning
Eng: recursive descent• Strukturerat och etablerat sätt att skriva en
syntaxanalysator: en parser• Medåkning: Vi läser av symbol efter symbol
i indata
• Rekursivt: Resultat samlas ihop m.h.a.rekursiva anrop
• Kodstruktur: Följer din kontext-friagrammatik
• Princip: En produktion⇒ en funktion
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Rekursiv medåkning
Eng: recursive descent• Strukturerat och etablerat sätt att skriva en
syntaxanalysator: en parser• Medåkning: Vi läser av symbol efter symbol
i indata• Rekursivt: Resultat samlas ihop m.h.a.
rekursiva anrop
• Kodstruktur: Följer din kontext-friagrammatik
• Princip: En produktion⇒ en funktion
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Rekursiv medåkning
Eng: recursive descent• Strukturerat och etablerat sätt att skriva en
syntaxanalysator: en parser• Medåkning: Vi läser av symbol efter symbol
i indata• Rekursivt: Resultat samlas ihop m.h.a.
rekursiva anrop• Kodstruktur: Följer din kontext-fria
grammatik
• Princip: En produktion⇒ en funktion
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Rekursiv medåkning
Eng: recursive descent• Strukturerat och etablerat sätt att skriva en
syntaxanalysator: en parser• Medåkning: Vi läser av symbol efter symbol
i indata• Rekursivt: Resultat samlas ihop m.h.a.
rekursiva anrop• Kodstruktur: Följer din kontext-fria
grammatik• Princip: En produktion⇒ en funktion
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Egenskaper för rekursiv medåkning
• Läser terminaler vänster-till-höger
L• Gör vänster-härledning
L
• Nästföljande k terminaler avgör vilkenproduktion som används
(k )
• Vill ha en prediktiv grammatik:k begränsad (gärna k = 1)
• Terminologi: LL(k ) parser• Linjär tidskomplexitet
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Egenskaper för rekursiv medåkning
• Läser terminaler vänster-till-höger
L
• Gör vänster-härledning
L• Nästföljande k terminaler avgör vilken
produktion som används
(k )
• Vill ha en prediktiv grammatik:k begränsad (gärna k = 1)
• Terminologi: LL(k ) parser• Linjär tidskomplexitet
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Egenskaper för rekursiv medåkning
• Läser terminaler vänster-till-höger
L
• Gör vänster-härledning
L
• Nästföljande k terminaler avgör vilkenproduktion som används
(k )• Vill ha en prediktiv grammatik:
k begränsad (gärna k = 1)• Terminologi: LL(k ) parser• Linjär tidskomplexitet
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Egenskaper för rekursiv medåkning
• Läser terminaler vänster-till-höger
L
• Gör vänster-härledning
L
• Nästföljande k terminaler avgör vilkenproduktion som används
(k )
• Vill ha en prediktiv grammatik:k begränsad (gärna k = 1)
• Terminologi: LL(k ) parser• Linjär tidskomplexitet
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Egenskaper för rekursiv medåkning
• Läser terminaler vänster-till-höger L• Gör vänster-härledning L• Nästföljande k terminaler avgör vilken
produktion som används (k )• Vill ha en prediktiv grammatik:
k begränsad (gärna k = 1)• Terminologi: LL(k ) parser
• Linjär tidskomplexitet
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Egenskaper för rekursiv medåkning
• Läser terminaler vänster-till-höger L• Gör vänster-härledning L• Nästföljande k terminaler avgör vilken
produktion som används (k )• Vill ha en prediktiv grammatik:
k begränsad (gärna k = 1)• Terminologi: LL(k ) parser• Linjär tidskomplexitet
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Klasser av grammatiker• En grammatik tillhör klassen LL(k )
om och endast omdet finns en LL(k )-parser för grammatiken.
• Vänster-rekursiva grammatiker tillhör ejLL(k ).Ex:
expr ::= term ’+’ term| factor ’*’ factor
term ::= number| expr
factor ::= number| expr
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Klasser av grammatiker• En grammatik tillhör klassen LL(k )
om och endast omdet finns en LL(k )-parser för grammatiken.
• Vänster-rekursiva grammatiker tillhör ejLL(k ).Ex:
expr ::= term ’+’ term| factor ’*’ factor
term ::= number| expr
factor ::= number| expr
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
KodstrukturmoreFactors ::= ’*’ factor moreFactors
| ’+’ factor moreFactors| ε
function parseMoreFactors(accVal)nextSymbol := lookAhead()if (nextSymbol = ’*’) then
val := parseFactor()return parseMoreFactors(accVal * val)
else if (nextSymbol = ’+’) thenval := parseFactor()return parseMoreFactors(accVal + val)
elsereturn accVal
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
KodstrukturmoreFactors ::= ’*’ factor moreFactors
| ’+’ factor moreFactors| ε
function parseMoreFactors(accVal)nextSymbol := lookAhead()if (nextSymbol = ’*’) then
val := parseFactor()return parseMoreFactors(accVal * val)
else if (nextSymbol = ’+’) thenval := parseFactor()return parseMoreFactors(accVal + val)
elsereturn accVal
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
KodstrukturmoreFactors ::= ’*’ factor moreFactors
| ’+’ factor moreFactors| ε
function parseMoreFactors(accVal)nextSymbol := lookAhead()if (nextSymbol = ’*’) then
val := parseFactor()return parseMoreFactors(accVal * val)
else if (nextSymbol = ’+’) thenval := parseFactor()return parseMoreFactors(accVal + val)
elsereturn accVal
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
KodstrukturmoreFactors ::= ’*’ factor moreFactors
| ’+’ factor moreFactors| ε
function parseMoreFactors(accVal)nextSymbol := lookAhead()if (nextSymbol = ’*’) then
val := parseFactor()return parseMoreFactors(accVal * val)
else if (nextSymbol = ’+’) thenval := parseFactor()return parseMoreFactors(accVal + val)
elsereturn accVal
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
KodstrukturmoreFactors ::= ’*’ factor moreFactors
| ’+’ factor moreFactors| ε
function parseMoreFactors(accVal)nextSymbol := lookAhead()if (nextSymbol = ’*’) then
val := parseFactor()return parseMoreFactors(accVal * val)
else if (nextSymbol = ’+’) thenval := parseFactor()return parseMoreFactors(accVal + val)
elsereturn accVal
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Exempel: Läs Newick-träd
• Resultat: Ett träd, dvs semantisk tolkning• Datastruktur:data Tree = Branch Tree Tree
| Leaf Stringderiving (Show, Eq)
• Återanvänd lexikal analysator för Newick!
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Huvudprogram
module Newick whereimport Charimport IOimport Tree
main = dostr <- readFile "evolution.tree"putStrLn (tree2newick
(newick2tree (lexer str)))
• Minns: lat I/O!
Newick> main(mus, (jag, apa));
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Huvudprogram
module Newick whereimport Charimport IOimport Tree
main = dostr <- readFile "evolution.tree"putStrLn (tree2newick
(newick2tree (lexer str)))
• Minns: lat I/O!
Newick> main(mus, (jag, apa));
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxanalysator: Princip
• Läser lista med terminaler
• Ungefär en funktion per produktion• Varje funktion returnerar de terminaler som
ej konsumerats• Ibland returneras ett resultat: löv eller träd
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxanalysator: Princip
• Läser lista med terminaler• Ungefär en funktion per produktion
• Varje funktion returnerar de terminaler somej konsumerats
• Ibland returneras ett resultat: löv eller träd
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxanalysator: Princip
• Läser lista med terminaler• Ungefär en funktion per produktion• Varje funktion returnerar de terminaler som
ej konsumerats
• Ibland returneras ett resultat: löv eller träd
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxanalysator: Princip
• Läser lista med terminaler• Ungefär en funktion per produktion• Varje funktion returnerar de terminaler som
ej konsumerats• Ibland returneras ett resultat: löv eller träd
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxanalysator: Läs in trädetnewick ::= tree semiColonsemiColon ::= Semi
| εtree ::= Name
| LeftParen tree Comma tree RightParen
-- Interface functionnewick2tree :: [TreeSyms] -> Treenewick2tree symbols = rNewick symbols
-- Read tree and possible semicolonrNewick :: [TreeSyms] -> TreerNewick [] = error "Tree empty"rNewick symbols = t
where (t, rest1) = rTree symbolsrest2 = rSemiColon rest1
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxanalysator: Läs in trädetnewick ::= tree semiColonsemiColon ::= Semi
| εtree ::= Name
| LeftParen tree Comma tree RightParen
-- Interface functionnewick2tree :: [TreeSyms] -> Treenewick2tree symbols = rNewick symbols
-- Read tree and possible semicolonrNewick :: [TreeSyms] -> TreerNewick [] = error "Tree empty"rNewick symbols = t
where (t, rest1) = rTree symbolsrest2 = rSemiColon rest1
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxanalysator: Delträdnewick ::= tree semiColonsemiColon ::= Semi
| εtree ::= Name
| LeftParen tree Comma tree RightParen
-- Read (sub-) tree: Either a leaf or two subtreesrTree :: [TreeSyms] -> (Tree, [TreeSyms])rTree [] = error "Unexpected end of file."rTree (Name str : l) = (Leaf str, l)rTree (LeftParen : l) =
-- Read two subtrees and return a Branch combining themlet (t1, rest1) = rTree l
rest2 = rSymbol Comma rest1(t2, rest3) = rTree rest2rest4 = rSymbol RightParen rest3
in (Branch t1 t2, rest4)
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxanalysator: Delträdnewick ::= tree semiColonsemiColon ::= Semi
| εtree ::= Name
| LeftParen tree Comma tree RightParen
-- Read (sub-) tree: Either a leaf or two subtreesrTree :: [TreeSyms] -> (Tree, [TreeSyms])rTree [] = error "Unexpected end of file."rTree (Name str : l) = (Leaf str, l)rTree (LeftParen : l) =
-- Read two subtrees and return a Branch combining themlet (t1, rest1) = rTree l
rest2 = rSymbol Comma rest1(t2, rest3) = rTree rest2rest4 = rSymbol RightParen rest3
in (Branch t1 t2, rest4)
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxanalysator: Delträdnewick ::= tree semiColonsemiColon ::= Semi
| εtree ::= Name
| LeftParen tree Comma tree RightParen
-- Read (sub-) tree: Either a leaf or two subtreesrTree :: [TreeSyms] -> (Tree, [TreeSyms])rTree [] = error "Unexpected end of file."rTree (Name str : l) = (Leaf str, l)rTree (LeftParen : l) =
-- Read two subtrees and return a Branch combining themlet (t1, rest1) = rTree l
rest2 = rSymbol Comma rest1(t2, rest3) = rTree rest2rest4 = rSymbol RightParen rest3
in (Branch t1 t2, rest4)
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxanalysator: Delträdnewick ::= tree semiColonsemiColon ::= Semi
| εtree ::= Name
| LeftParen tree Comma tree RightParen
-- Read (sub-) tree: Either a leaf or two subtreesrTree :: [TreeSyms] -> (Tree, [TreeSyms])rTree [] = error "Unexpected end of file."rTree (Name str : l) = (Leaf str, l)rTree (LeftParen : l) =
-- Read two subtrees and return a Branch combining themlet (t1, rest1) = rTree l
rest2 = rSymbol Comma rest1(t2, rest3) = rTree rest2rest4 = rSymbol RightParen rest3
in (Branch t1 t2, rest4)
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxanalysator: Delträdnewick ::= tree semiColonsemiColon ::= Semi
| εtree ::= Name
| LeftParen tree Comma tree RightParen
-- Read (sub-) tree: Either a leaf or two subtreesrTree :: [TreeSyms] -> (Tree, [TreeSyms])rTree [] = error "Unexpected end of file."rTree (Name str : l) = (Leaf str, l)rTree (LeftParen : l) =
-- Read two subtrees and return a Branch combining themlet (t1, rest1) = rTree l
rest2 = rSymbol Comma rest1(t2, rest3) = rTree rest2rest4 = rSymbol RightParen rest3
in (Branch t1 t2, rest4)
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxanalysator: Delträdnewick ::= tree semiColonsemiColon ::= Semi
| εtree ::= Name
| LeftParen tree Comma tree RightParen
-- Read (sub-) tree: Either a leaf or two subtreesrTree :: [TreeSyms] -> (Tree, [TreeSyms])rTree [] = error "Unexpected end of file."rTree (Name str : l) = (Leaf str, l)rTree (LeftParen : l) =
-- Read two subtrees and return a Branch combining themlet (t1, rest1) = rTree l
rest2 = rSymbol Comma rest1(t2, rest3) = rTree rest2rest4 = rSymbol RightParen rest3
in (Branch t1 t2, rest4)
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxanalysator: Delträdnewick ::= tree semiColonsemiColon ::= Semi
| εtree ::= Name
| LeftParen tree Comma tree RightParen
-- Read (sub-) tree: Either a leaf or two subtreesrTree :: [TreeSyms] -> (Tree, [TreeSyms])rTree [] = error "Unexpected end of file."rTree (Name str : l) = (Leaf str, l)rTree (LeftParen : l) =
-- Read two subtrees and return a Branch combining themlet (t1, rest1) = rTree l
rest2 = rSymbol Comma rest1(t2, rest3) = rTree rest2rest4 = rSymbol RightParen rest3
in (Branch t1 t2, rest4)
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxanalysator: Delträdnewick ::= tree semiColonsemiColon ::= Semi
| εtree ::= Name
| LeftParen tree Comma tree RightParen
-- Read (sub-) tree: Either a leaf or two subtreesrTree :: [TreeSyms] -> (Tree, [TreeSyms])rTree [] = error "Unexpected end of file."rTree (Name str : l) = (Leaf str, l)rTree (LeftParen : l) =
-- Read two subtrees and return a Branch combining themlet (t1, rest1) = rTree l
rest2 = rSymbol Comma rest1(t2, rest3) = rTree rest2rest4 = rSymbol RightParen rest3
in (Branch t1 t2, rest4)
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxanalysator: Terminaler
newick ::= tree semiColonsemiColon ::= Semi
| εtree ::= Name
| LeftParen tree Comma tree RightParen
-- Possible semicolonrSemiColon (SemiColon : rest) = restrSemiColon symbols = symbols
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Syntaxanalysator: Terminaler
-- Consume an expected symbol,-- complain if it is not thererSymbol :: TreeSyms -> [TreeSyms] -> [TreeSyms]rSymbol symbol (h : rest) =
if (symbol == h) thenrest
elseerror ("Unexpected symbol: " ++ show h)
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Testkörning
Felaktigt data: (mus (,(apa, jag));Newick> main
Program error: Unexpected symbol: LeftParen
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Koppling till PDFA?
Var är vår ändliga automat med stack?
• Varje funktion motsvarar ett tillstånd• Rekursiva anrop använder stacken
(om ej svansrekursiv)
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Koppling till PDFA?
Var är vår ändliga automat med stack?• Varje funktion motsvarar ett tillstånd• Rekursiva anrop använder stacken
(om ej svansrekursiv)
Automat med stack Kontextfri grammatik Härledning och syntaxträd Lexikal analys Rekursiv medåkning Avslut
Sammanfattning
• Grammatiker är enkla!• Grammatik styr upp ditt
format/språk/hackande• Lexikal analys:
[Char] -> [Terminaler]
• Rekursiv medåkning är ett systematiskt sättatt skriva en parser
Härnäst: Verktyg för syntaxanalys