Lexikal analys (Analyzer) i kompilatordesign med exempel
โก Smart sammanfattning
Lexikal analys รคr den fรถrsta fasen i kompilatordesign, dรคr en lexiker konverterar en strรถm av kรคlltecken till meningsfulla tokens. Den tar bort blanksteg och kommentarer, registrerar tokens i symboltabellen och rapporterar lexikala fel till parsern.

Vad รคr lexikal analys?
Lexikalisk analys รคr den allra fรถrsta fasen i kompilatordesignen. En Lexer tar den modifierade kรคllkoden som รคr skriven i form av meningar. Med andra ord, det hjรคlper dig att konvertera en sekvens av tecken till en sekvens av tokens. Den lexikaliska analysatorn delar upp denna syntax i en serie tokens. Det tar bort eventuellt extra utrymme eller kommentar som skrivits i kรคllkoden.
Program som utfรถr Lexical Analysis i kompilatordesign kallas lexical analyzers eller lexers. En lexer innehรฅller tokenizer eller scanner. Om den lexikaliska analysatorn upptรคcker att token รคr ogiltig, genererar den ett fel. Lexical Analyzers roll i kompilatordesignen รคr att lรคsa teckenstrรถmmar frรฅn kรคllkoden, leta efter lagliga tokens och skicka data till syntaxanalysatorn nรคr den krรคver det.
Exempelvis
How Pleasant Is The Weather?
Se detta exempel pรฅ Lexical Analysis; Hรคr kan vi lรคtt kรคnna igen att det finns fem ord How Pleasant, The, Weather, Is. Detta รคr mycket naturligt fรถr oss eftersom vi kan kรคnna igen avgrรคnsare, blanktecken och skiljetecken.
HowPl easantIs Th ewe ather?
Kolla nu detta exempel, vi kan ocksรฅ lรคsa detta. Det kommer dock att ta lite tid eftersom separatorer sรคtts pรฅ de udda platserna. Det รคr inget som kommer till dig omedelbart.
Grundlรคggande terminologier
Vad รคr ett lexem?
Ett lexem รคr en sekvens av tecken som ingรฅr i kรคllprogrammet enligt det matchande mรถnstret fรถr en token. Det รคr inget annat รคn ett exempel pรฅ en token.
Vad รคr en token?
Tokens i kompilatordesign รคr sekvensen av tecken som representerar en informationsenhet i kรคllprogrammet.
Vad รคr mรถnster?
Ett mรถnster รคr en beskrivning som anvรคnds av token. Nรคr det gรคller ett nyckelord som anvรคnds som en token, รคr mรถnstret en sekvens av tecken.
Lexical Analyzer Architecture: Hur tokens kรคnns igen
Huvuduppgiften fรถr lexikal analys รคr att lรคsa indatatecken i koden och producera tokens.
Lexical analyzer skannar hela kรคllkoden fรถr programmet. Den identifierar varje token en efter en. Skanners รคr vanligtvis implementerade fรถr att producera tokens endast nรคr de begรคrs av en parser. Sรฅ hรคr fungerar igenkรคnning av tokens i kompilatordesign-

- "Get next token" รคr ett kommando som skickas frรฅn parsern till den lexikala analysatorn.
- Nรคr den lexikala analysatorn tar emot detta kommando skannar den inmatningen tills den hittar nรคsta token.
- Den returnerar token till Parser.
Lexical Analyzer hoppar รถver blanksteg och kommentarer nรคr du skapar dessa tokens. Om nรฅgot fel finns, kommer Lexical analyzer att korrelera det felet med kรคllfilen och radnumret.
Roller fรถr den lexikaliska analysatorn
Lexikal analysator utfรถr fรถljande uppgifter:
- Hjรคlper till att identifiera token i symboltabellen
- Tar bort blanksteg och kommentarer frรฅn kรคllprogrammet
- Korrelerar felmeddelanden med kรคllprogrammet
- Hjรคlper dig att utรถka makron om det finns i kรคllprogrammet
- Lรคs indatatecken frรฅn kรคllprogrammet
Exempel pรฅ lexikal analys, tokens, icke-tokens
Tรคnk pรฅ fรถljande kod som matas till Lexical Analyzer
#include <stdio.h> int maximum(int x, int y) { // This will compare 2 numbers if (x > y) return x; else { return y; } }
Exempel pรฅ tokens skapade
| Lexeme | Pollett |
|---|---|
| int | Nyckelord |
| maximal | Identifiera |
| ( | Operator |
| int | Nyckelord |
| x | Identifiera |
| , | Operator |
| int | Nyckelord |
| Y | Identifiera |
| ) | Operator |
| { | Operator |
| If | Nyckelord |
Exempel pรฅ Nontokens
| Typ | Exempel |
|---|---|
| Kommentar | // Detta kommer att jรคmfรถra 2 nummer |
| Fรถrbehandlare direktiv | #omfatta |
| Fรถrbehandlare direktiv | #define NUMS 8,9 |
| Makro | NUMS |
| blank | /n /b /t |
Lexikala fel
En teckensekvens som inte รคr mรถjlig att skanna in i nรฅgon giltig token รคr ett lexikalt fel. Viktiga fakta om lexikalfelet:
- Lexikala fel รคr inte sรคrskilt vanliga, men det bรถr hanteras av en skanner
- Felstavning av identifierare, operatorer, nyckelord betraktas som lexikaliska fel
- I allmรคnhet orsakas ett lexikalt fel av uppkomsten av nรฅgon olaglig karaktรคr, mestadels i bรถrjan av en token.
Felรฅterstรคllning i Lexical Analyzer
Hรคr รคr nรฅgra vanligaste felรฅterstรคllningstekniker:
- Tar bort ett tecken frรฅn den รฅterstรฅende inmatningen
- I paniklรคget ignoreras alltid de pรฅ varandra fรถljande karaktรคrerna tills vi nรฅr en vรคlformad token
- Genom att infoga det saknade tecknet i den รฅterstรฅende inmatningen
- Ersรคtt ett tecken med ett annat tecken
- Transponera tvรฅ serietecken
Lexical Analyzer vs. Parser
| Lexical Analyzer | parser |
|---|---|
| Scan Input-program | Utfรถr syntaxanalys |
| Identifiera tokens | Skapa magmusklertract-representation av koden |
| Infoga tokens i symboltabellen | Uppdatera symboltabellposter |
| Det genererar lexikaliska fel | Den genererar ett analystrรคd av kรคllkoden |
Varfรถr separera Lexical och Parser?
- Designens enkelhet: Det underlรคttar processen med lexikal analys och syntaxanalysen genom att eliminera oรถnskade tokens
- Fรถr att fรถrbรคttra kompilatorns effektivitet: Hjรคlper dig att fรถrbรคttra kompilatorns effektivitet
- Specialisering: specialiserade tekniker kan anvรคndas fรถr att fรถrbรคttra den lexikaliska analysprocessen
- Portabilitet: endast skannern behรถver kommunicera med omvรคrlden
- Hรถgre portabilitet: ingรฅngsenhetsspecifika egenheter begrรคnsade till lexern
Fรถrdelar med lexikal analys
- Lexikalanalysmetoden anvรคnds av program som kompilatorer som kan anvรคnda analyserad data frรฅn en programmerares kod fรถr att skapa en kompilerad binรคr kรถrbar kod
- Den anvรคnds av webblรคsare fรถr att formatera och visa en webbsida med hjรคlp av analyserad data frรฅn JavaScript, HTML, CSS
- En separat lexikalanalysator hjรคlper dig att konstruera en specialiserad och potentiellt mer effektiv processor fรถr uppgiften
Nackdel med lexikal analys
- Du mรฅste spendera mycket tid pรฅ att lรคsa kรคllprogrammet och partitionera det i form av tokens
- Vissa reguljรคra uttryck รคr ganska svรฅra att fรถrstรฅ jรคmfรถrt med PEG- eller EBNF-regler
- Mer anstrรคngning krรคvs fรถr att utveckla och felsรถka lexern och dess tokenbeskrivningar
- Ytterligare runtime overhead krรคvs fรถr att generera lexer-tabellerna och konstruera tokens
