Analiză lexicală (analizor) în proiectarea compilatorului cu exemplu

Ce este analiza lexicală?

Analiza lexicală este prima fază în proiectarea compilatorului. Un Lexer ia 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 descompune această sintaxă într-o serie de jetoane. Îndepărtează orice spațiu suplimentar sau comentariu scris în codul sursă.

Programele care efectuează analiza lexicală în proiectarea compilatorului sunt numite analizoare lexicale sau lexeri. Un lexer conține tokenizer sau scaner. Dacă analizorul lexical detectează că simbolul este invalid, generează o eroare. Rolul Lexical Analyzer în proiectarea compilatorului este de a citi fluxurile de caractere din codul sursă, de a verifica dacă există simboluri legale și de a transmite datele analizorului de sintaxă atunci când o cere.

Exemplu

How Pleasant Is The Weather?

Vezi acest exemplu de analiză lexicală; Aici, putem recunoaște cu ușurință că există cinci cuvinte Cât de plăcut, The, Weather, Is. Acest lucru este foarte natural pentru noi, deoarece putem recunoaște separatoarele, spațiile libere și simbolul de punctuație.

 HowPl easantIs Th ewe ather?

Acum, verifică acest exemplu, putem citi și asta. Cu toate acestea, va dura ceva timp, deoarece separatoarele sunt puse în Locurile Impare. Nu este ceva care îți vine imediat.

Terminologii de bază

Ce este un lexem?

Un lexem este o secvență de caractere care sunt incluse în programul sursă conform modelului de potrivire al unui simbol. Nu este altceva decât o instanță a unui simbol.

Ce este un simbol?

Tokenurile în proiectarea compilatorului sunt secvența de caractere care reprezintă o unitate de informații în programul sursă.

Ce este Pattern?

Un model este o descriere care este folosită de simbol. În cazul unui cuvânt cheie care folosește ca simbol, modelul este o secvență de caractere.

Analizor lexical Architectura: Cum sunt recunoscute jetoanele

Sarcina principală a analizei lexicale este de a citi caracterele introduse în cod și de a produce jetoane.

Analizorul lexical scanează întregul cod sursă al programului. Identifică fiecare jeton unul câte unul. Scanerele sunt de obicei implementate pentru a produce jetoane numai atunci când sunt solicitate de un parser. Iată cum funcționează recunoașterea token-urilor în proiectarea compilatorului:

Analizor lexical Architectură
Analizor lexical Architectură
  1. „Get next token” este o comandă care este trimisă de la parser la analizorul lexical.
  2. La primirea acestei comenzi, analizorul lexical scanează intrarea până când găsește următorul simbol.
  3. Acesta returnează jetonul la Parser.

Lexical Analyzer omite spațiile albe și comentariile în timp ce creează aceste simboluri. Dacă există vreo eroare, atunci analizatorul lexical va corela acea eroare cu fișierul sursă și numărul liniei.

Rolurile analizatorului lexical

Analizorul lexical îndeplinește următoarele sarcini:

  • Ajută la identificarea jetonului î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ăsesc în programul sursă
  • Citiți caracterele introduse din programul sursă

Exemplu de analiză lexicală, jetoane, non-jetoane

Luați în considerare următorul cod care este transmis la Lexical Analyzer

#include <stdio.h>
    int maximum(int x, int y) {
        // This will compare 2 numbers
        if (x > y)
            return x;
        else {
            return y;
        }
    }

Exemple de jetoane create

Lexem Simbol
int Cuvânt cheie
maxim Identifier
( OperaTdR
int Cuvânt cheie
x Identifier
, OperaTdR
int Cuvânt cheie
Y Identifier
) OperaTdR
{ OperaTdR
If Cuvânt cheie

Exemple de nontokens

Tip Exemple
Comentariu // Aceasta va compara 2 numere
Directiva pre-procesor #include
Directiva pre-procesor #definiți NUMS 8,9
Macro NUMS
Spatiu alb /n /b /t

Erori lexicale

O secvență de caractere care nu este posibil să fie scanată în niciun simbol valid este o eroare lexicală. Fapte importante despre eroarea lexicală:

  • Erorile lexicale nu sunt foarte frecvente, dar ar trebui gestionate de un scanner
  • Greșelile de ortografie ale identificatorilor, operatorilor, cuvintelor cheie sunt considerate erori lexicale
  • În general, o eroare lexicală este cauzată de apariția unui caracter ilegal, mai ales la începutul unui simbol.

Recuperarea erorilor în Analizorul lexical

Iată câteva tehnici de recuperare a erorilor cele mai comune:

  • Elimină un caracter din intrarea rămasă
  • În modul de panică, personajele succesive sunt întotdeauna ignorate până ajungem la un token bine format
  • Prin introducerea caracterului lipsă în intrarea rămasă
  • Înlocuiți un caracter cu un alt caracter
  • Transpune două personaje seriale

Analizor lexical vs. Analizor

Analizor lexical parser
Program de introducere a scanării Efectuați analiza 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
Genera erori lexicale Acesta generează un arbore de analiză a codului sursă

De ce separați Lexical și Parser?

  • Simplitatea designului: ușurează procesul de analiză lexicală și analiza sintaxei prin eliminarea token-urilor nedorite
  • Pentru a îmbunătăți eficiența compilatorului: vă ajută să îmbunătățiți eficiența compilatorului
  • Specializare: pot fi aplicate tehnici specializate pentru a îmbunătăți procesul de analiză lexicală
  • Portabilitate: doar scanerul are nevoie pentru a comunica cu lumea exterioară
  • Portabilitate mai mare: particularități specifice dispozitivului de intrare limitate la lexer

Avantajele analizei lexicale

  • Metoda analizorului lexical este utilizată de programe precum compilatoarele care pot folosi datele analizate din codul unui programator pentru a crea un cod executabil binar compilat
  • Este folosit de browserele web pentru a formata și afișa o pagină web cu ajutorul datelor analizate din JavaScript, 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 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 depana lexer-ul și descrierile sale de simbol
  • Este necesară o suprasarcină suplimentară de rulare pentru a genera tabelele lexer și pentru a construi token-urile

Rezumat

  • Analiza lexicală este prima fază în proiectarea compilatorului
  • Lexemele și simbolurile sunt secvența de caractere care sunt incluse în programul sursă conform modelului de potrivire al unui simbol
  • Analizorul lexical este implementat pentru a scana întregul cod sursă al programului
  • Analizorul lexical ajută la identificarea simbolurilor în tabelul de simboluri
  • O secvență de caractere care nu este posibil să fie scanată în niciun simbol valid este o eroare lexicală
  • Eliminarea unui caracter din intrarea rămasă este utilă Metoda de recuperare a erorilor
  • Analizorul lexical scanează programul de intrare în timp ce analizatorul efectuează analiza de sintaxă
  • Ușurează procesul de analiză lexicală și analiza sintaxei prin eliminarea token-urilor nedorite
  • Analizorul lexical este folosit 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ă necesită un timp de rulare suplimentar pentru a genera tabelele lexer și a construi token-urile.

Rezumați această postare cu: