Lex

From Wikipedia, the free encyclopedia

Remove ads

У рачунарству, је рачунарски програм који генерише лексички анализатор. се обично користи са -ом. , који су написали Ерик Шмит (енгл. ) и Мајк Леск (енгл. ), постао је стандардни генератор за лексички анализатор на многим јуникс системима, а понашање -а одређено је правилима у стандарду.

чита улазни ток и враћа код који имплементира у програмском језику C.

Верзије -а базиране на АТ&Т коду су доступне као софтвер отвореног кода, као део -а и -а. Друга популарна верзија -а отвореног кода је , тј. брзи лексички анализатор (енгл. ).

Remove ads

Структура програма

Структура програма је намерно направљена да буде слична структури програма; програми су подељени на три дела, одвојена линијама које садрже само два процентна знака (%%), тј.:

Део за дефиниције
%%
Део за правила
%%
Део за C код
  • Дефиницијски део је место где се дефинишу макрои и позива датотека написана на C-у. Овде је такође могуће написати било какав код који ће дословно бити копиран у генерисану изворну датотеку.
  • Део за правила је најважнији део; он повезује обрасце са -овским исказима. Обрасци су регуларни изрази. Када види неки текст на улазу који одговара датом обрасцу, онда он извршава одговарајући део кода. Ово је основно у раду -а.
  • Део за код садржи исказе и функције које се дословно копирају у генерисану изворну датотеку. Ови искази садрже позиве правила из дела за правила. У великим програмима много је лакше овај део кода записати у одвојеној датотеци и онда је повезати за време компајлирања.


Remove ads

Пример програма

Овај пример програма је за верзију -а. Препознаје ниске целих бројева са улаза и само их штампа на излаз:

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

%{
/* 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;
}

Ако овај улаз дамо -у, он ће бити конвертован у програм, . Када се ово комајлира и покрене биће препознаване и исписиване ниске целих бројева. На пример, за дати улаз:

програм ће иштампати:

Primecen ceo broj: 123
Primecen ceo broj: 2
Primecen ceo broj: 6
Remove ads

Коришћење -а са -ом

и се обично користе заједно. користи формалну граматику да рашчлани улазни ток, а то не може да уради користећи само регуларне изразе. Са друге стране, не може да чита обични улазни ток, њему требају низови токена. се често користи да обезбеди са овим токенима.

Lex и make

може да се користи да одржава програме који користе . претпоставља да датотека са екстензијом .l представља програм. зна како такву датотеку треба да обради да би се направила одговарајућа објектна датотека.

Претпоставимо да листа зависности у датотеци садржи име датотеке x.o, а постоји датотека x.l. Ако је x.l модификован после датотеке x.o (или ако x.o не постоји), онда ће покренути x.l, и онда ће објектни фајл x.o бити креиран од lex.yy.c.

Remove ads

Види још

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads