Lex

S Vikipedije, slobodne enciklopedije

U računarstvu, lex je računarski program koji generiše leksički analizator. Lex se obično koristi sa yacc-om. Lex, koji su napisali Erik Šmit (engl. Eric Schmidt) i Majk Lesk (engl. Mike Lesk), postao je standardni generator za leksički analizator na mnogim juniks sistemima, a ponašanje lex-a određeno je pravilima u POSIX standardu.

Lex čita ulazni tok i vraća kod koji implementira lexer u programskom jeziku C.

Verzije Lex-a bazirane na AT&T kodu su dostupne kao softver otvorenog koda, kao deo OpenSolaris-a i Plan 9 from Bell Labs-a. Druga popularna verzija Lex-a otvorenog koda je Flex, tj. brzi leksički analizator (engl. fast lexical analyzer).

Struktura lex programa[uredi | uredi izvor]

Struktura lex programa je namerno napravljena da bude slična strukturi yacc programa; programi su podeljeni na tri dela, odvojena linijama koje sadrže samo dva procentna znaka (%%), tj.:

Део за дефиниције
%%
Део за правила
%%
Део за C код
  • Definicijski deo je mesto gde se definišu makroi i poziva datoteka napisana na C-u. Ovde je takođe moguće napisati bilo kakav C kod koji će doslovno biti kopiran u generisanu izvornu datoteku.
  • Deo za pravila je najvažniji deo; on povezuje obrasce sa С-ovskim iskazima. Obrasci su regularni izrazi. Kada lexer vidi neki tekst na ulazu koji odgovara datom obrascu, onda on izvršava odgovarajući deo С koda. Ovo je osnovno u radu lex-a.
  • Deo za С kod sadrži С iskaze i funkcije koje se doslovno kopiraju u generisanu izvornu datoteku. Ovi С iskazi sadrže pozive pravila iz dela za pravila. U velikim programima mnogo je lakše ovaj deo koda zapisati u odvojenoj datoteci i onda je povezati za vreme kompajliranja.


Primer lex programa[uredi | uredi izvor]

Ovaj primer lex programa je za Flex verziju lex-a. Prepoznaje niske celih brojeva sa ulaza i samo ih štampa na izlaz:

/*** Део за дефиниције ***/

%{
/* C код ће да буде копиран дословно */
#include <stdio.h>
%}

/* Ово говори flex-у да чита само једау улазну датотеку */
%option noyywrap

%%
    /*** Део за правила***/

    /* [0-9]+ представља ниске које имају једну или више цифара */
[0-9]+  {
            /* yytext је ниска која садржи одговарајући препознати текст. */
            printf("Primecen ceo broj: %s\n", yytext);
        }

.       {   /* Игнориши све друге карактере. */   }

%%
/*** Део за С код***/

int main(void)
{
    /* Позове lexer и онда прекине */
    yylex();
    return 0;
}

Ako ovaj ulaz damo flex-u, on će biti konvertovan u C program, lex.yy.c. Kada se ovo komajlira i pokrene biće prepoznavane i ispisivane niske celih brojeva. Na primer, za dati ulaz:

abc123z.!&*2ghj6

program će ištampati:

Primecen ceo broj: 123
Primecen ceo broj: 2
Primecen ceo broj: 6

Korišćenje Lex-a sa Yacc-om[uredi | uredi izvor]

Lex i Yacc se obično koriste zajedno. Yacc koristi formalnu gramatiku da raščlani ulazni tok, a to Lex ne može da uradi koristeći samo regularne izraze. Sa druge strane, Yacc ne može da čita obični ulazni tok, njemu trebaju nizovi tokena. Lex se često koristi da obezbedi Yacc sa ovim tokenima.

Lex i make[uredi | uredi izvor]

Make može da se koristi da održava programe koji koriste lex. Make pretpostavlja da datoteka sa ekstenzijom .l predstavlja lex program. Make zna kako takvu datoteku treba da obradi da bi se napravila odgovarajuća objektna datoteka.

Pretpostavimo da lista zavisnosti u make datoteci sadrži ime datoteke x.o, a postoji datoteka x.l. Ako je x.l modifikovan posle datoteke x.o (ili ako x.o ne postoji), onda će make pokrenuti x.l, i onda će objektni fajl x.o biti kreiran od lex.yy.c.

Pogledajte još[uredi | uredi izvor]