Leksikalanalyse i Compiler Design med eksempel

Innholdsfortegnelse:

Anonim

Hva er Lexical Analysis?

LEXICAL ANALYSIS er den aller første fasen i kompileringsdesignet. En Lexer tar den modifiserte kildekoden som er skrevet i form av setninger. Med andre ord hjelper det deg å konvertere en sekvens av tegn til en sekvens av tokens. Den leksikale analysatoren deler denne syntaksen i en serie tokens. Det fjerner ekstra plass eller kommentar skrevet i kildekoden.

Programmer som utfører leksikalanalyse kalles leksikale analysatorer eller leksikere. En lexer inneholder tokenizer eller skanner. Hvis den leksikale analysatoren oppdager at token er ugyldig, genererer det en feil. Den leser tegnstrømmer fra kildekoden, sjekker for lovlige tokens, og overfører dataene til syntaksanalysatoren når den krever det.

Eksempel

How Pleasant Is The Weather?

Se dette eksemplet; Her kan vi lett gjenkjenne at det er fem ord How Pleasant, The, Weather, Is. Dette er veldig naturlig for oss, da vi kan gjenkjenne skilletegnene, blankene og tegnsettingstegnet.

 HowPl easantIs Th ewe ather?

Nå, sjekk dette eksemplet, vi kan også lese dette. Det vil imidlertid ta litt tid fordi skillelinjer plasseres i Odd Places. Det er ikke noe som kommer til deg umiddelbart.

I denne veiledningen vil du lære

  • Grunnleggende terminologier:
  • Lexical Analyzer Architecture: Hvordan tokens blir gjenkjent
  • Rollene til den Lexical analysatoren
  • Lexikale feil
  • Feilgjenoppretting i Lexical Analyzer
  • Lexical Analyzer vs. Parser
  • Hvorfor skille Lexical og Parser?
  • Fordeler med leksikalanalyse
  • Ulempen med leksikalanalyse

Grunnleggende terminologier

Hva er et lexeme?

Et lexeme er en sekvens av tegn som er inkludert i kildeprogrammet i henhold til det matchende mønsteret til et token. Det er ingenting annet enn en forekomst av et token.

Hva er et symbol?

Token er en sekvens av tegn som representerer en informasjonsenhet i kildeprogrammet.

Hva er mønster?

Et mønster er en beskrivelse som brukes av tokenet. Når det gjelder et nøkkelord som brukes som et token, er mønsteret en sekvens av tegn.

Lexical Analyzer Architecture: Hvordan tokens blir gjenkjent

Hovedoppgaven med leksikalanalyse er å lese inndata i koden og produsere tokens.

Lexical analysator skanner hele kildekoden til programmet. Det identifiserer hvert token en etter en. Skannere implementeres vanligvis for å produsere tokens bare når en parser ber om det. Slik fungerer dette -

  1. "Get next token" er en kommando som sendes fra parseren til den leksikale analysatoren.
  2. Ved mottak av denne kommandoen skanner den leksikale analysatoren inngangen til den finner neste token.
  3. Det returnerer token til Parser.

Lexical Analyzer hopper over mellomrom og kommentarer mens du lager disse tokens. Hvis det er noen feil, vil Lexical analysator korrelere den feilen med kildefilen og linjenummeret.

Rollene til den Lexical analysatoren

Lexical analyzer utfører nedenfor gitte oppgaver:

  • Hjelper med å identifisere token i symboltabellen
  • Fjerner hvite mellomrom og kommentarer fra kildeprogrammet
  • Korrelerer feilmeldinger med kildeprogrammet
  • Hjelper deg med å utvide makroene hvis den finnes i kildeprogrammet
  • Les inndata fra kildeprogrammet

Eksempel på leksikalanalyse, poletter, ikke-poletter

Vurder følgende kode som blir matet 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 opprettet

Lexeme Token
int Nøkkelord
maksimum Identifikator
( Operatør
int Nøkkelord
x Identifikator
, Operatør
int Nøkkelord
Y Identifikator
) Operatør
{ Operatør
Hvis Nøkkelord

Eksempler på nontokens

Type Eksempler
Kommentar // Dette vil sammenligne 2 tall
Forprosessor-direktiv # inkluderer
Forprosessor-direktiv #define NUMS 8,9
Makro NUMS
Mellomrom / n / b / t

Lexikale feil

En tegnsekvens som ikke er mulig å skanne inn i noe gyldig token, er en leksikal feil. Viktige fakta om den leksikale feilen:

  • Lexikale feil er ikke veldig vanlige, men det skal administreres av en skanner
  • Feilstaving av identifikatorer, operatører, nøkkelord regnes som leksikale feil
  • Generelt er en leksikalfeil forårsaket av utseendet til en eller annen ulovlig karakter, hovedsakelig i begynnelsen av et token.

Feilgjenoppretting i Lexical Analyzer

Her er noen få vanligste feilgjenopprettingsteknikker:

  • Fjerner ett tegn fra den gjenværende inngangen
  • I panikkmodus blir de påfølgende tegnene alltid ignorert til vi når et velformet token
  • Ved å sette inn det manglende tegnet i den gjenværende inngangen
  • Bytt ut et tegn med et annet tegn
  • Transponere to serietegn

Lexical Analyzer vs. Parser

Lexical Analyzer Parser
Skann inndataprogram Utfør syntaksanalyse
Identifiser tokens Lag en abstrakt representasjon av koden
Sett inn tokens i symboltabellen Oppdater symboltabelloppføringer
Det genererer leksikale feil Det genererer et parse-tre av kildekoden

Hvorfor skille Lexical og Parser?

  • Enkelheten i design: Det letter prosessen med leksikalanalyse og syntaksanalyse ved å eliminere uønskede tokens
  • For å forbedre kompilatoreffektiviteten: Hjelper deg med å forbedre kompilatoreffektiviteten
  • Spesialisering: spesialiserte teknikker kan brukes for å forbedre den leksikale analyseprosessen
  • Bærbarhet: bare skanneren krever å kommunisere med omverdenen
  • Høyere bærbarhet: spesifikke spesifikasjoner for inngangsenheter begrenset til lexer

Fordeler med leksikalanalyse

  • Lexical analysator metode brukes av programmer som kompilatorer som kan bruke de analyserte dataene fra programmererens kode for å lage en kompilert binær kjørbar kode
  • Den brukes av nettlesere til å formatere og vise en webside ved hjelp av analyserte data fra JavsScript, HTML, CSS
  • En separat leksikalanalysator hjelper deg med å konstruere en spesialisert og potensielt mer effektiv prosessor for oppgaven

Ulempen med leksikalanalyse

  • Du må bruke betydelig tid på å lese kildeprogrammet og dele det i form av tokens
  • Noen vanlige uttrykk er ganske vanskelige å forstå sammenlignet med PEG- eller EBNF-regler
  • Det kreves mer innsats for å utvikle og feilsøke lexeren og dens tokenbeskrivelser
  • Ytterligere runtime-overhead er nødvendig for å generere lexer-tabellene og konstruere tokens

Sammendrag

  • Leksikalanalyse er den aller første fasen i kompileringsdesignet
  • Et lexeme er en sekvens av tegn som er inkludert i kildeprogrammet i henhold til det matchende mønsteret til et token
  • Lexical analyzer er implementert for å skanne hele kildekoden til programmet
  • Lexical analysator hjelper deg med å identifisere token i symboltabellen
  • En tegnsekvens som ikke er mulig å skanne inn i noe gyldig token, er en leksikal feil
  • Fjerner ett tegn fra gjenværende inndata er nyttig Feilgjenopprettingsmetode
  • Lexical Analyzer skanner inngangsprogrammet mens parser utfører syntaksanalyse
  • Det letter prosessen med leksikalanalyse og syntaksanalyse ved å eliminere uønskede tokens
  • Lexical analysator brukes av nettlesere til å formatere og vise en webside ved hjelp av analyserte data fra JavsScript, HTML, CSS
  • Den største ulempen ved å bruke Lexical analysator er at det er behov for ytterligere kjøretidskostnader for å generere lexer-tabellene og konstruere tokens