Talen en Compilers Waar gaat het eigenlijk over? !!Grammatica’s !!Ontleden !!Taal Uitdaging: Bedenk een éénregelige definitie van taal, ontleden en grammatica Taal !!Een taal is… de verzameling van alle zinnen die “goed” zijn Omdat je ouders/ leraren dat zeiden Omdat de Académie Française dat vindt Omdat de compiler het pikt Omdat we dat zo hebben afgesproken Compiler !! Een compiler vertaalt zinnen uit een taal naar een andere taal !!Bij die vertaling voert een compiler nog verschillende andere zaken uit Ontleden …Accolades… …puntkomma’s… …Expressies… …Onderwerp… …werkwoord… …Lijdend voorwerp… Correct Java! !!Ontleden is… het herkennen van de structuur van een zin !!…en daarmee aantonen dat hij tot een taal behoort Correct Nederlands! Grammatica !!Regels die voorschrijven hoe het ontleden moet gebeuren Zin Wat is dat? Rij symbolen! Wat is dat? !!Hoe mag een kandidaat-zin er uit zien? “Dit lijkt me een goed voorbeeld.” “class Hello extends Applet {public void paint (Graphics gr)…” “ATTCGACCGTTA” “0011010010101” “!"#$%&&'($')” Sequence (Rij) Definitie van [X] Sequence over X met X een willekeurig type: !! [ ] is een sequence over X !!Als x een element van X is, en xs een sequence over X is, dan is x:xs ook een sequence over X (in de Haskell-notatie) Sequence (Rij) Definitie van X* Sequence over X met X een willekeurige verzameling: Inductieve definitie !! ! is een sequence over X !!Als a een element van X is, en w een sequence over X is, dan is a w ook een sequence over X !!Niets anders is een sequence over X (in de wiskunde-notatie) Taal !!Een Alfabet is… een eindige verzameling symbolen !!Een Taal is… een deelverzameling van T* bij een bepaald alfabet T !!Een Zin is… van een taal is… een element van die eentaal taal Hoe definieer je een taal? !!Alle elementen opsommen { dit , is , alles } !!Inductieve definitie geven {a,b,c}* predicaat geven waaraan !!Een voorwaarde zinnen moeten voldoen { n " {0..9}* | n%2=0 } { s " {a,b,c}* | s = sR } even getallen palindromen Ontleden !!Bij een “opsom”-definitie van de taal: gewoon zoeken !!Bij een “inductieve” definitie van de taal: inductieve opbouw uitpluizen !!Bij een “predicatieve” definitie van de taal: predicaat controleren Genereren !!Bij een “opsom”-definitie van de taal: ‘t zijn ze al… !!Bij een “inductieve” definitie van de taal: inductieve opbouw volgen !!Bij een “predicatieve” definitie van de taal: onmogelijk! (tenzij je alles probeert) Liever inductief dan predicatief Zijn deze definities equivalent? !!Palindromen predicatief { s " {a,b,c}* | s = sR } !!Palindromen inductief sound '! ! is een palindroom '! a, b, en c zijn palindromen '! Als P en palindroom is dan zijn aPa , bPb en cPc het ook '! Niets anders is een palindroom complete Inductieve definitie bevat herschrijfregels '! '! '! '! '! '! '! P#! P#a P#b P#c P # aPa P # bPb P # cPc Genereren van zinnen: !!Begin met een P !!Pas naar believen de herschrijfregels toe !!Werk al het rood weg Grammatica Een grammatica bestaat uit: !!Het alfabet !!Hulpsymbolen !!Productieregels !!Een startsymbool Grammatica Een grammatica bestaat uit (T, N, R, S) !!Het alfabet T !!Hulpsymbolen N !!Productieregels R !!Een startsymbool S Grammatica Een grammatica bestaat uit (T, N, R, S) !!Het alfabet T eindig !!Hulpsymbolen N eindig T$N=Ø !!Productieregels R eindig !!Een startsymbool S één S"N Met als elementen: A#w waarbij A " N w " (N%T)* Vorm van de herschrijfregels !!Contextvrije grammatica A#w waarbij A " N w " (N%T)* !!Contextgevoelige A#w grammatica waarbij A " (N%T)* w " (N%T)* !!(Rechts) reguliere A#w grammatica waarbij A " N w " T* N % T* Afkorting-notatie !!Lang '! '! '! '! '! '! '! P#! P#a P#b P#c P # aPa P # bPb P # cPc !!Kort '! P # ! | a | b | c | aPa | bPb | cPc “Echt” Voorbeeld !!Contextvrije grammatica voor Java '! Stat # Var = Expr & '| if (Expr) Stat else Stat | while (Expr) Stat '! Expr # Const | Var | Expr Op Expr '! Op # + | -