Leksikalsk analyse (Analyzer) i kompilatordesign med eksempel

⚡ Smart oppsummering

Leksikalsk analyse er den første fasen i kompilatordesign, der en leksikalsk analyseverktøy konverterer en strøm av kildetegn til meningsfulle tokener. Det fjerner mellomrom og kommentarer, registrerer tokener i symboltabellen og rapporterer leksikalske feil til parseren.

  • 🔤 Første kompilatorfase: Leksikalsk analyse leser kildetegn og konverterer dem til en sekvens av tokens.
  • 🧩 Nøkkelord: Et leksem er en matchende tegnsekvens, et token er kategorien, og et mønster definerer regelen.
  • 🏗️ Slik fungerer det: Parseren ber om «hent neste token», og skanneren returnerer tokens på forespørsel.
  • 🧹 Oppryddingrolle: Lexer fjerner mellomrom og kommentarer, utvider makroer og fyller symboltabellen.
  • ⚠️ Leksikale feil: Ulovlige tegn eller feilstavede identifikatorer utløser feil, som håndteres av gjenopprettingsteknikker som sletting eller transponering.
  • 🔀 Lexer vs. Parser: Lexeren identifiserer tokener; parseren bygger et parse-tre under syntaksanalyse.

Leksikalsk analyse

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 magemuskeltract-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

Spørsmål og svar

Populære verktøy inkluderer Lex og den åpen kildekode-versjonen Flex. Du skriver tokenmønstre som regulære uttrykk, og verktøyet genererer skannerkildekoden automatisk, slik at du slipper å kode tokenisereren manuelt.

En leksikalsk analysator definerer hvert token som et regulært uttrykk og implementerer samsvaringen ved hjelp av endelige automater. Den skanner tegn fra venstre til høyre og sender ut det lengste gyldige samsvaret som neste token.

En symboltabell er en datastruktur der den leksikalske analysatoren lagrer identifikatorer og deres attributter, for eksempel navn og type. Later kompilatorfaser leser og oppdaterer den til track variabler og funksjoner.

AI kan generere tokenbaserte regulære uttrykk fra eksempler, oppdage tvetydige eller overlappende elementerping mønstre og forklare skannerfeil. Dette fremskynder bygging og feilsøking av en leksikon for et nytt språk eller DSL.

Ikke helt. Kompilatorer bruker faste regler og endelige automater for å tokenisere kode, mens AI-modeller deler tekst inn i statistiske underordstokener. Målene er forskjellige: eksakt parsing kontra fleksibel språkforståelse.

Oppsummer dette innlegget med: