analiza lexicală în compilator
analiza lexicală în compilator este primul pas în analiza programului sursă. Analiza lexicală citește fluxul de intrare din caracterul programului sursă după caracter și produce secvența de Jetoane. Aceste jetoane sunt furnizate ca o intrare pentru parser pentru parsare. În acest context, vom discuta pe scurt procesul de analiză lexicală împreună cu erorile lexicale și recuperarea acestora.
conținut: Analiza lexicală în compilator
- terminologii în analiza lexicală
- ce este analiza lexicală?
- Exemple de analiză lexicală
- rolul Lexical Analyzer
- Lexical Error
- Error Recovery
- key Takeaways
terminologii în analiza lexicală
înainte de a intra în ce analiză lexicală este modul în care se realizează să vorbim despre unele terminologii care sunt vom întâlni în timp ce discutăm analiza lexicală.
- Lexeme
Lexeme poate fi definit ca o secvență de caractere care formează un model și poate fi recunoscut ca un simbol. - model
după identificarea modelului de lexeme se poate descrie ce fel de jeton poate fi format. Cum ar fi modelul unor lexeme formează un cuvânt cheie, modelul unor lexeme formează un identificator. - Token
o lexemă cu un model valid formează un token. În analiza lexicală, un simbol valid poate fi identificatori, cuvinte cheie, separatoare, caractere speciale, constante și operatori.
ce este analiza lexicală?
mai devreme ne-am dezafectat despre Analizor lexical în compilatorul nostru de conținut în calculator. Am aflat că compilatorul efectuează analiza programului sursă prin diferite faze pentru a-l transforma în programul țintă. Analiza lexicală este prima fază prin care trebuie să treacă programul sursă.
analiza lexicală este procesul de tokenizare adică. citește șirul de intrare al unui program sursă caracter după caracter și de îndată ce identifică un capăt al lexemului, identifică modelul său și îl transformă într-un simbol.
analizorul lexical constă din două procese consecutive care includ scanarea și analiza lexicală.
- Scanare: faza de scanare elimină numai elementele non-token din programul sursă. Cum ar fi eliminarea comentariilor, compactarea spațiilor albe consecutive etc.
- Analiza Lexicală: Faza de analiză lexicală efectuează tokenizarea pe ieșirea furnizată de scaner și, prin urmare, produce jetoane.
programul utilizat pentru efectuarea analizei lexicale este denumit lexer sau analizor lexical. Acum, să luăm un exemplu de analiză lexicală efectuată pe o declarație:
Exemplul 1 al analizei lexicale:
analiza lexicală în proiectarea compilatorului, identificați jetoanele.
acum, când vom citi această afirmație, atunci putem identifica cu ușurință că există nouă jetoane în declarația de mai sus.
- identificatori – > lexical
- identificatori – > analiză
- identificatori – > în
- identificatori -> compilator
- identificatori -> Proiectare
- Separator -> ,
- identificatori – > identificați
- identificatori- > jetoane
- Separator- >.
Deci, ca și în total, există 9 jetoane în fluxul de caractere de mai sus.
Exemplul 2 de analiză lexicală:
printf(” valoarea i este %d “, i);
acum să încercăm să găsim Jetoane din acest flux de intrare.
- cuvânt cheie – > printf
- caracter Special-> (
- Literal – > “valoarea lui i este %d”
- Separator -> ,
- identificator – > i
- caracter Special -> )
- Separator -> ;
notă:
- întregul șir din interiorul virgulelor duble inversate, adică “” este considerat un singur jeton.
- spațiul alb gol care separă caracterele din fluxul de intrare separă doar jetoanele și astfel este eliminat în timp ce numără jetoanele.
rolul analizorului Lexical
fiind prima fază în analiza programului sursă, analizorul lexical joacă un rol important în transformarea programului sursă în programul țintă.
acest întreg scenariu poate fi realizat cu ajutorul figurii de mai jos:
- faza analizorului lexical are scanerul sau programul lexer implementat în el, care produce jetoane numai atunci când sunt comandate de parser să facă acest lucru.
- parserul generează comanda getNextToken și o trimite analizorului lexical ca răspuns la aceasta analizorul lexical începe să citească caracterul fluxului de intrare cu caracter până când identifică o lexemă care poate fi recunoscută ca simbol.
- de îndată ce se produce un simbol, analizorul lexical îl trimite analizorului de sintaxă pentru analiză.
- împreună cu analizorul de sintaxă, analizorul lexical comunică și cu tabelul de simboluri. Când un analizor lexical identifică un lexem ca identificator, acesta intră în acel lexem în tabelul de simboluri.
- uneori, informațiile de identificator în tabelul simbol ajută Analizor lexical în determinarea jeton care trebuie să fie trimis la parser.
- în afară de identificarea jetoanelor din fluxul de intrare, analizorul lexical elimină și spațiul gol/spațiul alb și comentariile programului. Astfel de alte lucruri includ caractere separă jetoane, file, spații goale, linii noi.
- analizorul lexical ajută la relaționarea mesajelor de eroare produse de compilator. Doar, de exemplu, analizorul lexical ține evidența fiecărui nou caracter de linie pe care îl întâlnește în timp ce scanează programul sursă, astfel încât să coreleze cu ușurință mesajul de eroare cu numărul liniei programului sursă.
- dacă programul sursă utilizează macrocomenzi, analizorul lexical extinde macrocomenzile din programul sursă.
eroare lexicală
analizorul lexical în sine nu este eficient pentru a determina eroarea din programul sursă. De exemplu, luați în considerare o afirmație:
prtf (“valoarea lui i este %d”, i);
acum, în declarația de mai sus, când se întâlnește șirul prtf, analizorul lexical nu poate ghici dacă prtf este o ortografie incorectă a cuvântului cheie ‘printf’ sau este un identificator de funcție nedeclarat.
dar conform regulii predefinite prtf este o lexemă validă al cărei model concluzionează că este un simbol identificator. Acum, analizorul lexical va trimite jetonul prtf în faza următoare, adică parser care va gestiona eroarea care a apărut din cauza transpunerii literelor.
Error Recovery
Ei bine, uneori este chiar imposibil ca un analizor lexical să identifice o lexemă ca simbol, deoarece modelul lexemului nu se potrivește cu niciunul dintre modelele predefinite pentru jetoane. În acest caz, trebuie să aplicăm câteva strategii de recuperare a erorilor.
- în recuperarea modului panică, caracterul succesiv din lexem este șters până când analizorul lexical identifică un jeton valid.
- eliminați primul caracter din Intrarea rămasă.
- identificați caracterul lipsă posibil și introduceți-l în intrarea rămasă în mod corespunzător.
- înlocuiți un caracter în intrarea rămasă pentru a obține un jeton valid.
- schimbați poziția a două caractere adiacente în intrarea rămasă.
în timp ce efectuați acțiunile de recuperare a erorilor de mai sus, verificați dacă prefixul intrării rămase se potrivește cu orice model de Jetoane. În general, o eroare lexicală apare din cauza unui singur caracter. Deci, puteți corecta eroarea lexicală cu o singură transformare. Și, pe cât posibil, un număr mai mic de transformări trebuie să convertească programul sursă într-o secvență de Jetoane valide pe care le poate preda parserului.
Takeaways cheie
- analiza lexicală este prima fază în analiza programului sursă în compilator.
- analizorul lexical este implementat prin două procese consecutive scanner și analiză lexicală.
- Scanner elimină elementele non-token din fluxul de intrare.
- analiza lexicală efectuează tokenizarea.
- astfel, analizorul lexical generează o secvență de jetoane și le transmite în parser.
- parserul pe care posedă un jeton de la analizorul lexical face un apel getNextToken care insistă analizorul lexical citit fluxul de intrare de caractere până când identifică următorul jeton.
- dacă analizorul lexical identifică modelul unei lexeme ca identificator, atunci analizorul lexical introduce acea lexemă în tabelul de simboluri pentru utilizare ulterioară.
- Analizor Lexical nu este eficient pentru a identifica orice eroare în programul sursă singur.
- dacă apare o lexemă al cărei model nu se potrivește cu niciunul dintre modelele predefinite de jetoane, atunci trebuie să efectuați acțiuni de recuperare a erorilor pentru a remedia eroarea.
deci, este vorba despre analiza lexicală care transformă fluxul de caractere în jetoane și îl transmite parserului. Am învățat despre lucrul analizei lexicale cu ajutorul unui exemplu. Am încheiat discuția cu eroarea lexicală și strategia de recuperare a acesteia.
Leave a Reply