Leksička analiza (Analyzer) u dizajnu kompilatora s primjerom

Što je leksička analiza?

Leksička analiza je prva faza u projektiranju prevoditelja. Lexer preuzima modificirani izvorni kod koji je napisan u obliku rečenica. Drugim riječima, pomaže vam da pretvorite niz znakova u niz tokena. Leksički analizator rastavlja ovu sintaksu na niz tokena. Uklanja sve dodatne razmake ili komentare napisane u izvornom kodu.

Programi koji izvode leksičku analizu u dizajnu prevoditelja nazivaju se leksičkim analizatorima ili lekserima. Lekser sadrži tokenizator ili skener. Ako leksički analizator otkrije da token nije valjan, generira pogrešku. Uloga leksičkog analizatora u dizajnu prevoditelja je čitanje tokova znakova iz izvornog koda, provjera legalnih tokena i prosljeđivanje podataka analizatoru sintakse kada to zahtijeva.

Primjer

How Pleasant Is The Weather?

Pogledajte ovaj primjer leksičke analize; Ovdje možemo lako prepoznati da postoji pet riječi How Pleasant, The, Weather, Is. To je vrlo prirodno za nas jer možemo prepoznati razdjelnike, praznine i interpunkcijski simbol.

 HowPl easantIs Th ewe ather?

Sada, provjerite ovaj primjer, možemo i ovo pročitati. Međutim, trebat će neko vrijeme jer se separatori postavljaju na čudna mjesta. To nije nešto što vam odmah dođe.

Osnovna terminologija

Što je leksem?

Leksem je niz znakova koji su uključeni u izvorni program prema uzorku podudaranja tokena. To nije ništa drugo nego instanca tokena.

Što je token?

Tokeni u dizajnu prevoditelja su niz znakova koji predstavljaju jedinicu informacija u izvornom programu.

Što je uzorak?

Uzorak je opis koji koristi token. U slučaju ključne riječi koja se koristi kao token, uzorak je niz znakova.

Leksički analizator Architektura: Kako se tokeni prepoznaju

Glavni zadatak leksičke analize je čitanje ulaznih znakova u kodu i proizvodnja tokena.

Leksički analizator skenira cijeli izvorni kod programa. Identificira svaki token jedan po jedan. Skeneri se obično implementiraju da proizvode tokene samo kada to zatraži parser. Evo kako funkcionira prepoznavanje tokena u dizajnu kompilatora -

Leksički analizator Architektura
Leksički analizator Architektura
  1. “Dohvati sljedeći token” je naredba koja se šalje od parsera do leksičkog analizatora.
  2. Kada primi ovu naredbu, leksički analizator skenira ulaz dok ne pronađe sljedeći token.
  3. Vraća token Parseru.

Leksički analizator preskače razmake i komentare dok stvara te tokene. Ako je prisutna bilo kakva pogreška, Leksički analizator će povezati tu pogrešku s izvornom datotekom i brojem retka.

Uloge leksičkog analizatora

Leksički analizator obavlja sljedeće zadatke:

  • Pomaže identificirati token u tablici simbola
  • Uklanja razmake i komentare iz izvornog programa
  • Povezuje poruke o pogreškama s izvornim programom
  • Pomaže vam da proširite makronaredbe ako se nalaze u izvornom programu
  • Čitanje znakova unosa iz izvornog programa

Primjer leksičke analize, tokeni, ne-leksemi

Razmotrite sljedeći kod koji se šalje u Lexical Analyzer

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

Primjeri stvorenih tokena

Leksem Žeton
int Riječ
maksimum identificirati
( Operahumka
int Riječ
x identificirati
, Operahumka
int Riječ
Y identificirati
) Operahumka
{ Operahumka
If Riječ

Primjeri netokena

Tip Primjeri
Komentar // Ovo će usporediti 2 broja
Direktiva pretprocesora #uključi
Direktiva pretprocesora #definiraj NUMS 8,9
Makro NUMS
Bijeli prostor /n /b /t

Leksičke pogreške

Niz znakova koji nije moguće skenirati u valjani token je leksička pogreška. Važne činjenice o leksičkoj pogrešci:

  • Leksičke pogreške nisu baš česte, ali treba ih riješiti pomoću skenera
  • Pogrešno pisanje identifikatora, operatora, ključnih riječi smatra se leksičkim pogreškama
  • Općenito, leksičku pogrešku uzrokuje pojava nekog nedopuštenog znaka, uglavnom na početku tokena.

Oporavak od pogreške u leksičkom analizatoru

Evo nekoliko najčešćih tehnika za oporavak od pogreške:

  • Uklanja jedan znak iz preostalog unosa
  • U režimu panike, uzastopni znakovi se uvijek zanemaruju dok ne dođemo do dobro oblikovanog tokena
  • Umetanjem znaka koji nedostaje u preostali unos
  • Zamijenite znak drugim znakom
  • Transponirajte dva serijska znaka

Leksički analizator naspram parsera

Leksički analizator rastavljač
Program za skeniranje unosa Izvršite analizu sintakse
Identificirajte žetone Napravite apstraktni prikaz koda
Umetnite žetone u tablicu simbola Ažurirajte unose tablice simbola
Stvara leksičke pogreške Generira stablo analize izvornog koda

Zašto razdvajati Lexical i Parser?

  • Jednostavnost dizajna: Olakšava proces leksičke analize i analize sintakse eliminirajući neželjene tokene
  • Za poboljšanje učinkovitosti prevoditelja: Pomaže vam poboljšati učinkovitost prevoditelja
  • Specijalizacija: mogu se primijeniti specijalizirane tehnike za poboljšanje procesa leksičke analize
  • Prenosivost: samo je skener potreban za komunikaciju s vanjskim svijetom
  • Veća prenosivost: specifičnosti specifičnih za ulazni uređaj ograničene su na lekser

Prednosti leksičke analize

  • Metodu leksičkog analizatora koriste programi poput prevoditelja koji mogu koristiti raščlanjene podatke iz programerovog koda za stvaranje prevedenog binarnog izvršnog koda
  • Koriste ga web preglednici za formatiranje i prikaz web stranice uz pomoć raščlanjenih podataka iz JavsScript, HTML, CSS
  • Zasebni leksički analizator pomaže vam da konstruirate specijalizirani i potencijalno učinkovitiji procesor za zadatak

Nedostatak leksičke analize

  • Morate potrošiti dosta vremena na čitanje izvornog programa i njegovo dijeljenje u obliku tokena
  • Neke regularne izraze prilično je teško razumjeti u usporedbi s PEG ili EBNF pravilima
  • Potrebno je više truda za razvoj i otklanjanje pogrešaka leksera i njegovih opisa tokena
  • Za generiranje tablica leksera i konstruiranje tokena potrebno je dodatno opterećenje vremena izvođenja

Rezime

  • Leksička analiza je prva faza u dizajnu prevoditelja
  • Leksemi i tokeni su niz znakova koji su uključeni u izvorni program prema uzorku podudaranja tokena
  • Leksički analizator implementiran je za skeniranje cijelog izvornog koda programa
  • Leksički analizator pomaže identificirati token u tablici simbola
  • Niz znakova koji nije moguće skenirati u valjani token je leksička pogreška
  • Uklanjanje jednog znaka iz preostalog unosa je korisno. Metoda oporavka od pogreške
  • Leksički analizator skenira ulazni program dok parser izvodi analizu sintakse
  • Olakšava proces leksičke analize i analize sintakse uklanjanjem neželjenih tokena
  • Leksički analizator koriste web preglednici za formatiranje i prikaz web stranice uz pomoć raščlanjenih podataka iz JavsScripta, HTML-a, CSS-a
  • Najveći nedostatak korištenja leksičkog analizatora je taj što mu je potrebno dodatno vrijeme izvođenja za generiranje tablica leksera i konstruiranje tokena

Dnevni bilten Guru99

Započnite dan s najnovijim i najvažnijim vijestima o umjetnoj inteligenciji koje vam donosimo upravo sada.