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-

- "Get next token" er en kommando som sendes fra parseren til den leksikale analysatoren.
- Nรฅr den mottar denne kommandoen, skanner den leksikalske analysatoren inndataene til den finner neste token.
- 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
Sammendrag
- 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
