Lexicale analyse (Analyzer) in compilerontwerp met voorbeeld

Wat is lexicale analyse?

Lexicale analyse is de allereerste fase in het ontwerpen van de compiler. Een Lexer neemt de gewijzigde broncode over die in de vorm van zinnen is geschreven. Met andere woorden, het helpt je om een ​​reeks karakters om te zetten in een reeks tokens. De lexicale analysator verdeelt deze syntaxis in een reeks tokens. Het verwijdert alle extra ruimte of commentaar geschreven in de broncode.

Programma's die Lexicale analyse uitvoeren bij het ontwerpen van compilers worden lexicale analysatoren of lexers genoemd. Een lexer bevat een tokenizer of scanner. Als de lexicale analysator detecteert dat het token ongeldig is, genereert het een fout. De rol van Lexical Analyzer bij het ontwerp van de compiler is het lezen van karakterstromen uit de broncode, het controleren op legale tokens en het doorgeven van de gegevens aan de syntaxisanalysator wanneer dit nodig is.

Voorbeeld

How Pleasant Is The Weather?

Zie dit voorbeeld van Lexicale Analyse; Hier kunnen we gemakkelijk herkennen dat er vijf woorden zijn: hoe aangenaam, het weer, is. Dit is heel natuurlijk voor ons omdat we de scheidingstekens, spaties en het leesteken kunnen herkennen.

 HowPl easantIs Th ewe ather?

Kijk nu eens naar dit voorbeeld, we kunnen dit ook lezen. Het zal echter enige tijd duren omdat scheidingstekens op de oneven plaatsen worden geplaatst. Het is niet iets dat meteen in je opkomt.

Basisterminologieën

Wat is een lexeme?

Een lexeme is een reeks karakters die in het bronprogramma worden opgenomen volgens het matchingpatroon van een token. Het is niets anders dan een exemplaar van een token.

Wat is een teken?

Tokens in het compilerontwerp zijn de reeks tekens die een informatie-eenheid in het bronprogramma vertegenwoordigt.

Wat is patroon?

Een patroon is een beschrijving die door het token wordt gebruikt. In het geval van een trefwoord dat als token wordt gebruikt, bestaat het patroon uit een reeks tekens.

Lexicale analysator Architectuur: Hoe tokens worden herkend

De hoofdtaak van lexicale analyse is het lezen van invoertekens in de code en het produceren van tokens.

Lexicale analysator scant de volledige broncode van het programma. Het identificeert elk token één voor één. Scanners worden meestal geïmplementeerd om alleen tokens te produceren wanneer daarom wordt gevraagd door een parser. Hier ziet u hoe de herkenning van tokens in het ontwerp van de compiler werkt:

Lexicale analysator Architectuur
Lexicale analysator Architectuur
  1. “Get next token” is een commando dat van de parser naar de lexicale analysator wordt verzonden.
  2. Bij ontvangst van dit commando scant de lexicale analysator de invoer totdat hij het volgende token vindt.
  3. Het retourneert het token aan Parser.

Lexical Analyzer slaat spaties en opmerkingen over tijdens het maken van deze tokens. Als er een fout aanwezig is, zal de Lexicale analyser die fout correleren met het bronbestand en het regelnummer.

Rollen van de Lexicale analysator

De lexicale analysator voert de onderstaande taken uit:

  • Helpt bij het identificeren van tokens in de symbooltabel
  • Verwijdert witruimtes en opmerkingen uit het bronprogramma
  • Correleert foutmeldingen met het bronprogramma
  • Helpt u bij het uitbreiden van de macro's als deze in het bronprogramma worden aangetroffen
  • Lees invoertekens uit het bronprogramma

Voorbeeld van lexicale analyse, tokens, niet-tokens

Beschouw de volgende code die aan Lexical Analyzer wordt doorgegeven

#include <stdio.h>
    int maximum(int x, int y) {
        // This will compare 2 numbers
        if (x > y)
            return x;
        else {
            return y;
        }
    }

Voorbeelden van gemaakte tokens

Lexeem Token
int Keyword
maximaal Identifier
( Operator
int Keyword
x Identifier
, Operator
int Keyword
Y Identifier
) Operator
{ Operator
If Keyword

Voorbeelden van niet-tokens

Type Voorbeelden
Opmerking // Dit zal 2 getallen vergelijken
Pre-processorrichtlijn # omvat
Pre-processorrichtlijn #define NUMS 8,9
Macro NUMS
Witte ruimte /n /b /t

Lexicale fouten

Een tekenreeks die niet in een geldig token kan worden gescand, is een lexicale fout. Belangrijke feiten over de lexicale fout:

  • Lexicale fouten komen niet vaak voor, maar moeten door een scanner worden beheerd
  • Spelfouten in identificatoren, operatoren en trefwoorden worden beschouwd als lexicale fouten
  • Over het algemeen wordt een lexicale fout veroorzaakt door het verschijnen van een illegaal teken, meestal aan het begin van een token.

Foutherstel in Lexicale Analyzer

Hier volgen enkele meest voorkomende technieken voor foutherstel:

  • Verwijdert één teken uit de resterende invoer
  • In de paniekmodus worden de opeenvolgende karakters altijd genegeerd totdat we een goed gevormd token bereiken
  • Door het ontbrekende teken in de resterende invoer in te voegen
  • Vervang een teken door een ander teken
  • Transponeer twee seriële karakters

Lexicale analyser versus parser

Lexicale analysator parser
Scaninvoerprogramma Voer syntaxisanalyse uit
Identificeer tokens Maak een abstracte weergave van de code
Voeg tokens in de symbooltabel in Symbolentabelgegevens bijwerken
Het genereert lexicale fouten Het genereert een ontleedboom van de broncode

Waarom Lexicale en Parser scheiden?

  • De eenvoud van het ontwerp: het vereenvoudigt het proces van lexicale analyse en syntaxisanalyse door ongewenste tokens te elimineren
  • Om de efficiëntie van de compiler te verbeteren: Helpt u de efficiëntie van de compiler te verbeteren
  • Specialisatie: gespecialiseerde technieken kunnen worden toegepast om het lexicale analyseproces te verbeteren
  • Draagbaarheid: alleen de scanner hoeft te communiceren met de buitenwereld
  • Hogere draagbaarheid: specifieke kenmerken van het invoerapparaat beperkt tot de lexer

Voordelen van Lexicale analyse

  • De lexicale analysemethode wordt gebruikt door programma's zoals compilers die de geparseerde gegevens uit de code van een programmeur kunnen gebruiken om een ​​gecompileerde binaire uitvoerbare code te creëren
  • Het wordt door webbrowsers gebruikt om een ​​webpagina te formatteren en weer te geven met behulp van geparseerde gegevens JavsScript, HTML, CSS
  • Een afzonderlijke lexicale analysator helpt u een gespecialiseerde en potentieel efficiëntere processor voor de taak te construeren

Nadeel van Lexicale analyse

  • U moet veel tijd besteden aan het lezen van het bronprogramma en het partitioneren ervan in de vorm van tokens
  • Sommige reguliere expressies zijn behoorlijk moeilijk te begrijpen in vergelijking met PEG- of EBNF-regels
  • Er zijn meer inspanningen nodig om de lexer en zijn tokenbeschrijvingen te ontwikkelen en te debuggen
  • Er is extra runtime-overhead vereist om de lexer-tabellen te genereren en de tokens te construeren

Samenvatting

  • Lexicale analyse is de allereerste fase in het compilerontwerp
  • Lexemen en tokens zijn de reeks tekens die in het bronprogramma zijn opgenomen volgens het overeenkomende patroon van een token
  • Lexicale analysator is geïmplementeerd om de volledige broncode van het programma te scannen
  • Lexicale analysator helpt bij het identificeren van tokens in de symbooltabel
  • Een tekenreeks die niet in een geldig token kan worden gescand, is een lexicale fout
  • Het verwijderen van één teken uit de resterende invoer is handig. Foutherstelmethode
  • Lexical Analyzer scant het invoerprogramma terwijl de parser syntaxisanalyse uitvoert
  • Het vergemakkelijkt het proces van lexicale analyse en syntaxisanalyse door ongewenste tokens te elimineren
  • Lexicale analysator wordt door webbrowsers gebruikt om een ​​webpagina op te maken en weer te geven met behulp van geparseerde gegevens uit JavsScript, HTML, CSS
  • Het grootste nadeel van het gebruik van Lexical Analyzer is dat er extra runtime-overhead nodig is om de lexer-tabellen te genereren en de tokens te construeren