Lexikal analyse i Compiler Design med eksempel

Indholdsfortegnelse:

Anonim

Hvad er leksikalanalyse?

LEXICAL ANALYSIS er den allerførste fase i compileren, der designer. En Lexer tager den modificerede kildekode, der er skrevet i form af sætninger. Med andre ord hjælper det dig med at konvertere en sekvens af tegn til en række af tokens. Den leksikale analysator opdeler denne syntaks i en række tokens. Det fjerner ekstra plads eller kommentar skrevet i kildekoden.

Programmer, der udfører leksikalanalyse, kaldes leksikale analysatorer eller lexikere. En lexer indeholder tokenizer eller scanner. Hvis den leksikale analysator registrerer, at tokenet er ugyldigt, genererer det en fejl. Det læser tegnstrømme fra kildekoden, kontrollerer for lovlige tokens og videregiver dataene til syntaksanalysatoren, når det kræves.

Eksempel

How Pleasant Is The Weather?

Se dette eksempel; Her kan vi let genkende, at der er fem ord How Pleasant, The, Weather, Is. Dette er meget naturligt for os, da vi kan genkende skillelinjer, emner og tegnsætningssymbolet.

 HowPl easantIs Th ewe ather?

Tjek nu dette eksempel, vi kan også læse dette. Det vil dog tage noget tid, fordi separatorer placeres i de ulige steder. Det er ikke noget, der kommer til dig med det samme.

I denne vejledning lærer du

  • Grundlæggende terminologier:
  • Lexical Analyzer Architecture: Hvordan tokens genkendes
  • Roller til den Lexical analysator
  • Lexikale fejl
  • Fejlgendannelse i Lexical Analyzer
  • Lexical Analyzer vs. Parser
  • Hvorfor adskille Lexical og Parser?
  • Fordele ved Lexical analyse
  • Ulempen ved Lexical analyse

Grundlæggende terminologier

Hvad er et lexeme?

Et lexeme er en sekvens af tegn, der er inkluderet i kildeprogrammet i henhold til det matchende mønster for et token. Det er intet andet end et eksempel på et token.

Hvad er et symbol?

Tokenet er en række af tegn, som repræsenterer en enhed af information i kildeprogrammet.

Hvad er mønster?

Et mønster er en beskrivelse, der bruges af symbolet. I tilfælde af et nøgleord, der bruger som et token, er mønsteret en sekvens af tegn.

Lexical Analyzer Architecture: Hvordan tokens genkendes

Hovedopgaven med leksikalanalyse er at læse inputtegn i koden og producere tokens.

Lexical analysator scanner hele kildekoden til programmet. Det identificerer hvert token en efter en. Scannere implementeres normalt kun for at producere tokens, når en parser anmoder om det. Sådan fungerer dette -

  1. "Get next token" er en kommando, der sendes fra parseren til den leksikale analysator.
  2. Ved modtagelse af denne kommando scanner den leksikale analysator indgangen, indtil den finder det næste token.
  3. Det returnerer tokenet til Parser.

Lexical Analyzer springer mellemrum og kommentarer over, mens de opretter disse tokens. Hvis der er nogen fejl, vil Lexical analysator korrelere denne fejl med kildefilen og linjenummeret.

Roller til den Lexical analysator

Lexikalisk analysator udfører nedenstående opgaver:

  • Hjælper med at identificere token i symboltabellen
  • Fjerner hvide mellemrum og kommentarer fra kildeprogrammet
  • Korrelerer fejlmeddelelser med kildeprogrammet
  • Hjælper dig med at udvide makroerne, hvis de findes i kildeprogrammet
  • Læs inputtegn fra kildeprogrammet

Eksempel på leksikalanalyse, tokens, ikke-tokens

Overvej følgende kode, der føres til Lexical Analyzer

#include int maximum(int x, int y) {// This will compare 2 numbersif (x > y)return x;else {return y;}}

Eksempler på poletter oprettet

Lexeme Polet
int Nøgleord
maksimum Identifikator
( Operatør
int Nøgleord
x Identifikator
, Operatør
int Nøgleord
Y Identifikator
) Operatør
{ Operatør
Hvis Nøgleord

Eksempler på ikke-toksiske stoffer

Type Eksempler
Kommentar // Dette sammenligner 2 tal
Pre-processor direktiv # inkluderer
Pre-processor direktiv #definer NUMS 8,9
Makro NUMS
Hvidt rum / n / b / t

Lexikale fejl

En tegnsekvens, som ikke er mulig at scanne ind i et gyldigt token, er en leksikalsk fejl. Vigtige fakta om den leksikale fejl:

  • Lexikale fejl er ikke særlig almindelige, men det skal administreres af en scanner
  • Stavefejl ved identifikatorer, operatorer, nøgleord betragtes som leksikale fejl
  • Generelt er en leksikalisk fejl forårsaget af udseendet af en eller anden ulovlig karakter, hovedsagelig i begyndelsen af ​​et token.

Fejlgendannelse i Lexical Analyzer

Her er et par mest almindelige teknikker til gendannelse af fejl:

  • Fjerner et tegn fra det resterende input
  • I paniktilstand ignoreres de på hinanden følgende tegn altid, indtil vi når et velformet token
  • Ved at indsætte det manglende tegn i det resterende input
  • Erstat et tegn med et andet tegn
  • Transporter to serietegn

Lexical Analyzer vs. Parser

Lexical Analyzer Parser
Scan inputprogram Udfør syntaksanalyse
Identificer tokens Opret en abstrakt repræsentation af koden
Indsæt tokens i symboltabellen Opdater symboltabelposter
Det genererer leksikale fejl Det genererer et parse-træ af kildekoden

Hvorfor adskille Lexical og Parser?

  • Enkelheden ved design: Det letter processen med leksikalanalyse og syntaksanalyse ved at fjerne uønskede tokens
  • For at forbedre kompilatoreffektiviteten: Hjælper dig med at forbedre kompilatoreffektiviteten
  • Specialisering: Specialteknikker kan anvendes til at forbedre den leksikale analyseproces
  • Bærbarhed: kun scanneren skal kommunikere med omverdenen
  • Højere bærbarhed: input-enhedsspecifikke særegenheder begrænset til lexeren

Fordele ved Lexical analyse

  • Lexikalisk analysemetode bruges af programmer som kompilatorer, der kan bruge de parsede data fra en programmers kode til at oprette en kompileret binær eksekverbar kode
  • Det bruges af webbrowsere til at formatere og vise en webside ved hjælp af analyserede data fra JavsScript, HTML, CSS
  • En separat leksikalsk analysator hjælper dig med at konstruere en specialiseret og potentielt mere effektiv processor til opgaven

Ulempen ved Lexical analyse

  • Du skal bruge betydelig tid på at læse kildeprogrammet og opdele det i form af tokens
  • Nogle regulære udtryk er ret vanskelige at forstå sammenlignet med PEG- eller EBNF-regler
  • Der kræves mere indsats for at udvikle og fejle lexeren og dens tokenbeskrivelser
  • Yderligere runtime-omkostninger er nødvendige for at generere lexertabellerne og konstruere tokens

Resumé

  • Leksikalanalyse er den allerførste fase i kompilatorens design
  • Et lexeme er en sekvens af tegn, der er inkluderet i kildeprogrammet i henhold til det matchende mønster for et token
  • Lexical analyzer er implementeret til at scanne hele kildekoden til programmet
  • Lexikalisk analysator hjælper med at identificere token i symboltabellen
  • En tegnsekvens, som ikke er mulig at scanne ind i et gyldigt token, er en leksikalsk fejl
  • Fjerner et tegn fra den resterende input er nyttig Fejlgendannelsesmetode
  • Lexical Analyzer scanner inputprogrammet, mens parser udfører syntaksanalyse
  • Det letter processen med leksikalanalyse og syntaksanalyse ved at fjerne uønskede tokens
  • Lexical analysator bruges af webbrowsere til at formatere og vise en webside ved hjælp af parsede data fra JavsScript, HTML, CSS
  • Den største ulempe ved at bruge Lexical analysator er, at det er nødvendigt med yderligere runtime-omkostninger for at generere Lexer-tabellerne og konstruere tokens