Leksikalsk analyse (Analyzer) i compilerdesign med eksempel

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 Lav en abstrakt 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

Resumé

  • Leksikalsk analyse er den allerførste fase i compilerdesignet
  • Lexemes og tokens er sekvensen af ​​tegn, der er inkluderet i kildeprogrammet i henhold til det matchende mønster af et token
  • Leksikalsk analysator er implementeret til at scanne hele programmets kildekode
  • Leksisk analysator hjælper med at identificere token i symboltabellen
  • En tegnsekvens, som ikke er mulig at scanne ind i nogen gyldig token, er en leksikalsk fejl
  • Fjerner et tegn fra det resterende input er nyttig Fejlgendannelsesmetode
  • Lexical Analyzer scanner inputprogrammet, mens parseren udfører syntaksanalyse
  • Det letter processen med leksikalsk analyse og syntaksanalysen ved at eliminere uønskede tokens
  • Leksisk analysator bruges af webbrowsere til at formatere og vise en webside ved hjælp af parsede data fra Javascript, HTML, CSS
  • Den største ulempe ved at bruge Lexical Analyser er, at den kræver yderligere runtime overhead for at generere lexer-tabellerne og konstruere tokens

Opsummer dette indlæg med: