Překladač sestrojující k regulárnímu výrazu ekvivalentní konečný automat Připomeňme si jednoznačnou gramatiku G pro jazyk RV({a, b})

Podobné dokumenty
Na rozšiřující přednášce minulý týden jsme se věnovali zejména. algoritmu, který k zadanému konečnému automatu sestrojí ekvivalentní regulární výraz

/01: Teoretická informatika(ti) přednáška 5

/1: Teoretická informatika(ti) přednáška 4

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LL SYNTAKTICKÁ ANALÝZA DOKONČENÍ, IMPLEMENTACE.

Bezkontextové jazyky. Bezkontextové jazyky 1 p.1/39

Automaty a gramatiky(bi-aag) Motivace. 1. Základní pojmy. 2 domácí úkoly po 6 bodech 3 testy za bodů celkem 40 bodů

Vztah jazyků Chomskeho hierarchie a jazyků TS

Výpočetní modely pro rozpoznávání bezkontextových jazyků zásobníkové automaty LL(k) a LR(k) analyzátory

Formální jazyky a gramatiky Teorie programovacích jazyků

Z. Sawa (VŠB-TUO) Teoretická informatika 5. listopadu / 43

Bezkontextové jazyky 2/3. Bezkontextové jazyky 2 p.1/27

Jednoznačné a nejednoznačné gramatiky

Teoretická informatika průběh výuky v semestru 1

Implementace LL(1) překladů

Turingovy stroje. Teoretická informatika Tomáš Foltýnek

doplněk, zřetězení, Kleeneho operaci a reverzi. Ukážeme ještě další operace s jazyky, na které je

Kapitola 6. LL gramatiky. 6.1 Definice LL(k) gramatik. Definice 6.3. Necht G = (N, Σ, P, S) je CFG, k 1 je celé číslo.

Teoretická informatika - Úkol č.1

8) Jaké jsou důvody pro použití víceprůchodového překladače Dříve hlavně kvůli úspoře paměti, dnes spíše z důvodu optimalizace

Bezkontextové gramatiky. Z. Sawa (VŠB-TUO) Úvod do teoretické informatiky 6. května / 49

Automaty a gramatiky

Čísla značí použité pravidlo, šipka směr postupu Analýza shora. Analýza zdola A 2 B 3 B * C 2 C ( A ) 1 a A + B. A Derivace zleva:

Regulární výrazy. Definice Množina regulárních výrazů nad abecedou Σ, označovaná RE(Σ), je definována induktivně takto:

Syntaktická analýza. Implementace LL(1) překladů. Šárka Vavrečková. Ústav informatiky, FPF SU Opava

2 Formální jazyky a gramatiky

Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K.

Týden 11. Přednáška. Teoretická informatika průběh výuky v semestru 1. Nejprve jsme dokončili témata zapsaná u minulé přednášky.

Poznámka. Kezkoušcejemožnojítjenposplněnípožadavkůkzápočtu. Kromě čistého papíru a psacích potřeb není povoleno používat žádné další pomůcky.

Konečný automat. Jan Kybic.

Teoretická informatika průběh výuky v semestru 1

Bezkontextové jazyky. Bezkontextové jazyky 1 p.1/31

Syntaxí řízený překlad

Kombinatorika, výpočty

Výroková logika. Teoretická informatika Tomáš Foltýnek

Vlastnosti Derivační strom Metody Metoda shora dolů Metoda zdola nahoru Pomocné množiny. Syntaktická analýza. Metody a nástroje syntaktické analýzy

AUTOMATY A GRAMATIKY. Pavel Surynek. Kontextové uzávěrové vlastnosti Turingův stroj Rekurzivně spočetné jazyky Kódování, enumerace

Fakulta informačních technologií. Teoretická informatika

Strukturální rozpoznávání

Syntaxí řízený překlad

Automaty a gramatiky(bi-aag) Formální překlady. 5. Překladové konečné automaty. h(ε) = ε, h(xa) = h(x)h(a), x, x T, a T.

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

: Teoretická informatika(ti)

Naproti tomu gramatika je vlastně soupis pravidel, jak

Vlastnosti regulárních jazyků

(viztakéslidyktétopřednášce...) Poznámka. Neudělali jsme vše tak podrobně, jak je to v zápisu.

Konstrukce relace. Postupně konstruujeme na množině všech stavů Q relace i,

Konstruktory překladačů

Zásobníkový automat. SlovoaaaabbbbpatřídojazykaL={a i b i i 1} a a a a b b b b

GENEROVÁNÍ KÓDU 9. SHRNUTÍ - PŘÍKLAD POSTUPU PŘEKLADU VSTUPNÍHO PROGRAMU (ZA POUŽITÍ DOSUD ZNÁMÝCH TECHNIK)

Lexikální analýza Teorie programovacích jazyků

Teoretická informatika TIN 2013/2014

Poznámka. Kezkoušcejemožnojítjenposplněnípožadavkůkzápočtu. Kromě čistého papíru a psacích potřeb není povoleno používat žádné další pomůcky.

Regulární výrazy. M. Kot, Z. Sawa (VŠB-TU Ostrava) Úvod do teoretické informatiky 14. března / 20

Teoretická informatika

1.Charakterizujte křížový překladač 2.Objasněte pojem silikonový překladač 3.Co to jsou formátory textu? Uveďte příklad

Rezoluce ve výrokové logice

Popište a na příkladu ilustrujte(rychlý) algoritmus testující, zda dané dva automaty jsou izomorfní.

Stromy, haldy, prioritní fronty

Pozn.MinulejsmesekPSPACEnedostali,protojezdepřekryvstextemzminula.

Sémantika výrokové logiky. Alena Gollová Výroková logika 1/23

Teoretická informatika

Základní datové struktury III: Stromy, haldy

1 Úvod do kompilátorů

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

PŘEVOD GRAMATIK DO NORMÁLNÍCH FOREM

Interpret jazyka IFJ2011

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Výroková logika. Sémantika výrokové logiky

Formální jazyky a automaty Petr Šimeček

Formální systém výrokové logiky

Návrh algoritmů pro sémantické akce při výstavbě interpretu metodou rekurzivního sestupu

Hledání v textu algoritmem Boyer Moore

Výroková a predikátová logika - V

Třída PTIME a třída NPTIME. NP-úplnost.

Lineární algebra : Násobení matic a inverzní matice

Programovací jazyk Pascal

Studijní program ELEKTROTECHNIKA A INFORMATIKA

Referát z předmětu Teoretická informatika

1. Definujte překladač. Jaký je rozdíl mezi interpretačním a kompilačním překladačem? Co je to konverzační překladač?

UČEBNÍ TEXTY VYSOKÝCH ŠKOL. Prof. RNDr. Milan Češka, CSc. Gramatiky a jazyky

IB111 Úvod do programování skrze Python

Matematická indukce. Základy diskrétní matematiky, BI-ZDM ZS 2011/12, Lekce 3

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

Lineární algebra : Násobení matic a inverzní matice

Rekurzivní algoritmy

4.2 Syntaxe predikátové logiky

Lexikální analýza. Rozhraní lexikálního analyzátoru. Miroslav Beneš Dušan Kolář. M. Beneš, D. Kolář: Lexikální analýza 1. Lexikální analýza 2

Týden 14. Přednáška. Teoretická informatika průběh výuky v semestru 1. PSPACE, NPSPACE, PSPACE-úplnost

Lexikální analýza. Miroslav Beneš Dušan Kolář

Základy teoretické informatiky Formální jazyky a automaty

Struktura programu v době běhu

teorie logických spojek chápaných jako pravdivostní funkce

EKO-KOLONIE. Ústav informatiky, Filozoficko-přírodovědecká fakulta Slezské univerzity v Opavě 24.

Pumping lemma - podstata problému. Automaty a gramatiky(bi-aag) Pumping lemma - problem resolution. Pumping lemma - podstata problému

Úvod do teoretické informatiky(2017/2018) cvičení 11 1

Úvod do informatiky. Miroslav Kolařík

Učební texty k státní bakalářské zkoušce Programování Základy teoretické informatiky. študenti MFF 15. augusta 2008

B A B A B A B A A B A B B

Formální jazyky. Z. Sawa (VŠB-TUO) Úvod do teoretické informatiky 2. března / 32

Prioritní fronta, halda

Transkript:

Teoretická informatika průběh výuky v semestru 1 Týden 4 Přednáška Ukázali jsme jednoduchý převod konečného automatu na bezkontextovou gramatiku, čímž jsme prokázali, že každý regulární jazyk je bezkontextovým jazykem(ale ne naopak).(k automatu A=(Q,Σ,δ,q 0,F)jsmesestrojili[tzv.regulární]gramatiku G=(Π,Σ,S,P), kdeπ=q, S= q 0, P= {q aq δ(q,a)=q } {q ε q F}.) Překladač sestrojující k regulárnímu výrazu ekvivalentní konečný automat Připomeňme si jednoznačnou gramatiku G pro jazyk RV({a, b}) R T+R T ; T FT F ; F F (R) C ; C a b vnížjsmeprozjednodušenívynechalisymboly aǫ.naše Gtedygenerujejazykvabecedě Σ={a,b,+,,(,)},jehožprvkyjsoupříslušnéregulárnívýrazy. Zamyslíme se nad implementací algoritmu, který k zadanému regulárnímu výrazu sestrojí ekvivalentní konečný automat. Uvědomíme si, že v prvé řadě potřebujeme implementovat syntaktický rozbor zadaného regulárního výrazu, tedy konstrukci jeho syntaktického stromu. Víme, že tento strom se snadno odvodí např. z derivačního stromu podle uvedené gramatiky. Jde nám tedy o to, jak příslušný derivační strom(či jeho reprezentaci např. v podobě konkrétního odvození reg. výrazu v gramatice) sestrojit. Ukáže se, že se velmi přirozeně nabízí využití dynamické datové struktury zásobník; později budeme diskutovat ekvivalenci tzv. zásobníkových automatů(tj. konečných automatů, které navíc mohou využívat zásobník) s bezkontextovými gramatikami. Teď ukážeme algoritmický přístup zvaný rekurzivní sestup, kde se zásobník neobjevuje explicitně, ale je skrytý v použití rekurzivního volání procedur. Jako příklad řetězce z L(G) vezměme (aa+b). K němu by náš kýžený algoritmus měl sestrojit např.(jedinou existující) levou derivaci R T F F (R) (T+R) (FT+R) (CT+R) (at+r) (af+r) (ac+r) (aa+r) (aa+t) (aa+f) (aa+c) (aa+b) Taková derivace je jednoznačně dána posloupností použitých přepisovacích pravidel. Když pravidla např. očíslujeme 1:R T+R,2:R T,3:T FT,...,8:C a,9:c b, lzeuvedenoulevouderivacireprezentovatposloupností2,4,5,6,1,3,7,8,4,7,8,2,4,7,9. Na přednášce jsme prodiskutovali návrh následujícího algoritmu(zapsaného ve formě spustitelného programu v Pythonu[s jistými chybami, viz cvičení]):

Teoretická informatika průběh výuky v semestru 2 #funkce syntanalrv vypise pro zadany rv (reg. vyraz) pravou derivaci pozpatku #podle gramatiky s pravidly uvedenymi nize v poznamkach, #pokud je retezec rv skutecne reg. vyrazem (nad abecedou {a,b}) def syntanalrv(rv): idx = { val : 0} #aktualni index pri cteni rv zleva doprava # pravidla s R na leve strane: R --> T+R T, tedy 1: R --> T+R, 2: R--> T def zpr(): # zpracuj neterm. R, az v prubehu se zjisti, zda jdeo1ci 2 zpt() # mj. precte max. prefix useku rv zacinajiciho na akt.indexu, # ktery je "termem" (odvozenym z T) # po zpracovani index ukazuje za onen prefix if idx[ val ] >= len(rv): print 2 # 2: R --> T elif rv[idx[ val ]] == + : zpr() print 1 # 1: R --> T+R # T --> FT F... 3: T --> FT, 4: T --> F def zpt(): zpf() if (idx[ val ] < len(rv) and rv[idx[ val ]] in ( a, b, ( )): zpt() print 3 # 3: T --> FT print 4 # 4: T --> F # F --> F* (R) C # nahrazeno F --> BH, B --> (R) C, H --> *H epsilon # odstraneni leve rekurze F --> F* # 5: F --> BH def zpf(): zpb() zph() print 5 # 5: F --> BH

Teoretická informatika průběh výuky v semestru 3 # B --> (R) C... 6: B --> (R), 7: B --> C def zpb(): if (rv[idx[ val ]] in ( a, b )): zpc() print 7 # 7: B --> C elif (rv[idx[ val ]] == ( ): zpr() if (rv[idx[ val ]]!= ) ): raise Exception("ERROR 1") print 6 # 6: B --> (R) raise Exception("ERROR 2") # H --> *H epsilon... 8: H --> *H, 9: H --> epsilon def zph(): if (idx[ val ] < len(rv) and rv[idx[ val ]] == * ): print 8 # 8: H --> *H zph() print 9 # 9: H --> epsilon # C --> a b... 10: C --> a, 11: C --> b def zpc(): if (rv[idx[ val ]] == a ): print 10 # 10: C --> a elif(rv[idx[ val ]] == b ): print 11 # 11: C --> b raise Exception("ERROR 3") zpr() print "OK" # end of syntanalrv(rv) syntanalrv("(aa+b)*") Pozn. Šlo nám především o demonstraci algoritmu, nikoli o ideální program v Pythonu.

Teoretická informatika průběh výuky v semestru 4 Naše upravená gramatika(s 11 pravidly v poznámkách v programu) je nejen jednoznačná, ale umožňuje i uvedený postup rekurzivním sestupem. Dala by se upravit na tzv. LL(1)- gramatiku, ale toto téma teď nebudeme blíže rozebírat. Stručně dotáhneme myšlenku našeho malého překladače. Po přímočaré úpravě vydá výše uvedený program derivační strom pro daný regulární výraz(který mj. obsahuje informaci o příslušném syntaktickém stromu). Kořen zkonstruovaného stromu pak můžeme předložit funkci NFA, která sestrojí odpovídající konečný automat stačí nám nedeterministický s případnými ε-šipkami. Níže uvedený pseudokód snad již nevyžaduje bližší komentář(ale prověření korektnosti ano). automat NFA(node v) (* procedura vracející k zadanému vrcholu v derivačního stromu automat, např. ve formě tabulky, který odpovídá podvýrazu určenému podstromem s kořenem v*) { a b ε if(v.symb= a )return q 1 q 2 - - ; q 2 - - - a b ε if(v.symb= b )return q 1 - q 2 - ; q 2 - - - if(v.symb= R and v.rule= R R+T ) returnunion(nfa(v.succ 1 ),NFA(v.succ 3 )); if(v.symb= T andv.rule= T FT )returnconc(nfa(v.succ 1 ),NFA(v.succ 2 )); if(v.symb= F [and v.rule= F BH ]): if v.succ 2.succ 1.symb= returniter(nfa(v.succ 1 ))elsereturnnfa(v.succ 1 ); if(v.symb= B and v.rule= B (R) )returnnfa(v.succ 2 )); if(v.symb= H )return()#nevracizadnyautomat; otherwisereturnnfa(v.succ 1 ) } Cvičení Příklad 4.1 Proveďte ručně běhalgoritmu(čiaspoňpodstatnoučástběhualgoritmu)syntanalrvz přednáškynapř.proregulárnívýraz(ab) +a.znázornětesirekurzivnívolánízásobníkovou strukturou(třeba dnem nahoru jako na přednášce) a konstruujte přitom odpovídajícím způsobem derivační strom.

Teoretická informatika průběh výuky v semestru 5 Příklad 4.2 Doplňte(neúplné) argumenty v poznámkách u programu, z nichž by měla vyplynout správnost, tedy, že výpočet končí s OK přesně pro(správně utvořené) regulární výrazy nad abecedou {a,b}.přitombysteměliodhalit,žetomutaknení!(jsoutamalespoňdvěrůzné chyby.) Příklad 4.3 Uvažujmejazyksestávajícízevšechbooleovskýchformulísproměnnými x1,x2,x3,... a logickýmispojkami,, ;mohousevnichpoužívatzávorky(,),alenenínutnéplně závorkovat. Každá taková formule je tedy řetězcem v abecedě Σ={x,0,1,2,3,4,5,6,7,8,9,,,,(,)}; jako příklad může sloužit řetězec( x15 x2 x5) x21 (x2 x5), který do jazyka patří. (Samozřejmězdemůžemepreferovatpřehlednějšízápis( x 15 x 2 x 5 ) x 21 (x 2 x 5 ), ale to není podstatné.) Navrhněte co nejjednodušší bezkontextovou gramatiku generující uvedený jazyk. Takto navržená(jednoduchá) gramatika asi není jednoznačná; ověřte. Zkonstruujte pak pro stejný jazyk jednoznačnou gramatiku, u níž derivační stromy přirozeně odpovídají obvyklé prioritě operátorů: negace váže silněji než konjunkce a konjunkce váže silněji než disjunkce.(zkuste postupovat podobně jako při konstrukci bezkontextové gramatiky generující regulární výrazy, tedy přidáváním vhodných neterminálů.) Příklad 4.4 Navrhněte bezkontextové gramatiky generující následující jazyky: L 1 = {w {a,b} wobsahujepodslovo baab} L 2 = {w {a,b} w b mod3=0} L 3 = {ww R w {a,b} } L 4 = {0 n 1 m 0 n m,n 0} L 5 = {0 n 1 m 1 n m 2n} L 6 = {w {a,b} w=w R }, L 7 jejazykposloupnostívabecedě {(,),[,]},kteréodpovídajísprávnémuuzávorkování. Příklad 4.5 Snažte se co nejvýstižněji charakterizovat jazyk generovaný gramatikou S bss a. (Možná vám pomůže chápat a jako atomický výraz a b jako binární operátor.)

Teoretická informatika průběh výuky v semestru 6 Příklad 4.6 Navrhnětebezkontextovougramatiku Gtak,že L(G)=L 1 L 2 kde L 1 = {w {a,b} wobsahujepodřetězec bab} L 2 = {a n u u {a,b} a1 n délka(u) 2n } Přitompoužijte Sjakopočátečníneterminál,apokudmožnojenjednopravidlosSna levé straně.(snažte se o přehledný návrh využívající co nejméně pravidel.) Nejprvenavrhnětegramatiky G 1,G 2 projazyky L 1,L 2 aznichjsmepakjednodušezískejte gramatikupro L 1 L 2 (jakjenaznačenovčásti5.2.,s.166).uvědomtesi,pročjeobecně důležitézajistit,abymnožinyneterminálůgramatik G 1 a G 2 bylydisjunktní. Příklad 4.7 Zjistěte,zdapronásledujícígramatiku Gje L(G),čilizdalzezneterminálu Svygenerovat alespoň jedno terminální slovo. S as AB CD A adb AD BC B bsb BB C BA ASb D ABCD ε Zobecněte svůj postup, tedy navrhněte algoritmus, který toto zjišťuje pro jakoukoli zadanou bezkontextovou gramatiku. Přitompostupujteobecnějitak,žealgoritmusprodanou G=(Π,Σ,S,P)sestrojímnožinu T G = {X Π u Σ : X u}.množinu T G nejdřívezadejtejednoduchouinduktivní definicí: (X v) P,v Σ = X T G, Příklad 4.8 (Nepovinně.) Uvažujmejazyk L={w {a,b} ; w 1a w a = w b }. CharakterizujteslovazL 2 = L L.Jepravda,že L=L 2?Platípřípadněalespoňjednaz inkluzí L L 2, L 2 L? CharakterizujteslovazL L 2. Na základě předešlých úvah navrhněte bezkontextovou gramatiku generující L.

Teoretická informatika průběh výuky v semestru 7 Příklad 4.9 (Nepovinně.) Navrhněte bezkontextovou gramatiku generující jazyk všech palindromů v abecedě {a, b}, jejichž délka je násobkem tří. (Jednásetedyojazyk L={w {a,b} w=w R a( w mod3)=0}.) Zkuste nejprve najít gramatiku používající jediný neterminál. Poté popřemýšlejte, jestli použitím více neterminálů dokážete počet potřebných pravidel zmenšit. (Nakonec porovnejte s řešením Cvičení 4.13. na s. 137.)