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.

  • ๐Ÿ”ค Fรถrsta kompilatorfasen: Lexikal analys lรคser kรคlltecken och omvandlar dem till en sekvens av tokens.
  • ๐Ÿงฉ Nyckelbegrepp: Ett lexem รคr en matchande teckensekvens, en token รคr dess kategori och ett mรถnster definierar regeln.
  • ๐Ÿ—๏ธ Sรฅ fungerar det: Parsern begรคr "hรคmta nรคsta token" och skannern returnerar tokens pรฅ begรคran.
  • ๐Ÿงน Stรคdningsroll: Lexern tar bort blanksteg och kommentarer, expanderar makron och fyller symboltabellen.
  • โš ๏ธ Lexikala fel: Ogiltiga tecken eller felstavade identifierare utlรถser fel, som hanteras med รฅterstรคllningstekniker som borttagning eller transponering.
  • ๐Ÿ”€ Lexer vs Parser: Lexern identifierar tokens; parsern bygger ett parstrรคd under syntaxanalys.

Lexikalisk analys

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-

Lexical Analyzer Architecture
Lexical Analyzer Architecture
  1. "Get next token" รคr ett kommando som skickas frรฅn parsern till den lexikala analysatorn.
  2. Nรคr den lexikala analysatorn tar emot detta kommando skannar den inmatningen tills den hittar nรคsta token.
  3. 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

Vanliga frรฅgor

Populรคra verktyg inkluderar Lex och dess รถppen kรคllkodsversion Flex. Du skriver tokenmรถnster som reguljรคra uttryck, och verktyget genererar skannerns kรคllkod automatiskt, vilket sparar dig frรฅn att koda tokeniseraren manuellt.

En lexikal analysator definierar varje token som ett reguljรคrt uttryck och implementerar matchningen med hjรคlp av รคndliga automater. Den skannar tecken frรฅn vรคnster till hรถger och genererar den lรคngsta giltiga matchningen som nรคsta token.

En symboltabell รคr en datastruktur dรคr den lexikala analysatorn lagrar identifierare och deras attribut, sรฅsom namn och typ. Later kompilatorfaser lรคser och uppdaterar den till track variabler och funktioner.

AI kan generera reguljรคra uttryck med symboler frรฅn exempel, upptรคcka tvetydiga eller รถverlappande funktionerping mรถnster och fรถrklara skannerfel. Detta pรฅskyndar byggandet och felsรถkningen av en lexer fรถr ett nytt sprรฅk eller DSL.

Inte exakt. Kompilatorer anvรคnder fasta regler och รคndliga automater fรถr att tokenisera kod, medan AI-modeller delar upp text i statistiska delordstokens. Mรฅlen skiljer sig รฅt: exakt parsning kontra flexibel sprรฅkfรถrstรฅelse.

Sammanfatta detta inlรคgg med: