Flex (lexikális elemző generátor)

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2018. április 14-én felülvizsgált verziótól ; az ellenőrzések 5 szerkesztést igényelnek .
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] .

Használat

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 blokk

A 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 ; %% () { 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 .

Jegyzetek

  1. 1 2 https://cvsweb.openbsd.org/src/usr.bin/lex/README
  2. https://cvsweb.openbsd.org/src/usr.bin/lex/parse.y
  3. https://cvsweb.openbsd.org/src/usr.bin/lex/COPYING
  4. (meghatározatlan cím) - P. 9. - ISBN 978-0-596-15597-1
  5. Kiadás 2.6.4 - 2017.
  6. Lex 2.6.4 megjelent  (angolul) – 2017.
  7. Cameron Mackinnon. Rugalmas GNU vagy sem? (nem elérhető link) (1996. december 2.). Letöltve: 2010. augusztus 1. Az eredetiből archiválva : 2012. április 29.. 
  8. [ IBM. Haszon.  (nem elérhető link) . Hozzáférés dátuma: 2010. június 18. Az eredetiből archiválva : 2009. január 22. IBM. Haszon.  (nem elérhető link) ]
  9. Általában yylex().

Linkek