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-

- "Get next token" er en kommando, som sendes fra parseren til den leksikale analysator.
- Ved modtagelse af denne kommando scanner den leksikalske analysator inputtet, indtil det finder det næste token.
- 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
