Fordítóprogramok felépítése, az egyes programok feladata. A következő jelölésmódot használjuk: program(bemenet)(kimenet)



Hasonló dokumentumok
Fordítóprogramok. Ajánlott irodalom. Jelölések 2. Jelölések 1. Fordítóprogramok szerkezete. Elıadó: Pozsgai Tamás. Aho-Sethi-Ullmann: Compilers

Informatika szigorlat. A lexikális elemző feladatai közé tartozik a whitespace karakterek (a

FORDÍTÓPROGRAMOK. MKSA3144F kidolgozott tételek ás verzió január 21., Domján Tamás

Fordítóprogramok szerkesztése Flex és Bison segítségével

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

15. Programok fordítása és végrehajtása

akonyv 2006/12/18 11:53 page i #1 Formális nyelvek és fordítóprogramok

PROGRAMOZÁS MÓDSZERTANI ALAPJAI I. TÉTELEK ÉS DEFINÍCIÓK

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

Írta: GYIMÓTHY TIBOR HAVASI FERENC KISS ÁKOS FORDÍTÓPROGRAMOK. Egyetemi tananyag

Miért van szükség fordítóprogramokra? Fordítóprogramok célja és szerkezete. Miért van szükség fordítóprogramokra?

Számítástudomány matematikai alapjai segédlet táv és levelező

A digitális számítás elmélete

Mesterséges intelligencia 1 előadások

Fordítóprogram (compiler), értelmezőprogram (interpreter)

Programozási módszertan. Dinamikus programozás: Nyomtatási feladat A leghosszabb közös részsorozat

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Bevezetés a C++ programozásba

p j p l = m ( p j ) 1

Fordítóprogramok szerkezete avagy Mi történik Pascalban mikor F9-et nyomunk?

Fordítóprogramok (A,C,T szakirány) Feladatgy jtemény

Általános statisztika II. Kriszt, Éva Varga, Edit Kenyeres, Erika Korpás, Attiláné Csernyák, László

Fordítóprogramok. Aszalós László szeptember 7.

Karakterkészlet. A kis- és nagybetűk nem különböznek, a sztringliterálok belsejét leszámítva!

Miről mire fordít a fordítóprogram? Miről mire fordít az assembler? Mi a különbség a fordítóprogram és az interpreter között? Mi a virtuális gép?

9. előadás Környezetfüggetlen nyelvek

8. Mohó algoritmusok Egy esemény-kiválasztási probléma. Az esemény-kiválasztási probléma optimális részproblémák szerkezete

II. év. Adatbázisok és számítógépek programozása

Tárgymutató. Typotex Kiadó. Csörnyei Zoltán. akonyv 2007/3/9 6:29 page 315 # , >, 205 <, 96, 108, 115 >, 96, 108, 115 =, 96, 108

Alkalmazott modul: Programozás

Erdélyi Magyar TudományEgyetem (EMTE

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere

Egyszerű programozási tételek

Teljes visszalépéses elemzés

C programnyelv 1. Kedves Kollegina, Kolléga!

Automaták és formális nyelvek

JANUS PANNONIUS TUDOMÁNYEGYETEM. Schipp Ferenc ANALÍZIS I. Sorozatok és sorok

\ _/ / / _ \ ' / _` / ' / _ \ / _` (_) (_ (_) (_ \_ \ / _ \,_\ \ / \, / / 2.1. Alapfogalmak. 1. Mirol mire fordít a fordítóprogram?

MATEMATIKA 9. osztály Segédanyag 4 óra/hét

Mesterséges Intelligencia I. (I602, IB602)

Tesztkérdések az ALGORITMUSELMÉLET tárgyból, 2001/ félév

4. Programozási nyelvek osztályozása. Amatőr és professzionális

A számítógépes nyelvészet elmélete és gyakorlata. Automaták

Fordítóprogramok beugrókérdések

AUTOMATÁK ÉS FORMÁLIS NYELVEK PÉLDATÁR

5. Trigonometria. 2 cos 40 cos 20 sin 20. BC kifejezés pontos értéke?

Kutatói tájékoztató Útmutató a KSH kutatószobai környezetében folyó kutatómunkához

Véletlenített algoritmusok. 4. előadás

Mikroprocesszor CPU. C Central Központi. P Processing Számító. U Unit Egység

Kvantum-hibajavítás II.

1. Bevezetés. A számítógéptudomány ezt a problémát a feladat elvégzéséhez szükséges erőforrások (idő, tár, program,... ) mennyiségével méri.

mhtml:file://d:\vizsga\html\hogyan szerkeszteni weboldalt - HTML alapok.mht

sallang avagy Fordítótervezés dióhéjban Sallai Gyula

INFORMATIKAI ALAPISMERETEK

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

Műszerek tulajdonságai

Java II. I A Java programozási nyelv alapelemei

Matematikai logika. Nagy Károly 2009

4. MODUL TÁBLÁZATKEZELÉS. A vizsgázónak önállóan kell elindítania a táblázatkezelő alkalmazást, majd a munka végeztével be kell zárnia azt.

Fordítóprogramok. és formális nyelvek

Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma) Geometria I.

Lineáris programozás. Modellalkotás Grafikus megoldás Feladattípusok Szimplex módszer

Adatok szűrése, rendezése

Analízisfeladat-gyűjtemény IV.

Áttekintés a felhasznált lineáris algebrai ismeretekről.

Formális nyelvek és gépek (definíciós és tétel lista - 09/10/2)

Programozás I. Metódusok C#-ban Egyszerű programozási tételek. Sergyán Szabolcs

Regressziószámítás alkalmazása kistérségi adatokon

Bevezetés a C programozási nyelvbe. Az Általános Informatikai Tanszék C nyelvi kódolási szabványa

Az F# nyelv erőforrásanalízise

Információs Technológia

Egyszerű RISC CPU tervezése

Részstruktúrák keresése molekulagráfokban

Algoritmizálás. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar

FELADATOK A. A feladatsorban használt jelölések: R + = {r R r>0}, R = {r R r < 0}, [a; b] = {r R a r b}, ahol a, b R és a b.

Számítógépes grafika

Matematikai statisztikai elemzések 6.

1. Számoljuk meg egy számokat tartalmazó mátrixban a nulla elemeket!

Relációs algebra áttekintés és egy táblára vonatkozó lekérdezések

Formális nyelvek és automaták vizsgához statisztikailag igazolt várható vizsgakérdések

- Levelek: operandusok - Csomópontok: operátorok. Fenti kifejezés: (x+ (y 10)) * (6 / z) Bináris Keresőfa (BST) Példa bináris keresőfára.

C programozás. 1 óra Bevezetés

A számítógép alapfelépítése

Országzászlók (2015. május 27., Sz14)

Reiczigel Jenő,

Bisonc++ tutorial. Dévai Gergely. A szabály bal- és jobboldalát : választja el egymástól. A szabályalternatívák sorozatát ; zárja le.

Novák Attila (2003): Milyen a jó Humor? In: Magyar Számítógépes Nyelvészeti Konferencia (MSZNY 2003). Szegedi Tudományegyetem,

Gyakorló feladatok ZH-ra

C# feladatok gyűjteménye

2.3. A C nyelv utasításai

Széchenyi István Szakképző Iskola

Analízis előadás és gyakorlat vázlat

SZÉCHENYI ISTVÁN EGYETEM MŰSZAKI TUDOMÁNYI KAR RENDSZERELEMZÉS I.

Operációs rendszerek 2 3. alkalom - Reguláris kifejezések, grep, sed. Windisch Gergely windisch.gergely@nik.uni-obuda.hu

Mintapélda. Szerzők, Hát Mi november Példák bekezdésekre, kiemelésre, elválasztásra Ábrák... 2

II. Szabályalapú következtetés

7. Szisztolikus rendszerek (Eberhard Zehendner)

Fordító részei. Fordító részei. Kód visszafejtés. Izsó Tamás szeptember 29. Izsó Tamás Fordító részei / 1

Occam 1. Készítette: Szabó Éva

Átírás:

Fordítóprogramok. (Fordítóprogramok felépítése, az egyes komponensek feladata. A lexikáliselemző működése, implementációja. Szintaktikus elemző algoritmusok csoportosítása, összehasonlítása; létrehozásuk és működésük vázlatos ismertetése. Az ATG-k szerepe és alapfogalmai. Kódgenerálás assemblyben alapvető imperatív vezérlési szerkezetekehez.) Csörnyei Z. könyve alapján Fordítóprogramok felépítése, az egyes programok feladata A következő jelölésmódot használjuk: program(bemenet)(kimenet) A fordítóprogram struktúrája: compiler(forrásnyelvű program)(tárgyprogram, lista) input-handler(forrásnyelvű program)(karaktersorozat) : első lépés egy olyan program végrehajtása, amelyik a forrásnyelvű programot a fordítás számára könnyen hozzáférhető karaktersorozattá alakítja. output-handler(forrásnyelvű program, hibák)(lista) : forrásnyelvű sorokból egy listát készít, melyet a háttértárolón, egy fájlban, az oprendszertől függő formátumban helyezi el. source-handler(forrásnyelvű program, hibák)(karaktersorozat, lista): mivel az input- és az output-handlernek is a bemenete a forrásnyelvű program, ezért ezt célszerű egy programba összefoglalni. code-handler(tárgykód)(tárgyprogram) : a compiler által készített tárgykódot is háttértárolón, egy fájlban (pl.: relokálható bináris formátumban) kell elhelyezni. A code-handler ezt a műveletet végzi. Tehát a következő lesz a fordítóprogram struktúrája összefoglalva: source-handler(forrásnyelvű program, hibák)(karaktersorozat, lista) compiler(karaktersorozat)(tárgykód, hibák) code-handler(tárgykód)(tárgyprogram) forrásnyelvű program source-handler lista compiler code-handler tárgynyelvű program A compiler felépítése A felbontás nem szekvenciát jelöl, hanem a fordítóprogramot 3 egymástól jól elkülöníthető funkcionális, működési egységre bontottuk fel.

A source-handler és a code-handler végzi el az összes perifériafüggő és az oprendszertől függő műveleteket, a compiler most már ténylegesen csak a fordítással foglalkozik. Az compilernek két nagy feladatot kell megoldania: 1. analizálni a bemeneten kapott karaktersorozatot : a forrásnyelvű program karaktersorozatát részekre bontja és ezt vizsgálja 2. szintetizálnia a tárgykódot : az egyes részeknek megfelelő tárgykódokból építi fel a program teljes tárgykódját Analízis feladatai: 1. lexikális elemző(karaktersorozat)(szimbólumsorozat, lexikális hibák) A karaktersorozatban meghatározza az egyes szimbolikus egységeket, a konstansokat, változókat, kulcsszavakat, operátorokat. Kiszűri a szóköz karaktereket, a forrásnyelvű programba írt kommenteket (ezekből tárgykód nem származik). Több sorba írt utasítás összeállítása (magasszintű nyelveknél) 2. szintaktikus elemző(szimbólumsorozat)(szintaktikusan elemzett program, szintaktikus hibák) program struktúrájának felismerése és ellenőrzése a szimbólimsorozatban az egyes szimbólumok a megfelelő helyen vannak-e, sorrendjük megfelel-e a prognyelv szabályainak, nem hiányzik-e vhonnan egy szimbólum 3. szemantikus elemző(szintaktikusan elemzett program)(analizált program, szemantikus hibák) pl.: megvizsgálja hogy egy adott műveletben megadott szimbóum deklarálva van-e, konstansnak van-e értéke, típusok azonosak-e. Szintézis feladatai: 1. kódgenerátor(analizált program)(tárgykód) Legtöbb fordítóprogram tárgykódként az adott szgép assembly nyelvű vagy gépi kódú programját állítja elő 2. kódoptimalizáló(tárgykód)(tárgykód) Egyszerű esetben: a tárgykódban lévő azonos programrészek felfedezése és egy alprogramba való helyezése, vagy hurkok ciklusváltozótól független részeinek megkeresését és hurkon kívül való elhelyezését jelenti. Bonyolultabb: gépfüggő kódoptimalizáló programok, amleyek pl.: optimális regiszterhasználatot biztosítanak. ANALÍZIS lexikális elemző szintaktikus elemző szemantikus elemző SZINTÉZIS kódgeneráló kódoptimalizáló

A lexikális elemző működése, implementációja A szimbolikus egységek precíz defje reguláris grammatikával, más néven Chomsky 3-as típusú grammatikával, reguláris kifejezésekkel vagy determinisztkus automatával adható meg. Lexikális elemző létrehozásának menete: 1. A szimbolikus egységek leírását a reguláris kifejezések nyelvén adjuk meg, és megkonstruáljuk az ekvivalens determinisztikus véges automatát, 2. elkészítjük a determinisztikus véges automata implementációját (könnyen implementálható a case utasítás használatával) Működésének alapelve, hogy egy szimbólumot mindig a lehető leghosszab karaktersorozatból kell felépíteni. Inputjában benne van az összes benne van az összes szóköz és tabulátor jel (korábban csak a kocsivissza, és soremelés karaktereket hagyta el a source-handler) (tab space)* kiszűrése, nem adja ezeket tovább. Egy szimbólumhoz egy előre megadott kódot rendel, és ez a kód kerül majd bele a lex. elemző outputjába. Tartalmazhat kiegészítő információkat is, pl.: konstans szimbólum típusa, értéke (erre az infokra pl. a szemantikus elemzőnek lesz szüksége). Az információk tárolására az elemzők egy szimbólumtáblát használnak, és a szimbólum kódja után egy pointert helyeznek el, ami a szimbólumhoz tartozó szimbólumtábla bejegyzésre mutat. Működése során fellépő speciális problémák: Kulcsszavak: programozási nyelvben olyan azonosítók, melyeknek speciális célra fenntartott nevük, előre definiált jelentésük van. Eredeti jelentésüktől eltérő módon nem használhatóak. Standard szavak: az előzőek ezekre is fennállnak, azzal a kivétellel hogy jelentésük a programban megváltoztathatóak. Felismerésük egyszerű, ha ezeket speciális karakterekkel írják, vagy speciális elő-és utókarakterekkel jelölik meg. Kezelésükre két módszer van: külön táblázatban tároljuk a kulcsszavakat minden kulcsszót reguláris kifejezéssel írunk le, és megadjuk reguláris kifejezésekhez tartozó automata implementációját Az előreolvasás: a leghosszabb karaktersorozatból álló szimbólum felismerésére törekszik, a szimbólum jobb oldali végpontjának meghatározására gyakran egy vagy több karaktert előre kell olvasnia. Ezért a reguláris kifejezések leírásában bevezetnek a szimbólum jobb oldali végpontjának bevezetésére egy / jelet, melyet előreolvasási operátornak neveznek. pl.: DO / (betű szjegy)* = (betű szjegy)* Direktívák a forrásnyelvekben a direktívák a fordítóprogram működésének vezérlésére szolgál a direktívákat és a a direktívák operandusaiban szereplő szimbólumokat is a lex. elemzőnek kell meghatároznia. A lex. elemzőnek már szintaktikus és szemantikus ellenőrzéseket is kell végeznie, és kódjellegű információt előállítania. pl.: ha a direktíva a feltételes fordítás if direktívája, fel kell ismernie a direktíva összes szimbólumát, majd kiértékelnie az elágazás feltételét, amely

ha false akkor nem szabad a sorokban szereplő szimbólumokat elemeznie addig, amíg egy endif vagy egy else direktívát nem talál. Hibakezelés Ha a lexikális elemző egy karaktersorozatnak nem tud egy szimbólumot sem megfeleltetni, akkor azt mondjuk, hogy a karaktersorozatban lexikális hiba van Leggyakoribb okai: illegális karakterek karakterek felcserélődése karakterek hiánya Nem célszerű hiba esetén az elemzést megszakítani, így vmilyen hibaelfedő algoritmusra van ilyenkor szükség, amely lehetőséget biztosít arra hogy az elemzés a lehető legkevesebb karakter kihagyásával folytatódjon Leggyakrabban előforduló hibák és lehetséges hibaelfedő módszereik Nem megengedett (illegális) karakter a karaktersorozatban: 2 megoldás lehetséges 1. nem foglalkoznak a beolvasott karakterrel, az elemzést a következő, még nem vizsgált karakterrel folytatják 2. tetszőleges karakterrel (ált. space) karakterrel helyettesítik Kulcsszavak írása történhet speciális karaktertípussal vagy speciális zárójelezéssel. Ekkor a kulcsszavak elemzésénél az illegális karakter miatti hibák kiküszöbölhetők. Hiányzó karaktereknek gyakran az a hatásuk, hogy a lexikális elemző nem tudja a szimbólumokat elkülöníteni egymástól. Számok formátumhibája Karakterstringek és kommentek terminátorainak hiányai vagy hibái. Ezek kezelésére különösen nagy gondot kell fordítani. Szintaktikus elemző algoritmusok csoportosítása, összehasonlítása; létrehozásuk és működésük vázlatos ismertetése Felülről-lefelé elemzések Def.: Ha A α P, akkor az xaβ mondatforma legbaloldalibb helyettesítése xαβ, azaz xaβ xαβ Def.: Ha az S x * levezetésben minden helyettesítés legbaloldalibb helyettesítés, akkor ezt a levezetést legbalodalibb levezetésnek nevezzük. Teljes visszalépéses elemzés algoritmusa: c 1,c 2,...,c n az elemzendő szimbólumsorozat. Az elemzés állapotait az (s,i,α,β) négyesekkel írjuk le, ahol s az állapot típusa q = normálállapot b = visszalépés t = az elemzés vége legbal

i az input szövegre mutató pointer α a vizsgált mondatforma elemzésének történetét tartalmazó verem tartalma β a vizsgált mondatformát tartalmazó verem tartalma Kezdőállapot: (q, 1, ε, S#) Állapotátmenetek: szintaxisfa építése az első szabállyal: ha A 1 γ 1, akkor (q, i, α,αβ) (q, i, αa 1, γ 1 b) input szimbólum olvasása: c i = a akkor (q, i, α,aβ) (q,i+1,αa,β) c i a akkor (q, i, α,aβ) (b,i,α,aβ) visszalépés az input szövegben: (b,i,αa,β) (b,i-1,α,aβ) következő alternatív helyettesítési szabály keresése: (b,i,αa j, γ j b) ha i=1, A=S és az S-nek csak j helyettesítési szabálya van, akkor az algoritmus szintaktikus hiba detektálásával befejeződik: (b,1,αs j,γ j β) (t,1,αs j,γ j β) ha van A j+1 γ j+1 szabály, akkor (b,i,αa j, γ j β) (q,i,αa j+1,γ j+1 β) egyébként, azaz már felhasználtuk az A minden alternatíváját, (b,i,αa j, γ j β) (b,i, α, Αβ) sikeres befejezés (q,n+1,α,#)(t,n+1, α, ε) Korlátozott visszalépéses elemzés: A teljes visszalépéses elemzés olyan módosítással, hogyha eljutottunk egy S xaβ * levezetéshez, és A α k helyettesítés következik, amiből visszajutunk oda, ahol ezt a szabályt alkalmaztuk, akkor a teljes visszalépéses elemzés A α k helyett a következő A α k+1 szabályt alkalmazza, és az elemzés folyatódhat tovább. A korlátozott visszalépéses elemzés azonban ezt a A α k+1 -re való áttérést már nem hajtja végre, az elemzést szintaktikus hiba találásával befejezi. Az egyszerű LL(1) grammatika Def.: A G grammatikát egyszerű LL(1) grammatikának nevezzük, ha ε-mentes minden helyettesítési szabály jobb oldala terminális szimbólummal kezdődik, alternatívák esetén a jopbb oldalak kezdő terminálisai páronként különbözőek, azaz A a 1 α 1 a 1 α 1 a k α k, ahol ai aj, ha i j Az elemző táblázat kitöltése: (bβ,i), ha X β az i-edik helyettesítési szabály pop, ha X = b M[X,b] = accept, ha X = # és b=# error egyébként. Az elemzés állapotai (ay#, Ya#, v): (még nem elemzett szöveg, az elemzés mondatformájának még nem elemzett része, szabályok sorszáma) Kezdőállapot: (x#, S#, ε)

Az ε-mentes LL(1) grammatika Def.: A G ε-mentes grammatikát ε-mentes LL(1) grammatikának nevezzük, ha minden A nemterminális szimbólumra és k>1-re A α 1 α 2 α k esetén FIRST(α i ) FIRST(α j ) = 0, ha 1 i < j k (FIRST(α) = { α α aβ}) * Az elemző táblázat kitöltése (hasonló az egyszerű LL(1)-hez): (β,i), ha X β az i-edik helyettesítési szabály és b FIRST(β) pop, ha X = b M[X,b] = accept, ha X = # és b=# error egyébként. LL(k) grammatikák Def.: Legyen a FIRST k (α) (k 0) az α-ból levezethető szimbólumsorozatok k hosszúságú kezdő terminális sorozatainak halmaza, azaz FIRST k (α) = {x α xβ * és x = k} {x α x * és x <k} Def.: A G grammatika LL(k) grammatika, ha tetszőleges S waβ * wα 1 β wx S waβ * wα 2 β * wy levezetéspárra FIRST k (x) = FIRST k (y) esetén α 1 = α 2. Def.: Legyen FOLLOW k (β) a β-t tartalmazó mondatformák β utáni szimbólumsorozatainak k hosszúságú terminális prefixeiből álló halmaz, azaz: FOLLOW k (β) = {x S αβγ * és x FIRST k (γ) } és ha ε FOLLOWk(β), akkor legyen FOLLOW k (β) = FOLLOW k (β)\{ε} {#} Tétel: A G grammatika akkor és csak akkor LL(1) grammatika, ha minden A nemterminális szimbólumra A γ δ esetén FIRST 1 (γfollow 1 (A)) FIRST 1 (δfollow 1 (A)) = 0 Def.: A G grammatika erős LL(k) grammatika, ha tetszőleges S waβ * wα 1 β wx S waγ wα * 2 γ * vy levezetéspárra FIRST k (x) = FIRST k (y) esetén α 1 = α 2. Def.: LEFT k (a, g) = FIRST k (x) S waβ * wγβ * wx Def.: Az A nemterminális szimbólumot balfaktorizált szimbólumnak nevezzük, ha minden A γ δ esetén LEFT 1 (A, γ) LEFT 1 (A, δ) = 0

LL(1) elemzés táblázattal (β,i), pop, M[X,b] = accept, error ha X β az i-edik helyettesítési szabály és b FIRST 1 (β) vagy (ε FIRST 1 (β) és b FOLLOW 1 (X)) ha X = b ha X = # és b=# egyébként. A rekurzív leszállás módszere accept: terminális szimbólumok vizsgálatára procedure accept(szimbólum) begin if aktuális_szimbólum = szimbólum then következő_szimbólum else error(...) A szimbólumhoz tartozó eljárás procedure A begin T(A) T(A)-t az A-ra vonatkozó helyettesítési szabályok jobb oldalán álló szibólumok határozzák meg: A a szabályhoz rendelt program legyen az accept(a) A B szabályhoz rendeljük hozzá a B eljáráshívást A X 1 X 2...X n tartozzon a következő blokk: begin T(X_1) T(X_2) T(X_n) A α 1 α 2 α k case aktuális_szimbólum of FIRST_1(alpha_1): T(alpha_1) FIRST_1(alpha_2): T(alpha_2) FIRST_1(alpha_n): T(alpha_n) ha van e akkor az a sor FOLLOW_1(A) : skip