Lex (informatika)

A Wikipédiából, a szabad enciklopédiából
Eric Schmidt, a Lex társírója.

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 | forrásszöveg szerkesztése]

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á tartózó 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 | forrásszöveg szerkesztése]

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 | forrásszöveg szerkesztése]

  1. LEX & YACC, 2, O'Reilly, 1–2. o (1992). ISBN 1-56592-000-7 
  2. Levine, John. flex & bison. O'Reilly Media, 304. o (2009. augusztus 1.). ISBN 978-0-596-15597-1 

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.