Wat is lexicale analyse?
LEXICALE ANALYSE is de allereerste fase in het ontwerpen van de compiler. Een Lexer neemt de gewijzigde broncode die in de vorm van zinnen is geschreven. Met andere woorden, het helpt u om een reeks tekens om te zetten in een reeks tokens. De lexicale analysator verdeelt deze syntaxis in een reeks tokens. Het verwijdert alle extra spatie of commentaar geschreven in de broncode.
Programma's die lexicale analyse uitvoeren, worden lexicale analysatoren of lexers genoemd. Een lexer bevat tokenizer of scanner. Als de lexicale analysator detecteert dat het token ongeldig is, wordt er een fout gegenereerd. Het leest tekenstromen uit de broncode, controleert op legale tokens en geeft de gegevens door aan de syntaxisanalysator wanneer dit nodig is.
Voorbeeld
How Pleasant Is The Weather?
Zie dit voorbeeld; Hier kunnen we gemakkelijk herkennen dat er vijf woorden zijn How Pleasant, The, Weather, Is. Dit is heel natuurlijk voor ons omdat we de scheidingstekens, spaties en het leesteken kunnen herkennen.
HowPl easantIs Th ewe ather?
Bekijk nu dit voorbeeld, we kunnen dit ook lezen. Het zal echter enige tijd duren omdat scheidingstekens in de oneven plaatsen worden geplaatst. Het is niet iets dat je onmiddellijk binnenkomt.
In deze tutorial leer je
- Basisterminologieën:
- Lexical Analyzer Architecture: hoe tokens worden herkend
- Rollen van de lexicale analysator
- Lexicale fouten
- Foutherstel in Lexical Analyzer
- Lexical Analyzer versus Parser
- Waarom Lexical en Parser scheiden?
- Voordelen van lexicale analyse
- Nadeel van lexicale analyse
Basisterminologieën
Wat is een lexeme?
Een lexeme is een reeks tekens die in het bronprogramma zijn opgenomen volgens het overeenkomende patroon van een token. Het is niets anders dan een instantie van een token.
Wat is een teken?
Het token is een reeks tekens die een informatie-eenheid in het bronprogramma vertegenwoordigt.
Wat is patroon?
Een patroon is een beschrijving die wordt gebruikt door het token. In het geval van een trefwoord dat als token wordt gebruikt, is het patroon een reeks tekens.
Lexical Analyzer Architecture: hoe tokens worden herkend
De belangrijkste taak van lexicale analyse is het lezen van invoertekens in de code en het produceren van tokens.
Lexical analyzer scant de volledige broncode van het programma. Het identificeert elk teken een voor een. Scanners worden meestal geïmplementeerd om alleen tokens te produceren als een parser daarom vraagt. Hier is hoe dit werkt-
- "Get next token" is een commando dat van de parser naar de lexicale analyzer wordt gestuurd.
- Bij ontvangst van dit commando scant de lexicale analysator de invoer totdat hij het volgende token vindt.
- Het retourneert het token naar Parser.
Lexical Analyzer slaat spaties en opmerkingen over tijdens het maken van deze tokens. Als er een fout aanwezig is, zal Lexical Analyzer die fout correleren met het bronbestand en het regelnummer.
Rollen van de lexicale analysator
Lexical Analyzer voert onderstaande taken uit:
- Helpt bij het identificeren van token in de symbolentabel
- Verwijdert witruimtes en opmerkingen uit het bronprogramma
- Correleert foutmeldingen met het bronprogramma
- Helpt u om de macro's uit te breiden als deze in het bronprogramma wordt gevonden
- Lees de invoertekens uit het bronprogramma
Voorbeeld van lexicale analyse, tokens, niet-tokens
Beschouw de volgende code die naar Lexical Analyzer wordt gestuurd
#includeint maximum(int x, int y) {// This will compare 2 numbersif (x > y)return x;else {return y;}}
Voorbeelden van gemaakte tokens
Lexeme | Teken |
int | Trefwoord |
maximum | ID |
| Operator |
int | Trefwoord |
X | ID |
| Operator |
int | Trefwoord |
Y | ID |
| Operator |
| Operator |
Als | Trefwoord |
Voorbeelden van Nontokens
Type | Voorbeelden |
Commentaar | // Hiermee worden 2 getallen vergeleken |
Pre-processor richtlijn | # include |
Pre-processor richtlijn | # definiëren 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 zijn niet erg gebruikelijk, maar moeten worden beheerd door een scanner
- Verkeerde spelling van ID's, operatoren en sleutelwoorden worden beschouwd als lexicale fouten
- Over het algemeen wordt een lexicale fout veroorzaakt door het verschijnen van een of ander illegaal teken, meestal aan het begin van een token.
Foutherstel in Lexical Analyzer
Hier volgen enkele meest voorkomende technieken voor foutherstel:
- Verwijdert een 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 karakter door een ander karakter
- Transponeer twee seriële tekens
Lexical Analyzer versus Parser
Lexical Analyzer | Parser |
Scan invoerprogramma | Voer syntaxisanalyse uit |
Identificeer tokens | Maak een abstracte weergave van de code |
Plaats tokens in de symbolentabel | Update symbooltabelinvoer |
Het genereert lexicale fouten | Het genereert een ontleedboom van de broncode |
Waarom Lexical en Parser scheiden?
- De eenvoud van het ontwerp: het vereenvoudigt het proces van lexicale analyse en de 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: invoerapparaatspecifieke eigenaardigheden beperkt tot de lexer
Voordelen van lexicale analyse
- 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 maken
- Het wordt gebruikt door webbrowsers om een webpagina op te maken en weer te geven met behulp van geparseerde gegevens uit JavsScript, HTML, CSS
- Een aparte lexicale analysator helpt u om een gespecialiseerde en potentieel efficiëntere processor voor de taak te bouwen
Nadeel van lexicale analyse
- U moet veel tijd besteden aan het lezen van het bronprogramma en het partitioneren in de vorm van tokens
- Sommige reguliere expressies zijn vrij moeilijk te begrijpen in vergelijking met PEG- of EBNF-regels
- Er is meer moeite nodig om de lexer en zijn tokenbeschrijvingen te ontwikkelen en te debuggen
- Extra runtime-overhead is vereist om de lexer-tabellen te genereren en de tokens te construeren
Overzicht
- Lexicale analyse is de allereerste fase in het ontwerpen van de compiler
- Een lexeme is een reeks tekens die in het bronprogramma zijn opgenomen volgens het overeenkomende patroon van een token
- Lexical analyzer is geïmplementeerd om de volledige broncode van het programma te scannen
- Lexicale analysator helpt om token in de symbolentabel te identificeren
- Een tekenreeks die niet in een geldig token kan worden gescand, is een lexicale fout
- Een teken verwijderen uit de resterende invoer is een nuttige methode voor foutherstel
- Lexical Analyzer scant het invoerprogramma terwijl de parser syntaxisanalyse uitvoert
- Het vereenvoudigt het proces van lexicale analyse en de syntaxisanalyse door ongewenste tokens te elimineren
- Lexical analyzer wordt gebruikt door webbrowsers 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