Flex tutorial. Dévai Gergely



Hasonló dokumentumok
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.

Bevezetés a programozásba I.

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

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

Bevezetés a programozásba I.

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

BASH SCRIPT SHELL JEGYZETEK

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.

Operációs rendszerek gyak.

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

Szkriptnyelvek. 1. UNIX shell

C programozási nyelv

BASH script programozás II. Vezérlési szerkezetek

AWK programozás Bevezetés

1. Alapok. #!/bin/bash

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

II. Mérés SZÉCHENYI ISTVÁN EGYETEM GYŐR TÁVKÖZLÉSI TANSZÉK

8. Laboratóriumi gyakorlat: Bevezetés a reguláris kifejezések használatába

INFORMATIKAI ALAPISMERETEK

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

Bevezetés a programozásba I.

length (s): Az s karaklerlánc hossza, substr(s,m,n): Az s mezőben levő karakterláncnak az m-edik karakterétől kezdődő, n darab karaktert vágja ki.

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

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Oktatási Hivatal. A 2014/2015 tanévi Országos Középiskolai Tanulmányi Verseny döntő fordulójának feladatai. II. (programozás) kategória

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

INFORMATIKA javítókulcs 2016

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

Operációs rendszerek. 9. gyakorlat. Reguláris kifejezések - alapok, BASH UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

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

1. Jelölje meg az összes igaz állítást a következők közül!

Matematikai és matematikai statisztikai alapismeretek

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

Operációs rendszerek. 9. gyakorlat. BASH recap, reguláris kifejezések UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Operációs rendszerek 1.

Programozás II. 2. Dr. Iványi Péter

Bevezetés a programozásba I.

Pénzügyi algoritmusok

1. Írjunk programot mely beolvas két egész számot és kinyomtatja az összegüket.

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

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

Mesterséges intelligencia 1 előadások

2. Készítsen awk szkriptet, amely kiírja az aktuális könyvtár összes alkönyvtárának nevét, amely februári keltezésű (bármely év).

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:

INFORMATIKA tétel 2018

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:

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

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

Példatár a bevezetés a Matlab programozásába tárgyhoz

Programozás I. gyakorlat

Feladat. Bemenő adatok. Bemenő adatfájlok elvárt formája. Berezvai Dániel 1. beadandó/4. feladat április 13. Például (bemenet/pelda.

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós május 6. Széchenyi István Egyetem, Gy r

8. Laboratóriumi gyakorlat: Bevezetés a reguláris kifejezések használatába

Forráskód formázási szabályok

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

Komplex számok. Komplex számok és alakjaik, számolás komplex számokkal.

Aronic Főkönyv kettős könyvviteli programrendszer

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

Reguláris kifejezések 1.

5. Gyakorlat. struct diak {

Programozás C++ -ban 2007/7

Regionális forduló november 19.

Regionális forduló november 19.

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

HTML. Ismerkedés a JavaScripttel. A JavaScript lehet ségei. A JavaScript kód helye. Önálló JavaScript fájlok

ZH feladatok megoldásai

Készítette: Citynform Informatikai Zrt.

Operációs Rendszerek Gyakorlat Triviális segédfeladatok június PERL Tömbök és hashek Feladat: május 26-i beugró

Bevezetés a programozásba. 6. Előadás: C++ bevezető

Alprogramok, paraméterátadás

Java II. I A Java programozási nyelv alapelemei

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

EUROFLEX-33 ESEMÉNY NYOMTATÓ. -felhasználói és telepítői leírás-

C++ programozási nyelv Konstruktorok-destruktorok

Java és web programozás

Felhasználói kézikönyv Kisbanki NetBOSS - SMS

Lekérdezések az SQL SELECT utasítással

Kisvállalkozások könyvelése. Infotéka Kft. programjaival

VHR-23 Regisztráló műszer Felhasználói leírás

Egészítsük ki a Drupal-t. Drupal modul fejlesztés

0.1. Mi az a standard be- és kimenet? A két mintafeladat leírása

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

Programozási nyelvek JAVA EA+GY 1. gyakolat

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

3. Osztályok II. Programozás II

Szűrők, reguláris kifejezések AWK programozás: minták, vezérlési szerkezetek, tömbök, beépített függvények, reguláris kifejezések

INFORMATIKAI ALAPISMERETEK

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

3 A C programozási nyelv szintaktikai egységei

Halmazok. Halmazelméleti lapfogalmak, hatványhalmaz, halmazm veletek, halmazm veletek azonosságai.

Diszkrét matematika 1. középszint

Pénzügyi algoritmusok

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

ELTE SAP Excellence Center Oktatóanyag 1

Online algoritmusok. Algoritmusok és bonyolultságuk. Horváth Bálint március 30. Horváth Bálint Online algoritmusok március 30.

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Átírás:

Flex tutorial Dévai Gergely A Flex (Fast Lexical Analyser) egy lexikáliselemz -generátor: reguláris kifejezések sorozatából egy C/C++ programot generál, ami szövegfájlokat képes lexikai elemek sorozatára tördelni. A Flex forrásfájlok három 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 (%{ és %} között) C++ kód írható, valamint a gyakran el forduló reguláris kifejezésekhez makrók deniálhatók. A második részbe a reguláris kifejezések, a harmadikba ismét tetsz leges C++ kód kerül: opciók %{ %} C++ kód makrók %% reguláris kifejezések %% C++ kód 1

Összefoglaló a Flex által használt reguláris kifejezésekr l: x az x karakter. tetsz leges karakter, kivéve újsor [xyz] karakterhalmaz: vagy egy x, vagy egy y, vagy egy z [abj-oz] karakterhalmaz intervallummal [^A-Z] komplementer halmaz: bármilyen karakter kivéve a nagybet ket [^A-Z\n] bármilyen karakter kivéve a nagybet ket és újsort r* nulla vagy több r, ahol r tetsz leges reguláris kifejezés r+ egy vagy több r r? nulla vagy egy r (opcionális r) r{2,5} kett t l ötig valahány r r{2,} kett vagy több r r{4} pontosan négy r {name} a deklarációs részben magadott name makró kifejtése "[xyz]\"foo" az [xyz]"foo sztringliterál \ x a sepciális karakterek, pl. \n \t stb. \x2a a hexadecimális 2a kódú karakter (r) r; a zárójelek a m veleti sorrend jelölésére használhatók rs r után egy s (konkatenáció) r s r vagy s (unió) ^r r a sor elején r$ egy r a sor végén 1. példa Ez a tutorial a http://deva.web.elte.hu/fordprog/flex-peldak.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/flex1.l fájl tartalma Opciók: noyywrap: A forrásfájl végén az elemzésnek is vége lesz. c++: A generált program C++ nyelv lesz. C++ kód: A szükséges fejállományok beillesztése. Reguláris kifejezések: Ebben a példában egy sincs. C++ kód: Az egyszer ség kedvéért ide írjuk a main függvényt. Megnyitjuk az input.txt fájlt. Létrehozunk egy lexikális elemz objektumot (fl) a ex által generálandó osztályból (yyflexlexer). A konstruktorparaméterekkel adjuk meg, hogy honnan olvasson és hova írjon az elemz. 2

Az yylex() tagfüggvény meghívásával indítjuk el az elemzést. Abban az esetben, ha a Flex által generált lexikális elemz a forrásfájlban lexikális hibát talál, azaz a megadott reguláris kifejezések közül egyikre sem illeszthet az input, akkor az aktuális karaktert a megadott kimenetre továbbítja. Mivel ebben a példában egyetlen reguláris kifejezést sem adtunk meg, a teljes input a kimenetre kerül. Ez a lexikális elemz tehát a Unix cat parancsának bonyolult megvalósítása. :) 1.2. Fordítás és futtatás cd 1 flex flex1.l Ekkor keletkezik a lex.yy.cc fájl, benne kb. 1500 sornyi C++ kóddal. Megatalálhatóak benne a flex1.l fájlban általunk írt kódrészletek, pl. a main függvény kódja is. g++ -o flex1 lex.yy.cc A fordítás eredménye a flex1 futtatható állomány, a lexikális elemz../flex1 A futtatás során az input.txt tartalma jelenik meg a standard kimeneten. 2. példa Az el z programot úgy módosítjuk, hogy az input szövegben a username szó összes el fordulását cserélje le egy megadott felhasználói névre (pl. deva). Ehhez a username szóra illeszked reguláris kifejezést kell írni, ami a username. Flexben a reguláris kifejezésekhez C++-ban írt akciókat lehet társítani. A- mikor a lexikális elemt a megtalál egy lexikai elemet, a megfelel reguláris kifejezéshez csatolt kódrészlet lefut. A username reguláris kifejezéshez tehát a megfelel felhasználóinevet kiíró kódrészletet kell csatolni, ezért kerül a flex2.l fájlba a következ sor: username cout << "deva"; Az input minden olyan része, amely erre a reguláris kifejezésre nem illeszkedik, változtatás nélkül kerül a kimenetre. A projekt fordítása és futtatása az 1.2. pontban írtakkal analóg módon végezhet. 3

3. példa Olyan eszközt szeretnénk, amely C/C++ programkódokat HTML oldalon megjeleníthet formára alakít. Ehhez a HTML számára jelentéssel bíró karaktereket (pl. <, >) és az indentálás miatt fontos fehér szóközöket (szóköz, tab, sorvége) a nekik megfelel HTML kódra kell cserélni. Ennek megvalósítása látható a flex3.l fájlban. 4. példa Az input szöveg minden sora helyett annak sorszámát és hosszát szeretnénk kiírni (a sorvége karaktert is beleszámolva). Például az egy ketto harom input esetén a következ eredményt várjuk: 1 4 2 6 3 6 A megoldás készítésekor feltételezzük, hogy minden sor (az utolsó is) sorvége karakterrel terminálva van. 4.1. Els megoldás A Flex forrás els részében található C++ kódban változókat is deniálhatunk, amelyek használhatók a reguláris kifejezésekhez társított akciókban is. Létrehozunk tehát két változót az aktuális sor és oszlop pozíciók nyilvántartása céljából és kezd értéket is adunk nekik. Ha sorvége karaktert találunk, akkor ki kell írni a két változó aktuális értékét, majd inkrementálni kell a sorok számát, és alaphelyzetbe kell állítani az oszlopok számát. Ha tetsz leges más karakter jön, akkor az oszlop változót kell inkrementálni. Ez a megoldás a flex4.l fájlban található. 4.2. Második megoldás A Flex által generált C++ osztály biztosítja az YYLeng() tagfüggvényt, ami az aktuális lexikális elem hosszát adja meg. Ezt felhasználva is megoldhatjuk a feladatot, de ebben az esetben teljes sorokra illeszked reguláris kifejezést kell írni:.*\n { } cout << sor << ' ' << YYLeng() << endl; ++sor; 4

Ezt a megoldást használja a flex4v2.l fájl. 5. példa Az utolsó példában az input szöveget szavakra szeretnénk tördelni, és minden szóhoz megadni az els karakterének sor/oszlop pozícióját. A szó ebben a feladatban a bemenet olyan (nem b víthet ) részét jelenti, amely nem tartalmaz fehér szóközöket. Példa bemenet: Ez egy tobb sorbol allo szoveg. Példa kimenet: 1 1 Ez 1 7 egy 2 1 tobb 2 9 sorbol 2 16 allo 3 5 szoveg. 5.1. Els megoldás A flex5.l fájlban implementált megoldás is egy-egy változót használ a sor és oszlop információk tárolására, és három reguláris kifejezést deniál: Újsort, tabot és szóközt nem tartalmazó, nem üres sorozat: [\n\t ]+ Ebben az esetben a felismert szó pozícióját és az YYText() függvény segítségével magát a szót is a kimenetre kell írni, majd az oszlop változót a szó hosszával (YYLeng()) növelni kell. Újsor: \n A sorok száma eggyel n, az oszlop változó alapértékre áll vissza. A fenti reguláris kifejezésekre nem illeszked, tetsz leges karakter (esetünkben tab és szóköz):. Az oszlop változót kell inkrementálni. 5.2. Második megoldás A flex5v2.l megoldás kihasználja, hogy a lexikális elemz számon tudja tartani a sorok számát az yylineno opció használata esetén. Az el z megoldás szerkezete nem változik, csupán a sor változót váltjuk ki a lineno() függvény hívásával. 5

6. Tippek a beadandó elkészítéséhez A beadandó lexikális elemz elkészítéséhez érdemes tanulmányozni a következ példát: http://deva.web.elte.hu/fordprog/lexikalis-pelda.zip Ebben a példában már nem a Flex forrás végén található a main függvény, hanem külön forrásfájlban. A C++ fordítónak tehát két fájlt (lex.yy.cc és a main függvényt tartalmazó fájl) kell megadni. A reguláris kifejezések sorrendje fontos! Ha az input több reguláris kifejezésre is illeszkedik (pl. a while egy kulcsszó, de akár változónév is lehetne), akkor a sorrendben korábbi kategóriát választja az elemz. Ebb l következik, hogy a kiemelt lexikális elemeket (pl. kulcsszavak) a lista elején kell megadni. Az egyes kulcsszavakhoz érdemes külön-külön reguláris kifejezést készíteni, azaz while if then { helyett jobb megoldás a következ : } std::cout << kulcsszo: << YYText() << std::endl; while if then std::cout << kulcsszo: << YYText() << std::endl; std::cout << kulcsszo: << YYText() << std::endl; std::cout << kulcsszo: << YYText() << std::endl; Ennek fontossága az els beadandónál még nem látszik, de a szintaktikus elemz számára majd fontos lesz, hogy különbséget tudjon tenni ez egyes kulcsszavak között. Ha az automatikus ellen rz szoftver nem fogadja el a beadott megoldást, érdemes ellen rizni, hogy hibás bemenet esetén valóban 1 visszatérési értékkel fejez dik-e be az elemz. (Gyakorlatban: exit(1) utasítás a hibajelzés után.) 6