Lexicale analyse (Analyzer) in compilerontwerp met voorbeeld

โšก Slimme samenvatting

Lexicale analyse is de eerste fase van compilerontwerp, waarbij een lexer een stroom brontekens omzet in betekenisvolle tokens. Het verwijdert witruimte en commentaar, registreert tokens in de symbolentabel en rapporteert lexicale fouten aan de parser.

  • ๐Ÿ”ค Eerste compilerfase: Lexicale analyse leest de brontekst en zet deze om in een reeks tokens.
  • ๐Ÿงฉ Sleutelbegrippen: Een lexeme is een overeenkomende tekenreeks, een token is de categorie ervan en een patroon definieert de regel.
  • ???? ๏ธ Hoe werkt het: De parser vraagt โ€‹โ€‹om "volgende token op te halen", en de scanner retourneert tokens op verzoek.
  • ๐Ÿงน Opruimrol: De lexer verwijdert witruimte en commentaar, breidt macro's uit en vult de symbolentabel.
  • โš ๏ธ Lexicale fouten: Ongeldige tekens of verkeerd gespelde identificatoren veroorzaken fouten, die worden afgehandeld door hersteltechnieken zoals verwijdering of verwisseling.
  • ๐Ÿ”€ Lexer versus Parser: De lexer identificeert tokens; de parser bouwt een parseboom op tijdens de syntactische analyse.

Lexicale analyse

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 Creรซer een buikspiertract 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 JavaScript, 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

Veelgestelde vragen

Populaire tools zijn onder andere Lex en de open-sourceversie Flex. Je schrijft tokenpatronen als reguliere expressies en de tool genereert automatisch de broncode voor de scanner, waardoor je de tokenizer niet handmatig hoeft te coderen.

Een lexicale analyzer definieert elk token als een reguliere expressie en implementeert de matching met behulp van eindige automaten. Het scant tekens van links naar rechts en geeft de langst geldige overeenkomst als volgend token weer.

Een symbolentabel is een datastructuur waarin de lexicale analyzer identificatoren en hun attributen, zoals naam en type, opslaat. Later De compilerfasen lezen en werken het bij. track variabelen en functies.

AI kan reguliere expressies voor tokens genereren op basis van voorbeelden, dubbelzinnigheden of overlappingen opsporen.ping patronen en scannerfouten verklaren. Dit versnelt het bouwen en debuggen van een lexer voor een nieuwe taal of DSL.

Niet helemaal. Compilers gebruiken vaste regels en eindige automaten om code te tokeniseren, terwijl AI-modellen tekst opsplitsen in statistische subwoordtokens. De doelen verschillen: exacte parsing versus flexibel taalbegrip.

Vat dit bericht samen met: