Flex (generator de analizor lexical)

Versiunea actuală a paginii nu a fost încă revizuită de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 14 aprilie 2018; verificările necesită 5 modificări .
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] .

Utilizare

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 C

Definiț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 .

Note

  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. (titlu nespecificat) - P. 9. - ISBN 978-0-596-15597-1
  5. Versiunea 2.6.4 - 2017.
  6. lex 2.6.4 lansat  (engleză) - 2017.
  7. Cameron Mackinnon. Este GNU flexibil sau nu? (link indisponibil) (2 decembrie 1996). Preluat la 1 august 2010. Arhivat din original la 29 aprilie 2012. 
  8. [ IBM. Beneficiu.  (link indisponibil) . Data accesului: 18 iunie 2010. Arhivat din original la 22 ianuarie 2009. IBM. Beneficiu.  (link indisponibil) ]
  9. De obicei yylex().

Link -uri