Lexikal analys (Analyzer) i kompilatordesign med exempel

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

Sammanfattning

  • Lexikal analys är den allra första fasen i kompilatordesignen
  • Lexemes och tokens är sekvensen av tecken som ingår i källprogrammet enligt det matchande mönstret för en token
  • Lexical analysator är implementerad för att skanna hela källkoden för programmet
  • Lexikal analysator hjälper till att identifiera token i symboltabellen
  • En teckensekvens som inte är möjlig att skanna in i någon giltig token är ett lexikalt fel
  • Tar bort ett tecken från den återstående inmatningen är användbar Felåterställningsmetod
  • Lexical Analyzer skannar inmatningsprogrammet medan parser utför syntaxanalys
  • Det underlättar processen för lexikal analys och syntaxanalysen genom att eliminera oönskade tokens
  • Lexical analyzer används av webbläsare för att formatera och visa en webbsida med hjälp av analyserad data från Javascript, HTML, CSS
  • Den största nackdelen med att använda Lexical Analyser är att det krävs ytterligare runtime overhead för att generera lexertabellerna och konstruera tokens