Analizor lexical

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Un analizor lexical , numit uneori scanner sau lexer , este un program sau o parte a unui program (vezi compilatoare și parsere ), care are grijă să analizeze lexical o intrare dată, generic codul sursă al unui program.

Deci, sarcina unui analizator lexical este de a analiza un flux de intrare de caractere și de a genera un flux de simboluri .

Jetonul este un element care are un nume, numele jetonului și o valoare, de obicei lexemă, dar poate fi, de asemenea, un set de informații elementare, cum ar fi tipul numărului sau punctul din programul în care este definit. Jetoanele sunt elementele de bază pe care va funcționa un analizor .

Identificarea jetoanelor într-un flux de caractere se realizează prin tipare (scheme, modele).

Operațiune

Așa cum am scris mai înainte, analizatorul lexical identifică jetoanele prin tipare, definite prin expresii regulate . Să luăm de exemplu aceste modele:

 cifră = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0
număr = cifră cifră *
operator = + | - | x |  

Unde simbolul | indică operatorul logic SAU, alternativa. Simbolul * , asterisc, indică faptul că elementul care îl precedă poate fi repetat de zero sau de mai multe ori.

Din modelele de mai sus avem că o cifră poate fi 1 sau 2 sau 3 .. și așa mai departe; un număr este format din cel puțin o cifră și poate fi urmat de mai multe cifre. Operatorii sunt cei clasici ai matematicii.

Dacă dăm analizorului lexical următoarea expresie ca intrare:

123 + 141 / 725

Ne vom aștepta ca rezultatul să fie format din următoarele jetoane :

Token de tip Lexeme (valoare token )
număr 123
operator +
număr 141
operator /
număr 725

Rețineți cum sunt omise spațiile albe.

Pentru realizarea acestei lucrări, analizatorii lexicali se bazează pe un automat determinist de stare finită , strâns legat de expresiile regulate . Începe de la o stare inițială și se deplasează la celelalte stări pe baza caracterului de intrare până când se atinge o stare de acceptare în care poate fi lansat simbolul . De exemplu, pentru modelul nostru am avea un automat similar cu următorul:

Analyzerlessicale1.png

Începem de la starea inițială (1) și, în funcție de caracterul de intrare, putem trece la starea 2 sau 4. Dacă ajunge o cifră, ne vom deplasa la 2 și am rămâne aici până când ajunge altceva decât o cifră, în acest caz vom trece la starea 3. În această stare, starea de recunoaștere, vom produce simbolul , în acest caz al numărului de tip, și îl vom trimite. După recunoaștere, va reveni la starea inițială, întotdeauna cu aceeași valoare ca înainte.

În cazul exemplului nostru, 123 + 141 / 725 , schimbările dintre state ar fi fost după cum urmează:

Caracter Starea curenta Acțiune
1 1 Accesați starea (2)
2 2 Accesați starea (2)
3 2 Accesați starea (2)
+ 2 Accesați starea (3)
+ 3 Produceți jetoane de tip Număr și valoare 123
+ 1 Accesați starea (4)
+ 4 Produceți jetoane de tip Operator și valoare +
1 1 Accesați starea (2)
4 2 Accesați starea (2)
1 2 Accesați starea (2)
/ 2 Accesați starea (3)
/ 3 Produceți jetoane de tip Număr și valoare 141

si asa mai departe...

Construirea unui analizator lexical

Un analizor lexical poate fi scris manual, dar acest lucru ar necesita mult timp. Pentru a ajuta programatorii să vină cu instrumente de generare automată lexer, cum ar fi Lex. Alte instrumente de generare a analizatorului lexical sunt integrate în generatoarele de parser .

Elemente conexe