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 -
- “Dohvati sljedeći token” je naredba koja se šalje od parsera do leksičkog analizatora.
- Kada primi ovu naredbu, leksički analizator skenira ulaz dok ne pronađe sljedeći token.
- 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