Lex (informatika)
![](http://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Eric_Schmidt_at_the_37th_G8_Summit_in_Deauville_037.jpg/180px-Eric_Schmidt_at_the_37th_G8_Summit_in_Deauville_037.jpg)
A lex egy program, amely segítségével lexikális szabályokból lexikális elemző programkódot lehet generálni.[1][2] A lexet gyakran, de nem feltétlenül, a yacc parserrel kombinálva használják. A legtöbb Unix rendszer szabványos lexikális elemzője a lex.
A lex egy szövegfájlból olvassa be a lexikális szabályokat, s kimenetként C nyelvű kódot állít elő.
Több kereskedelmi és nyílt forráskódú implementációja is létezik. Az egyik népszerű nyílt forráskódú lex a flex (fast lexical analyzer).
A lex fájl szerkezete
[szerkesztés]A lex bemeneteként szolgáló lex fájlok szövegfájlok, melyek három részre oszlanak. Az egyes részeket dupla százalékjelet tartalmazó sorok határolják.
Definíciós rész %% Szabályok %% C kód
A definíciós részben lehet makrókat definiálni és header fájlokat importálni C szintaxissal. Ide tulajdonképpen tetszőleges C kód írható. Az egész bemásolódik a generált C forrásállományba.
A szabályok rész a lex file legfontosabb része. Egy-egy szabály egy szabályos kifejezést és egy hozzá tartozó C kódot tartalmaz. Amikor az elemző felismeri az adott szabályos kifejezést, akkor végrehajtja a hozzárendelt C kódot.
A záró C kód is bemásolódik a generált C forráskódba. Jellemzően olyan függvények implementációja kerül ide, amelyek a szabályokból meghívódnak. Nagyobb programoknál célszerű ezt a részt külön állományban tárolni és fordítási időben belinkelni.
Példa
[szerkesztés]Ez egy példa input file a flex nevű lex verzióhoz.
/*** definíciós rész ***/ %{ /* Ez a kód bemásolódik a generált C forrásba*/ #include <stdio.h> %} /* Ez az opció azt mondja meg, hogy csak egy input file kerüljön beolvasásra. */ %option noyywrap %% /*** Szabályok ***/ [0-9]+ { /* Az yytext változó tartalmazza az illeszkedő szövegrészt. */ printf("Találtam egy számot: %s\n", yytext); } . { /* Minden más karaktert ignorálunk. */ } %% /*** C kód. Ez is bemásolódik a generált C forrásba. ***/ int main(void) { /* Meghívjuk az elemzőt, majd kilépünk.*/ yylex(); return 0; }
Jegyzetek
[szerkesztés]- ↑ LEX & YACC, 2, O'Reilly, 1–2. o. (1992). ISBN 1-56592-000-7
- ↑ Levine, John. flex & bison. O'Reilly Media, 304. o. (2009. augusztus 1.). ISBN 978-0-596-15597-1
Fordítás
[szerkesztés]- Ez a szócikk részben vagy egészben a lex (software) című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.