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.



Hasonló dokumentumok
Flex tutorial. Dévai Gergely

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

A Formális nyelvek vizsga teljesítése. a) Normál A vizsgán 60 pont szerezhet, amely két 30 pontos részb l áll össze az alábbi módon:

Chomsky-féle hierarchia

Bevezetés a programozásba I.

ZH feladatok megoldásai

Programozási nyelvek (ADA)

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

A Formális nyelvek vizsga teljesítése. a) Normál A vizsgán 60 pont szerezhet, amely két 30 pontos részb l áll össze az alábbi módon:

Segédanyagok. Formális nyelvek a gyakorlatban. Szintaktikai helyesség. Fordítóprogramok. Formális nyelvek, 1. gyakorlat

Operációs rendszerek gyak.

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

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

Chomsky-féle hierarchia

Feladatok: 1. Add meg a következ balreguláris nyelvtannak megfelel jobbreguláris nyelvtant!

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17

file./script.sh > Bourne-Again shell script text executable << tartalmat néz >>

Operációs rendszerek. 10. gyakorlat. AWK - bevezetés UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

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

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

Programozási nyelvek JAVA EA+GY 1. gyakolat

Ítéletkalkulus. 1. Bevezet. 2. Ítéletkalkulus

Pénzügyi algoritmusok

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Adatszerkezetek és algoritmusok

LOGIKA ÉS ÉRVELÉSTECHNIKA

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

AWK programozás, minták, vezérlési szerkezetek

AWK programozás, minták, vezérlési szerkezetek

Ítéletkalkulus. 1. Bevezet. 2. Ítéletkalkulus

Formális szemantika. Kifejezések szemantikája. Horpácsi Dániel ELTE Informatikai Kar

Emlékeztető: LR(0) elemzés. LR elemzések (SLR(1) és LR(1) elemzések)

Szemantikai elemzés. konzisztenciájának vizsgálata a szemantikai elemzés feladata lesz.

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

Rekurzió. Dr. Iványi Péter

C++ programozási nyelv

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.

Bevezetés a programozásba I.

S z á m í t ó g é p e s a l a p i s m e r e t e k

Szkriptnyelvek. 1. UNIX shell

AWK programozás Bevezetés

Haladó Fordítóprogramok

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

Teljes visszalépéses elemzés

A matematika nyelvér l bevezetés

PEDAGÓGIAI PROGRAM ÉS HELYI TANTERV MÓDOSÍTÁSA

Programozás I. gyakorlat

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

Deníciók és tételek a beugró vizsgára

1. Alapok. #!/bin/bash

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

Cekla. Készítette Doxygen Tue Sep :13:44

C programozási nyelv

A kódgenerálás helye a fordítási folyamatban. Kódgenerálás I. (kifejezések és vezérlési szerkezetek) A kódgenerálás feladata. Ebben az előadásban...

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

Adatbázisok. 2. gyakorlat SQL november november 12. Adatbázisok 1 / 31

Logikai ágensek. Mesterséges intelligencia március 21.

Dokumentáció. 1. Beadandó feladat

Szövegek C++ -ban, a string osztály

Adatbázisok. 9. gyakorlat SQL: SELECT október október 26. Adatbázisok 1 / 14

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Szoftvertechnolo gia gyakorlat

GPU Lab. 5. fejezet. A C++ fordítási modellje. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

1. Bevezetés szeptember 9. BME Fizika Intézet. Szám. szim. labor ea. Tőke Csaba. Tudnivalók. feladat. Tematika. Moodle Házi feladatok

Entity Framework alapú adatbáziselérés

Logikai következmény, tautológia, inkonzisztens, logikai ekvivalencia, normálformák

Fordító Optimalizálás

Gregorics Tibor Tanácsok modularizált programok készítéséhez 1

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Predikátumkalkulus. 1. Bevezet. 2. Predikátumkalkulus, formalizálás. Predikátumkalkulus alapfogalmai, formalizálás, tagadás, logikailag igaz formulák.

Mintavételes szabályozás mikrovezérlő segítségével

A C# programozási nyelv alapjai

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Funkcionális és logikai programozás. { Márton Gyöngyvér, 2012} { Sapientia, Erdélyi Magyar Tudományegyetem }

Fordítóprogramok: Lex és YACC

INFORMATIKA javítókulcs 2016

Diszkrét matematika 1. középszint

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Informatika terméktervezőknek

Java és web programozás

LOGIKA ÉS ÉRVELÉSTECHNIKA

Java II. I A Java programozási nyelv alapelemei

Az Excel programozása

BASH SCRIPT SHELL JEGYZETEK

Programozás I gyakorlat

Készítette: Citynform Informatikai Zrt.

2. Rekurzió. = 2P2(n,n) 2 < 2P2(n,n) 1

MBNK12: Permutációk (el adásvázlat, április 11.) Maróti Miklós

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

1. A k-szerver probléma

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

Adatszerkezetek és algoritmusok

Adatbázis rendszerek Gy: Algoritmusok C-ben

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Programozás C++ -ban 2007/1

4. Laborgyakorlat. A fájlokról ezeket az adatokat, a fájlrendszer tárolja. Számunkra az 1, 3, 4. oszlopok lesznek az érdekesek.

Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1

Átírás:

Bisonc++ tutorial Dévai Gergely A Bisonc++ egy szintaktikuselemz -generátor: egy környezetfüggetlen nyelvtanból egy C++ programot generál, ami egy tokensorozat szintaktikai helyességét képes ellen rizni. A Bisonc++ forrásfájlok két részb l állnak, ezeket %%-ot tartalmazó sorok választják el egymástól. Az els részbe kongurációs opciók és a tokentípusok deníciói írhatók. A második részbe a nyelvtan szabályai kerülnek: opciók tokendefiníciók %% nyelvtan A nyelvtanleírás konvenciói: A kezd szimbólum neve start. A terminálisok (tokenek) nagybet sek, a nemterminálisok kisbet sek. A szabály bal- és jobboldalát : választja el egymástól. Az alternatívák között szerepel. A szabályalternatívák sorozatát zárja le. C++ stílusú megjegyzések írhatók a szabályokhoz. Az ɛ-t üres szabályjobboldal valósítja meg, a gyakorlatban egy // ures megjegyzést szokás írni helyette. A jobboldalak után { és } között C++ kód írható, ami mindannyiszor végrehajtódik, amikor az adott szabályt az elemz használja. Ezek alapján a S ac C C ɛ bc nyelvtannak a következ felel meg: 1

start: A c c c: // ures B c 1. példa Ez a tutorial a http://deva.web.elte.hu/fordprog/bisonc++.zip címen elérhet példasort használja, ezt érdemes letölteni a következ k elolvasása el tt. 1.1. Az 1/lista.y fájl tartalma Opciók: %baseclass-preinclude <iostream> A generálandó osztályhierearchia sosztályába beilleszti az iostream fejállományt. Ez azokban a példákban lesz majd fontos, ahol a szabályokhoz csatolt akciókban írni akarunk a standard outputra. Tokenek: %token ELEM NYITO CSUKO VESSZO A tokentípusokat a %token direktíva segítségével deniáljuk. A nyelvtan terminálisai az itt felsorolt négy elem, melyekb l a Bisonc++ az általa generálandó Parser osztályba egy felsorolási típust fog létrehozni. A nyelvtan egy zárójelbe tett, vessz vel elválasztott elemekb l álló lista szintaxisát adja meg. 1.2. Az 1/lista.l fájl tartalma Ez egy Flex forrásfájl, melyr l részletes leírás itt található: http://deva.web.elte.hu/fordprog/flex-help.pdf A szintaktikus elemzés számára fontos részletek a következ k: #include "Parserbase.h" Ezt a fejállományt a Bisonc++ fogja generálni. Beillsztésével láthatóvá tesszük a lista.y fájlban megadott tokeneket. return Parser::ELEM Az egyes reguláris kifejezések sikeres illesztésekor a lexikális elemz vissza fog térni a megfelel tokennel. 2

1.3. Az 1/lista.cc fájl tartalma Ez a C++ forrás tartalmazza a main függvényt, amelyben ellen rizzük a panancssori argumentum meglétét és megpróbáljuk megnyitni a megadott fájlt. Ha ez sikeres, akkor ezzel az inputtal létrehozunk egy szintaktikus elemz objektumot (pars), melynek parse() metódusával indítjuk el az elemzést. 1.4. Fordítás I. cd 1 flex lista.l bisonc++ lista.y Ekkor keletkeznek a Parserbase.h, Parser.ih, Parser.h, parse.cc állományok. A Parser.ih és Parser.h állományokat szerkeszthetjük, mert a Bisonc++ a következ futtatásakor nem fogja felülírni ezeket a fájlokat. 1.5. Az 1/Parser.h fájl Ez a fejállomány deniálja a Parser osztályt. Ahhoz, hogy a szintaktikus elemz együtt tudjon m ködni a lexikális elemz vel, include-oljuk a FlexLexer.h fejállományt, felvesszük a lexikális elemz t a Parser osztály adattagjai közé (lexer), és hozzáadunk az osztályhoz egy konstruktort, ami a kapott bemeneti adatfolyammal inicializálja a lexert. (Ezt a konstruktort hívtuk meg a main függvényben.) 1.6. Az 1/Parser.ih fájl Ebben az implementációs fejállományban az error tagfüggvény átírásával szabhatjuk testre a hibaüzeneteket. Ez a fejállomány deniálja továbbá a Parser osztály lex() függvényét: Valahányszor a szintaktikus elemz nek szüksége van a szöveg következ tokenjére, ezt a függvényt hívja meg. Ebben a példában ennek a függvénynek összesen annyi a teend je, hogy meghívja a Parser osztály adattagjai közé felvett lexikális elemz objektum yylex() metódusát, és a kapott eredményt adja vissza. Ez az eredmény az, amit a Flex forrásfájlban látható return utasítások adnak. 1.7. Fordítás II. g++ -o lista lista.cc lex.yy.cc parse.cc A fordítás eredménye a lista futtatható állomány, a szintaktikus elemz../lista jo.txt./lista hibas.txt 3

A fordítás a mellékelt Makefile segítségével is elvégezhet a make parancs kiadásával. 2. példa A 2 könyvtárban található példa C stílusú függvénydeklarációk sorozatát képes elemezni. Nincs benne újdonság az el z példához képest, ezért érdemes abból kiindulva gyakorlatként megcsinálni: A jo.txt és hibas.txt fájlok alapján kitalálható, hogy milyen nyelvet szeretnénk elemezni. A 2-hibakezeles könyvtár tartalma azt mutatja meg, hogyan lehet jobb hibaüzenetet adni szintaktikus hiba esetén, illetve ilyen esetben is tovább folytatni az elemzést. A Flex forrásfájlban az yylineno opció segítségével gondoskodunk róla, hogy a lexikális elemz számlálja a sorokat. A Parser.ih fájlban a lex függvényben a lineno metódussal kérjük el a lexikális elemz t l az aktuális sorszámot, és ezt a Parser osztály d_loc adattagjának egyik mez jébe mentjük el. A Parser.ih fájlban deniált error függvényt úgy módosítjuk, hogy felhasználja ezt a helyinformációt. Az fl.y fájl nyelvtani szabályait kib vítjük úgy, hogy használja a speciális error nemterminális szimbólumot. Ha az elemz szintaktikus hibát észlel, akkor megpróbálja illeszteni az error-t tartalmazó hibaalternatívákat. Vigyázni kell arra, hogy mindig egy jól meghatározott terminális zárja le ezeket a hibaalternatívákat, különben könnyen koniktusokat okoznak a nyelvtanban. Javaslat: A beadandót el ször a hibaalternatívák nélkül érdemes elkészíteni, és ha elfogadásra került, akkor lehet próbálkozni az error szimbólumok bevezetésével. 3. példa Ez a példa a begin és end kulcsszavakkal körbezárt blokkokból és skip kulcsszavakból álló nyelvet elemzi. Az üres fájl helyes, valamint skip-ek és blokkok tetsz leges sorozata is helyes. Egy blokkban szintén tetsz leges skip illetve blokk sorozat lehet, az üres blokkok is megngedettek. Éredemes ezt a példát a jo.txt-ben adott példa alapján gyakorlásként megoldani. 4. példa Ez a példa a nulladrend logikai formulákat képes elemezni. A formulák logikai literálokból, változókból és logikai összekeöt jelekb l (negáció, konjunkció, 4

diszjunkció, implikáció, ekvivalancia) állnak. A nyelvtan nagyon egyszer, a formulák megadása a következ sémát követi: formula: IGAZ... formula VAGY formula formula ES formula Ez a nyelvtan azonban nem egyértelm! Például a true & true & true, vagy a true & true true formulákhoz több különböz szintaxisfa is rajzolható. Ezek közül a helyes fát a logikai összeköt jelek bal- illetve jobbasszociativitása és a rájuk vonatkozó precedenciaszabályok határozzák meg. Ezeket az információkat a Bisonc++ forrás elején adjuk meg a következ formában: %right EKV %right IMPL %left VAGY %left ES %right NEM A %right és %left direktívák a jobb- illetve balasszociativitást szabályozzák, míg a sorrend a precedenciát adja meg növekv sorrendben. Ezt a technikát a beadandóban szerepl aritmetikai és logikai operátorok esetén is érdemes alkalmazni. 5