Leksikalsk analyse (Analyzer) i kompilatordesign med eksempel

Hva er leksikalsk analyse?

Leksikalsk analyse er den aller første fasen i kompilatordesignet. 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 leksikalske analysatoren deler denne syntaksen inn i en serie tokens. Den fjerner eventuell ekstra plass eller kommentar skrevet i kildekoden.

Programmer som utfører leksikalsk analyse i kompilatordesign kalles leksikalske analyser eller lexere. En lexer inneholder tokenizer eller skanner. Hvis den leksikale analysatoren oppdager at tokenet er ugyldig, genererer det en feil. Rollen til Lexical Analyzer i kompilatordesign er å lese tegnstrømmer fra kildekoden, se etter lovlige tokens og sende dataene til syntaksanalysatoren når den krever det.

Eksempel

How Pleasant Is The Weather?

Se dette eksempelet på leksikalsk analyse; 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 skilletegn, blanktegn og tegnsettingssymbolet.

 HowPl easantIs Th ewe ather?

Sjekk dette eksemplet, vi kan også lese dette. Det vil imidlertid ta litt tid fordi det er satt inn skilletegn på Odd Places. Det er ikke noe som kommer til deg umiddelbart.

Grunnleggende terminologier

Hva er en leksem?

Et leksem er en sekvens av tegn som er inkludert i kildeprogrammet i henhold til det samsvarende mønsteret til et token. Det er ikke annet enn en forekomst av et token.

Hva er et token?

Tokens i kompilatordesign er sekvensen av tegn som representerer en informasjonsenhet i kildeprogrammet.

Hva er mønster?

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

Leksikalsk analysator Architecture: Hvordan tokens gjenkjennes

Hovedoppgaven til leksikalsk analyse er å lese inndatategn i koden og produsere tokens.

Leksikalsk analysator skanner hele kildekoden til programmet. Den identifiserer hvert token en etter en. Skannere er vanligvis implementert for å produsere tokens bare når de blir bedt om av en parser. Her er hvordan gjenkjenning av tokens i kompilatordesign fungerer-

Leksikalsk analysator Architecture
Leksikalsk analysator Architecture
  1. "Get next token" er en kommando som sendes fra parseren til den leksikale analysatoren.
  2. Når den mottar denne kommandoen, skanner den leksikalske analysatoren inndataene til den finner neste token.
  3. Det returnerer tokenet til Parser.

Lexical Analyzer hopper over mellomrom og kommentarer mens du lager disse tokenene. Hvis det er en feil, vil Lexical analyzer korrelere denne feilen med kildefilen og linjenummeret.

Rollene til den leksikalske analysatoren

Leksikalsk analysator utfører følgende oppgaver:

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

Eksempel på leksikalsk analyse, tokens, ikke-tokens

Tenk på følgende kode som mates til Lexical Analyzer

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

Eksempler på tokens opprettet

Lexeme Pollett
int søkeord
maksimal Identifiser
( Operator
int søkeord
x Identifiser
, Operator
int søkeord
Y Identifiser
) Operator
{ Operator
If søkeord

Eksempler på Nontokens

typen Eksempler
Kommentar // Dette vil sammenligne 2 tall
Forbehandlerdirektiv #inkludere
Forbehandlerdirektiv #define NUMS 8,9
Makro NUMS
mellomrom /n /b /t

Leksikale feil

En tegnsekvens som ikke er mulig å skanne inn i noen gyldig token er en leksikalsk feil. Viktige fakta om den leksikalske feilen:

  • Leksikale feil er ikke veldig vanlig, men det bør håndteres av en skanner
  • Feilstaving av identifikatorer, operatorer, nøkkelord anses som leksikalske feil
  • Vanligvis er en leksikalsk feil forårsaket av utseendet til en ulovlig karakter, for det meste i begynnelsen av et symbol.

Feilgjenoppretting i Lexical Analyzer

Her er noen av de vanligste feilgjenopprettingsteknikkene:

  • Fjerner ett tegn fra gjenværende inndata
  • I panikkmodus blir de påfølgende karakterene alltid ignorert til vi når et velformet symbol
  • Ved å sette inn det manglende tegnet i den gjenværende inngangen
  • Erstatt et tegn med et annet tegn
  • Transponer to seriefigurer

Lexical Analyzer vs. Parser

Leksikalsk analysator parser
Scan Input-program Utfør syntaksanalyse
Identifiser tokens Lag en abstrakt representasjon av koden
Sett inn tokens i symboltabellen Oppdater symboltabelloppføringer
Det genererer leksikalske feil Den genererer et parse-tre av kildekoden

Hvorfor skille Lexical og Parser?

  • Designets enkelhet: Den letter prosessen med leksikalsk analyse og syntaksanalysen ved å eliminere uønskede tokens
  • For å forbedre kompilatoreffektiviteten: Hjelper deg med å forbedre kompilatoreffektiviteten
  • Spesialisering: spesialiserte teknikker kan brukes for å forbedre den leksikalske analyseprosessen
  • Portabilitet: bare skanneren trenger å kommunisere med omverdenen
  • Høyere portabilitet: input-enhetsspesifikke særegenheter begrenset til lexeren

Fordeler med leksikalsk analyse

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

Ulempen med leksikalsk analyse

  • Du må bruke betydelig tid på å lese kildeprogrammet og partisjonere det i form av tokens
  • Noen regulære uttrykk er ganske vanskelige å forstå sammenlignet med PEG- eller EBNF-regler
  • Mer innsats er nødvendig for å utvikle og feilsøke lexeren og dens token-beskrivelser
  • Ytterligere driftskostnader kreves for å generere lexer-tabellene og konstruere tokens

Oppsummering

  • Leksikalsk analyse er den aller første fasen i kompilatordesignet
  • Lexemes og Tokens er sekvensen av tegn som er inkludert i kildeprogrammet i henhold til det samsvarende mønsteret til et token
  • Leksikal analysator er implementert for å skanne hele kildekoden til programmet
  • Leksikalanalysator hjelper til med å identifisere token i symboltabellen
  • En tegnsekvens som ikke er mulig å skanne inn i noen gyldig token er en leksikalsk feil
  • Fjerner ett tegn fra gjenværende inndata er nyttig Feilgjenopprettingsmetode
  • Lexical Analyzer skanner inndataprogrammet mens parseren utfører syntaksanalyse
  • Det letter prosessen med leksikalsk analyse og syntaksanalysen ved å eliminere uønskede tokens
  • Leksikalanalysator brukes av nettlesere til å formatere og vise en nettside ved hjelp av analyserte data fra Javascript, HTML, CSS
  • Den største ulempen med å bruke leksikalsk analysator er at det kreves ekstra driftskostnader for å generere lexer-tabellene og konstruere tokens