Leksikalsk analyse (Analyzer) i compilerdesign med eksempel

⚡ Smart opsummering

Leksikalsk analyse er den første fase i compilerdesign, hvor en leksikalsk analyseværktøj konverterer en strøm af kildetegn til meningsfulde tokens. Den fjerner mellemrum og kommentarer, registrerer tokens i symboltabellen og rapporterer leksikalske fejl til parseren.

  • 🔤 Første compilerfase: Leksikalsk analyse læser kildetegn og konverterer dem til en sekvens af tokens.
  • 🧩 Nøglebegreber: Et leksem er en matchende tegnsekvens, et token er dets kategori, og et mønster definerer reglen.
  • 🏗️ Sådan Fungerer Det: Parseren anmoder om "hent næste token", og scanneren returnerer tokens efter anmodning.
  • 🧹 Oprydningsrolle: Lexer'en fjerner mellemrum og kommentarer, udvider makroer og udfylder symboltabellen.
  • ⚠️ Leksikale fejl: Ulovlige tegn eller forkert stavede identifikatorer udløser fejl, der håndteres af gendannelsesteknikker som sletning eller transponering.
  • 🔀 Lexer vs. Parser: Lexeren identificerer tokens; parseren opbygger et parsetræ under syntaksanalyse.

Lexikalisk analyse

Hvad er leksikalsk analyse?

Lexikalisk analyse er den allerførste fase i kompileringsdesignet. En Lexer tager den modificerede kildekode, som er skrevet i form af sætninger. Med andre ord hjælper det dig med at konvertere en sekvens af tegn til en sekvens af tokens. Den leksikalske analysator opdeler denne syntaks i en række tokens. Det fjerner ekstra plads eller kommentarer skrevet i kildekoden.

Programmer, der udfører leksikalsk analyse i compilerdesign, kaldes leksikalske analysatorer eller lexere. En lexer indeholder tokenizer eller scanner. Hvis den leksikale analysator registrerer, at tokenet er ugyldigt, genererer det en fejl. Rollen af ​​Lexical Analyzer i compilerdesign er at læse karakterstrømme fra kildekoden, tjekke for lovlige tokens og videregive dataene til syntaksanalysatoren, når det kræver det.

Eksempel

How Pleasant Is The Weather?

Se dette eksempel på leksikalsk analyse; 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 separatorerne, tomme felter 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 der er sat separatorer på de ulige steder. Det er ikke noget, der kommer til dig med det samme.

Grundlæggende terminologier

Hvad er et leksem?

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

Hvad er et token?

Tokens i compilerdesign er sekvensen af ​​tegn, som repræsenterer en informationsenhed i kildeprogrammet.

Hvad er mønster?

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

Leksisk analysator Architecture: Sådan genkendes tokens

Den leksikalske analyses hovedopgave er at læse inputtegn i koden og producere tokens.

Leksikalsk analysator scanner hele programmets kildekode. Den identificerer hver token en efter en. Scannere implementeres normalt til kun at producere tokens, når de anmodes af en parser. Her er, hvordan genkendelse af tokens i compilerdesign fungerer-

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

Lexical Analyzer springer mellemrum og kommentarer over, mens du opretter disse tokens. Hvis der er en fejl, korrelerer Lexical analyzer denne fejl med kildefilen og linjenummeret.

Roller af den leksikalske analysator

Leksikalsk analysator udfører nedenstående givne 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å leksikalsk analyse, tokens, ikke-tokens

Overvej følgende kode, der føres 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å oprettede tokens

Lexeme Polet
int Søgeord
maksimal Identifier
( OperaTor
int Søgeord
x Identifier
, OperaTor
int Søgeord
Y Identifier
) OperaTor
{ OperaTor
If Søgeord

Eksempler på ikke-tokens

Type Eksempler
Kommentar // Dette vil sammenligne 2 tal
Pre-processor direktiv #omfatte
Pre-processor direktiv #define NUMS 8,9
Makro NUMS
mellemrum /n /b /t

Leksikale fejl

En tegnsekvens, som ikke er mulig at scanne ind i nogen gyldig token, er en leksikalsk fejl. Vigtige fakta om den leksikalske fejl:

  • Leksikale fejl er ikke særlig almindelige, men det bør administreres af en scanner
  • Stavefejl af identifikatorer, operatorer, nøgleord betragtes som leksikalske fejl
  • Generelt er en leksikalsk fejl forårsaget af udseendet af en ulovlig karakter, for det meste i begyndelsen af ​​et token.

Fejlgendannelse i Lexical Analyzer

Her er et par mest almindelige fejlgendannelsesteknikker:

  • Fjerner ét tegn fra det resterende input
  • I paniktilstanden ignoreres de på hinanden følgende karakterer altid, indtil vi når et velformet symbol
  • Ved at indsætte det manglende tegn i det resterende input
  • Erstat et tegn med et andet tegn
  • Transponer to serielle tegn

Leksical Analyzer vs. Parser

Leksisk analysator parser
Scan Input program Udfør syntaksanalyse
Identificer tokens Skab en mavemuskeltract-repræsentation af koden
Indsæt tokens i symboltabellen Opdater symboltabelposter
Det genererer leksikalske fejl Det genererer et parsetræ af kildekoden

Hvorfor adskille Lexical og Parser?

  • Designets enkelhed: Det letter processen med leksikalsk analyse og syntaksanalysen ved at eliminere uønskede tokens
  • For at forbedre compiler effektivitet: Hjælper dig med at forbedre compiler effektivitet
  • Specialisering: specialiserede teknikker kan anvendes til at forbedre den leksikalske analyseproces
  • Bærbarhed: kun scanneren kræver at kommunikere med omverdenen
  • Højere portabilitet: input-enhedsspecifikke ejendommeligheder begrænset til lexeren

Fordele ved leksikalsk analyse

  • Leksikalsk analysemetode bruges af programmer som compilere, der kan bruge de parsede data fra en programmørs kode til at skabe en kompileret binær eksekverbar kode
  • Det bruges af webbrowsere til at formatere og vise en webside ved hjælp af parsede data fra JavaScript, HTML, CSS
  • En separat leksikalsk analysator hjælper dig med at konstruere en specialiseret og potentielt mere effektiv processor til opgaven

Ulempen ved leksikalsk analyse

  • Du skal bruge betydelig tid på at læse kildeprogrammet og opdele det i form af tokens
  • Nogle regulære udtryk er ret svære at forstå sammenlignet med PEG- eller EBNF-regler
  • Der er behov for en større indsats for at udvikle og fejlfinde lexeren og dens token-beskrivelser
  • Der kræves yderligere runtime-overhead for at generere lexer-tabellerne og konstruere tokens

Ofte Stillede Spørgsmål

Populære værktøjer inkluderer Lex og dens open source-version Flex. Du skriver tokenmønstre som regulære udtryk, og værktøjet genererer automatisk scannerens kildekode, hvilket sparer dig for at kode tokenizeren manuelt.

En leksikalsk analysator definerer hvert token som et regulært udtryk og implementerer matchningen ved hjælp af endelige automater. Den scanner tegn fra venstre mod højre og udsender det længste gyldige match som det næste token.

En symboltabel er en datastruktur, hvor den leksikalske analysator lagrer identifikatorer og deres attributter, såsom navn og type. Later compilerfaser læser og opdaterer den til track variabler og funktioner.

AI kan generere token-regulære udtryk fra eksempler, finde tvetydige eller overlappende elementerping mønstre og forklarer scannerfejl. Dette fremskynder opbygning og fejlfinding af en leksikon til et nyt sprog eller DSL.

Ikke helt. Compilere bruger faste regler og endelige automater til at tokenisere kode, mens AI-modeller opdeler tekst i statistiske underordstokens. Målene er forskellige: præcis parsing versus fleksibel sprogforståelse.

Opsummer dette indlæg med: