Flex | |
---|---|
Típusú | lexikális elemző generátor |
Szerző | Vern Paxon [d] [1][2] |
Fejlesztő | Vern Paxon [d] [1][3] |
Beírva | Xi |
Operációs rendszer | Unix-szerű |
Első kiadás | 1987 [4] |
Hardver platform | többplatformos szoftver |
legújabb verzió | |
Engedély | BSD |
Weboldal | github.com/westes/flex |
Flex (Fast Lexical Analyzer) - lexikális elemző generátor . Lecseréli a Lex -et a GNU -csomagokon alapuló rendszereken, és hasonló funkciókkal rendelkezik. A Flex azonban nem része a GNU Projectnek [7] .
A Lex egy lexikális elemző eszköz, amellyel előre meghatározott módon kinyerhetünk bizonyos karakterláncokat a forrásszövegből . A Yacc egy elemző eszköz ; beolvassa a szöveget, és segítségével egy szósorozatot strukturált formátumba lehet alakítani további feldolgozás céljából. [nyolc]
A bemeneten a program egy szabad formátumú szöveget és a tokenek kiemelésének szabályait kapja, a kimeneten pedig megadja az elemző kódot, függvény formájában C nyelven . [9]
A szabályokat reguláris kifejezésekként adjuk meg a bal oldalon, és általában C kódot a jobb oldalon. Három szakaszt tartalmaznak, amelyeket a „%%” sor választ el:
Definíció blokk %% Szabályblokk %% C kód blokkA definíciók kezdőértékeket és definíciókat, szabályokat, magukat a kifejezéseket és a hozzájuk tartozó műveleteket tartalmazzák; a felhasználói kód egyszerűen benne van a flex kimenetben. Egyes szakaszok hiányozhatnak.
Az elemző függvény bemenetként veszi a szöveget, és minden talált tokenhez végrehajtja a megadott kódot. Például ez a kód kinyomtatja a következőt: f ("%s", getlogin ()) a felhasználónév minden előfordulásakor a szövegben :
%% felhasználónév printf ( "%s" , getlogin () );Ez a függvény kiírja a folyamba a getlogin() függvény által visszaadott karakterláncot. Ez azt jelenti, hogy a bemeneti adatfolyamban a felhasználónév minden előfordulása lecserélődik a getlogin() által visszaadott értékre.
Szabályok, amelyek szerint a végső függvénynek ki kell nyomtatnia a token típusát (if, változó , szám, unáris vagy bináris művelet ) és egyes tokenek értékeit:
%% if printf ( "IF utasítás \n " ); [ a - z ] + printf ( "címke, érték %s \n " , yytext ); { D } + printf ( "tizedes szám %s \n " , yytext ); "++" printf ( "unary op \n " ); "+" printf ( "bináris művelet \n " );Példa a szövegben lévő sorok és karakterek számának megszámlálására:
% { int sorok száma = 0 , karakterek száma = 0 ; % } %% \ n ++ sorok_száma ; ++ karakterek száma ; . ++ karakterek száma ; %% fő () { ylex (); printf ( "sorok száma = %d, karakterek száma = %d \n " , sorok száma , karakterek száma ); }A generátor által generált függvény a következő token megtalálásához használható elemző generátorokkal . A legtöbb esetben a flexet yacc vagy GNU bison esetén használják .