Analiza lexicală

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 2 aprilie 2022; verificările necesită 10 modificări .

În informatică , analiza lexicală („tokenization”, din engleză  tokenizing ) este procesul de parsare analitică a unei secvențe de intrare de caractere în grupuri recunoscute  - lexeme - pentru a obține secvențe identificate la ieșire, numite „ tokens ” (similar grupării ). litere în cuvinte ).

Înțeles

În cazuri simple, conceptele de „lexem” și „token” sunt identice, dar tokenizatoarele mai complexe clasifică suplimentar token-urile în diferite tipuri („identificator”, „operator”, „parte de vorbire”, etc.). Analiza lexicală este utilizată în compilatoare și interpreți de cod sursă pentru limbaje de programare și în diferite analizoare de cuvinte în limbaj natural .

De regulă, analiza lexicală se realizează în termenii unui anumit limbaj formal sau a unui set de limbi. Limba, sau mai degrabă, gramatica sa , definește un anumit set de lexeme care pot fi întâlnite la intrarea procesului.

Este tradițional să se organizeze procesul de analiză lexicală luând în considerare secvența de introducere a caracterelor ca un flux de caractere. Cu această organizare, procesul gestionează independent selecția caracterelor individuale din fluxul de intrare.

Recunoașterea lexemelor în contextul unei gramatici se face de obicei prin identificarea (sau clasificarea) acestora în funcție de identificatorii (sau clasele) de jetoane definite de gramatica limbii. În acest caz, orice secvență de caractere din fluxul de intrare (token), care, conform gramaticii, nu poate fi identificată ca simbol de limbă, este de obicei considerată ca un simbol de eroare special.

Fiecare jeton poate fi reprezentat ca o structură care conține un identificator de jeton (sau un identificator de clasă de jeton) și, dacă este necesar, o secvență de caractere a jetonului extras din fluxul de intrare (șir, număr etc.).

Scopul unei astfel de conversii este de obicei de a pregăti o secvență de intrare pentru un alt program, cum ar fi un parser gramatical și de a o scuti de definirea detaliilor lexicale într -o gramatică fără context (ceea ce ar face gramatica mai complicată).

Exemplu

De exemplu, codul sursă al următoarei linii de program

net_worth_future = ( active - pasive );

poate fi convertit în următorul flux de simboluri:

NUME „net_worth_future” MISIUNE OPENING_BRACKET NAME „active” MINUS NUME „datorii” CLOSING_BRACKET PUNCT ŞI VIRGULĂ

Analizor lexical

Un analizor lexical ( eng.  lexical analyzer , lexer ; sau „tokenizer” din tokenizer ) este un program sau o parte a unui program care efectuează analize lexicale. Un analizor lexical funcționează de obicei în două etape: scanare și evaluare .

În prima etapă, scanarea, analizatorul lexical este de obicei implementat ca o mașină de stări , definită prin expresii regulate . Acesta codifică informații despre posibilele secvențe de caractere care pot apărea în jetoane. De exemplu, un simbol „întreg” poate conține orice succesiune de cifre zecimale. În multe cazuri, primul caracter non-spațiu alb poate fi folosit pentru a determina tipul următorului jeton, după care caracterele de intrare sunt procesate unul câte unul până când este întâlnit un caracter care nu se află în setul de caractere valide pentru acel simbol. În unele limbi, regulile pentru analizarea tokenurilor sunt oarecum mai complexe și necesită revenire în succesiune care poate fi citită.

Tokenul astfel obținut conține textul sursă brut (șir). Pentru a obține un token cu o valoare corespunzătoare tipului (de exemplu, un număr întreg sau fracționar), acest șir este evaluat - trecând prin caractere și calculând valoarea.

Un token cu un tip și o valoare pregătită corespunzător este transmis la intrarea parserului .

Generatoare de analizoare lexicale

  • lex  - generator standard Unix
  • Flex  este o alternativă la utilitarul clasic lex
  • re2c - generează lexeri optimizați non-table, axați pe lucrul cu C, C ++, Go, Rust
  • JLex  - Generator în Java
  • ANTLR
  • lexertl

Vezi și

Literatură

  • Alfred W. Aho , Monica S. Lam , Ravi Seti , Jeffrey D. Ullman . Compilatoare: principii, tehnici și instrumente = Compilers: Principles, Techniques, and Tools. - Ed. a II-a. - M .: Williams , 2008. - ISBN 978-5-8459-1349-4 .
  • Robin Hunter . Concepte de bază ale compilatorului = Esența compilatorilor. - M . : „Williams” , 2002. - S. 256. - ISBN 5-8459-0360-2 .

Link -uri