Ce este analiza lexicală?
ANALIZA LEXICALĂ este prima fază în proiectarea compilatorului. Un Lexer preia codul sursă modificat, care este scris sub formă de propoziții. Cu alte cuvinte, vă ajută să convertiți o secvență de caractere într-o secvență de jetoane. Analizatorul lexical rupe această sintaxă într-o serie de jetoane. Elimină orice spațiu suplimentar sau comentariu scris în codul sursă.
Programele care efectuează analize lexicale se numesc analizatori lexicali sau lexeri. Un lexer conține tokenizer sau scaner. Dacă analizorul lexical detectează că simbolul este invalid, generează o eroare. Citește fluxuri de caractere din codul sursă, verifică jetoanele legale și transmite datele analizorului de sintaxă atunci când solicită acest lucru.
Exemplu
How Pleasant Is The Weather?
Vezi acest exemplu; Aici, putem recunoaște cu ușurință că există cinci cuvinte Cât de plăcut, vremea este. Acest lucru este foarte natural pentru noi, deoarece putem recunoaște separatorii, spațiile goale și simbolul de punctuație.
HowPl easantIs Th ewe ather?
Acum, verificați acest exemplu, putem citi și acest lucru. Cu toate acestea, va dura ceva timp, deoarece separatoarele sunt plasate în Odd Places. Nu este ceva care îți vine imediat.
În acest tutorial, veți învăța
- Terminologii de bază:
- Arhitectură Lexical Analyzer: Cum sunt recunoscute jetoanele
- Rolurile analizatorului lexical
- Erori lexicale
- Recuperare erori în Lexical Analyzer
- Analizator lexical vs. Parser
- De ce să separați Lexical și Parser?
- Avantajele analizei lexicale
- Dezavantajul analizei lexicale
Terminologii de bază
Ce este un lexem?
Un lexem este o secvență de caractere care sunt incluse în programul sursă în conformitate cu modelul de potrivire al unui simbol. Nu este altceva decât o instanță a unui simbol.
Ce este un simbol?
Jetonul este o secvență de caractere care reprezintă o unitate de informații din programul sursă.
Ce este modelul?
Un model este o descriere care este utilizată de jeton. În cazul unui cuvânt cheie care se folosește ca simbol, modelul este o secvență de caractere.
Arhitectură Lexical Analyzer: Cum sunt recunoscute jetoanele
Sarcina principală a analizei lexicale este citirea caracterelor de intrare în cod și producerea de jetoane.
Analizatorul lexical scanează întregul cod sursă al programului. Identifică fiecare jeton unul câte unul. Scannerele sunt de obicei implementate pentru a produce jetoane numai la cererea unui analizor. Iată cum funcționează acest lucru-
- „Get next token” este o comandă care este trimisă de la analizor la analizatorul lexical.
- La primirea acestei comenzi, analizatorul lexical scanează intrarea până când găsește următorul simbol.
- Acesta returnează simbolul către Parser.
Analizatorul lexical omite spațiile albe și comentariile în timp ce creează aceste jetoane. Dacă există vreo eroare, atunci analizatorul lexical va corela această eroare cu fișierul sursă și numărul liniei.
Rolurile analizatorului lexical
Analizatorul lexical efectuează mai jos sarcini date:
- Ajută la identificarea simbolului în tabelul de simboluri
- Elimină spațiile albe și comentariile din programul sursă
- Corelează mesajele de eroare cu programul sursă
- Vă ajută să extindeți macrocomenzile dacă se găsește în programul sursă
- Citiți caracterele de intrare din programul sursă
Exemplu de analiză lexicală, jetoane, non-jetoane
Luați în considerare următorul cod care este alimentat către Lexical Analyzer
#includeint maximum(int x, int y) {// This will compare 2 numbersif (x > y)return x;else {return y;}}
Exemple de jetoane create
Lexem | Jeton |
int | Cuvânt cheie |
maxim | Identificator |
( | Operator |
int | Cuvânt cheie |
X | Identificator |
, | Operator |
int | Cuvânt cheie |
Da | Identificator |
) | Operator |
{ | Operator |
Dacă | Cuvânt cheie |
Exemple de Nontokens
Tip | Exemple |
cometariu | // Aceasta va compara 2 numere |
Directiva pre-procesor | #include |
Directiva pre-procesor | #define NUMS 8,9 |
Macro | NUMS |
Spatiu alb | / n / b / t |
Erori lexicale
O secvență de caractere care nu este posibilă scanarea în orice jeton valid este o eroare lexicală. Fapte importante despre eroarea lexicală:
- Erorile lexicale nu sunt foarte frecvente, dar ar trebui gestionate de un scaner
- Scrierea greșită a identificatorilor, operatorilor, cuvântului cheie sunt considerate erori lexicale
- În general, o eroare lexicală este cauzată de apariția unui caracter ilegal, mai ales la începutul unui simbol.
Recuperare erori în Lexical Analyzer
Iată câteva dintre cele mai comune tehnici de recuperare a erorilor:
- Elimină un caracter din intrarea rămasă
- În modul de panică, personajele succesive sunt întotdeauna ignorate până când ajungem la un simbol bine format
- Prin inserarea caracterului lipsă în intrarea rămasă
- Înlocuiți un personaj cu un alt personaj
- Transpuneți două caractere în serie
Analizator lexical vs. Parser
Analizator lexical | Analizator |
Scanare program de intrare | Efectuați analize de sintaxă |
Identificați jetoanele | Creați o reprezentare abstractă a codului |
Introduceți jetoane în Tabelul de simboluri | Actualizați intrările din tabelul de simboluri |
Generează erori lexicale | Acesta generează un arbore de analiză a codului sursă |
De ce să separați Lexical și Parser?
- Simplitatea designului: facilitează procesul de analiză lexicală și analiza sintaxei prin eliminarea jetoanelor nedorite
- Pentru a îmbunătăți eficiența compilatorului: vă ajută să îmbunătățiți eficiența compilatorului
- Specializare: tehnicile specializate pot fi aplicate pentru a îmbunătăți procesul de analiză lexicală
- Portabilitate: numai scanerul necesită comunicarea cu lumea exterioară
- Portabilitate mai mare: particularități specifice dispozitivului de intrare limitate la lexer
Avantajele analizei lexicale
- Metoda analizatorului lexical este utilizată de programe precum compilatoarele care pot utiliza datele analizate din codul unui programator pentru a crea un cod executabil binar compilat
- Este folosit de browserele web pentru formatarea și afișarea unei pagini web cu ajutorul datelor analizate din JavsScript, HTML, CSS
- Un analizor lexical separat vă ajută să construiți un procesor specializat și potențial mai eficient pentru sarcină
Dezavantajul analizei lexicale
- Trebuie să petreceți un timp semnificativ citind programul sursă și partiționându-l sub formă de jetoane
- Unele expresii regulate sunt destul de greu de înțeles în comparație cu regulile PEG sau EBNF
- Este nevoie de mai mult efort pentru a dezvolta și a depana lexerul și descrierile simbolice ale acestuia
- Pentru a genera tabelele lexer și pentru a construi jetoanele este necesar un cost suplimentar de runtime
rezumat
- Analiza lexicală este chiar prima fază în proiectarea compilatorului
- Un lexem este o secvență de caractere care sunt incluse în programul sursă în conformitate cu modelul de potrivire al unui simbol
- Analizatorul lexical este implementat pentru a scana întregul cod sursă al programului
- Analizatorul lexical ajută la identificarea simbolului în tabelul de simboluri
- O secvență de caractere care nu este posibilă scanarea în orice jeton valid este o eroare lexicală
- Elimină un caracter din intrarea rămasă este utilă Metoda de recuperare a erorilor
- Lexical Analyzer scanează programul de intrare în timp ce parserul efectuează analize de sintaxă
- El ușurează procesul de analiză lexicală și analiza sintaxei prin eliminarea jetoanelor nedorite
- Analizatorul lexical este utilizat de browserele web pentru a formata și afișa o pagină web cu ajutorul datelor analizate din JavsScript, HTML, CSS
- Cel mai mare dezavantaj al utilizării analizorului Lexical este că are nevoie de o cheltuială suplimentară pentru a genera tabelele lexer și de a construi jetoanele.