Contracta | |
---|---|
Tip de | generator de analizor lexical |
Autor | Vern Paxon [d] [1][2] |
Dezvoltator | Vern Paxson [d] [1][3] |
Scris in | Xi |
Sistem de operare | asemănător Unix-ului |
Prima editie | 1987 [4] |
Platformă hardware | software multiplatformă |
ultima versiune | |
Licență | BSD |
Site-ul web | github.com/westes/flex |
Flex (Fast Lexical Analyzer) - generator de analizoare lexicale . Înlocuiește Lex pe sisteme bazate pe pachete GNU și are funcționalități similare. Cu toate acestea, Flex nu face parte din Proiectul GNU [7] .
Lex este un instrument de analiză lexicală care poate fi folosit pentru a extrage anumite șiruri din textul sursă într-un mod prestabilit. Yacc este un instrument de analiză ; citește text și poate fi folosit pentru a converti o secvență de cuvinte într-un format structurat pentru procesare ulterioară. [opt]
La intrare, programul primește un text în format liber și regulile de evidențiere a jetoanelor, iar la ieșire dă codul analizorului, sub forma unei funcții în limbajul C. [9]
Regulile sunt specificate ca expresii regulate în stânga și, de obicei, cod C în dreapta. Acestea conțin trei secțiuni, separate prin linia „%%”:
Bloc de definiție %% Blocarea regulilor %% Bloc de cod CDefinițiile conțin valori și definiții inițiale, reguli, expresiile în sine și acțiunile lor corespunzătoare; codul utilizatorului este pur și simplu inclus în ieșirea flex. Este posibil să lipsească unele secțiuni.
Funcția parser ia textul ca intrare și execută codul dat pentru fiecare token pe care îl găsește. De exemplu, acest cod va printf ("%s", getlogin()) pentru fiecare apariție a numelui de utilizator în text :
%% nume de utilizator printf ( "%s" , getlogin () );Această funcție va imprima în flux șirul returnat de funcția getlogin(). Adică, fiecare apariție a numelui de utilizator în fluxul de intrare va fi înlocuită cu valoarea returnată de getlogin().
Reguli conform cărora funcția finală ar trebui să imprime tipul de jeton (dacă, variabilă , număr, operație unară sau binară ) și valori pentru unele jetonuri:
%% if printf ( " instrucțiunea IF \n " ); [ a - z ] + printf ( "etichetă, valoare %s \n " , yytext ); { D } + printf ( "număr zecimal %s \n " , yytext ); "++" printf ( "operator unar \n " ); "+" printf ( "operator binar \n " );Un exemplu de numărare a numărului de rânduri și caractere dintr-un text:
% { int num_linii = 0 , num_cars = 0 ; % } %% \ n ++ num_lines ; ++ num_cars ; . ++ num_cars ; %% principal () { ylex (); printf ( "# de linii = %d, # de caractere = %d \n " , num_lines , num_chars ); }Funcția generată de generator pentru a găsi următorul token poate fi utilizată cu generatoarele de analiză . În cele mai multe cazuri, flex este folosit cu yacc sau GNU bison .