Lexikális elemzés (elemző) a fordítótervezésben példával
Mi az a lexikális elemzés?
Lexikai elemzés a fordító tervezésének legelső fázisa. A Lexer a módosított forráskódot veszi át, amely mondatok formájában van megírva. Más szóval, segít átalakítani egy karaktersorozatot tokenek sorozatává. A lexikális elemző ezt a szintaxist tokenek sorozatára bontja. Eltávolítja a forráskódban írt minden extra szóközt vagy megjegyzést.
Azokat a programokat, amelyek lexikális elemzést végeznek a fordítótervezésben, lexikális elemzőknek vagy lexereknek nevezzük. A lexer tokenizátort vagy szkennert tartalmaz. Ha a lexikális elemző azt észleli, hogy a token érvénytelen, akkor hibát generál. A Lexical Analyzer szerepe a fordítótervezésben, hogy beolvassa a karakterfolyamokat a forráskódból, ellenőrizze a legális tokeneket, és szükség esetén átadja az adatokat a szintaktikai elemzőnek.
Példa
How Pleasant Is The Weather?
Lásd ezt a Lexikai elemzés példát; Itt könnyen felismerhetjük, hogy van öt szó: How Pleasant, The, Weather, Is. Ez nagyon természetes számunkra, mivel felismerjük az elválasztójeleket, üres helyeket és az írásjeleket.
HowPl easantIs Th ewe ather?
Most nézd meg ezt a példát, ezt is olvashatjuk. Ez azonban eltart egy ideig, mert elválasztók kerülnek a páratlan helyekre. Ez nem olyan dolog, ami azonnal megérkezik.
Alapvető terminológiák
Mi az a lexéma?
A lexéma olyan karaktersorozat, amely a forrásprogramban egy token illeszkedési mintája szerint szerepel. Ez nem más, mint egy token példánya.
Mi az a token?
A fordítóprogramban a tokenek olyan karaktersorozatok, amelyek a forrásprogramban egy információegységet képviselnek.
Mi az a minta?
A minta egy leírás, amelyet a token használ. A tokenként használt kulcsszó esetében a minta karakterek sorozata.
Lexikai elemző Architecture: Hogyan ismerhetők fel a tokenek
A lexikális elemzés fő feladata a bemeneti karakterek beolvasása a kódban és tokenek előállítása.
A Lexical Analizátor a program teljes forráskódját beolvassa. Egyenként azonosítja az egyes tokent. A szkennereket általában úgy valósítják meg, hogy csak akkor készítsenek tokeneket, ha az elemző kéri. Így működik a tokenek felismerése a fordítótervezésben -
- A „Get next token” egy parancs, amelyet az elemző küld a lexikális elemzőnek.
- A parancs fogadásakor a lexikális elemző addig vizsgálja a bemenetet, amíg meg nem találja a következő tokent.
- Visszaadja a tokent a Parsernek.
A Lexical Analyzer kihagyja a szóközöket és a megjegyzéseket a tokenek létrehozásakor. Ha bármilyen hiba van jelen, akkor a Lexical Analizátor összefüggésbe hozza a hibát a forrásfájllal és a sorszámmal.
A Lexical Analizátor szerepei
A lexikális elemző az alábbi feladatokat látja el:
- Segít azonosítani a tokent a szimbólumtáblázatban
- Eltávolítja a szóközöket és a megjegyzéseket a forrásprogramból
- A hibaüzeneteket korrelálja a forrásprogrammal
- Segít a makrók kibontásában, ha megtalálhatók a forrásprogramban
- Bemeneti karakterek beolvasása a forrásprogramból
Példa a lexikális elemzésre, tokenek, nem tokenek
Tekintsük a következő kódot, amelyet a Lexical Analyzer táplál
#include <stdio.h> int maximum(int x, int y) { // This will compare 2 numbers if (x > y) return x; else { return y; } }
Példák a létrehozott tokenekre
Lexéma | Jelképes |
---|---|
int | Kulcsszó |
maximális | Azonosító |
( | Operator |
int | Kulcsszó |
x | Azonosító |
, | Operator |
int | Kulcsszó |
Y | Azonosító |
) | Operator |
{ | Operator |
If | Kulcsszó |
Példák a nontokenekre
típus | Példák |
---|---|
Megjegyzés | // Ezzel 2 számot hasonlít össze |
Előfeldolgozó direktíva | #befoglalni |
Előfeldolgozó direktíva | #define NUMS 8,9 |
Macro | NUMS |
Fehér űr | /n /b /t |
Lexikai hibák
Az olyan karaktersorozat, amelyet nem lehet beolvasni egyetlen érvényes tokenbe sem, lexikai hiba. Fontos tények a lexikális hibáról:
- A lexikai hibák nem túl gyakoriak, de ezeket szkennerrel kell kezelni
- Az azonosítók, operátorok, kulcsszavak elírása lexikai hibának minősül
- Általában a lexikális hibát valamilyen illegális karakter megjelenése okozza, többnyire egy token elején.
Hiba-helyreállítás a Lexical Analyzerben
Íme néhány leggyakoribb hibahelyreállítási technika:
- Eltávolít egy karaktert a fennmaradó bevitelből
- Pánik módban az egymást követő karaktereket a rendszer mindig figyelmen kívül hagyja, amíg el nem érünk egy jól formált jelzőt
- A hiányzó karakter beszúrásával a fennmaradó bevitelbe
- Cserélj ki egy karaktert egy másik karakterre
- Transzponáljon két sorozat karaktert
Lexical Analyzer vs. Parser
Lexikai elemző | értelmező |
---|---|
Scan Input program | Végezzen szintaktikai elemzést |
Azonosítsa a tokeneket | Készítse el a kód absztrakt ábrázolását |
Helyezze be a tokeneket a szimbólumtáblázatba | Frissítse a szimbólumtábla bejegyzéseit |
Lexikális hibákat generál | Létrehoz egy elemzőfát a forráskódból |
Miért kell különválasztani a Lexicalt és az Parser-t?
- A tervezés egyszerűsége: Megkönnyíti a lexikális elemzés és a szintaktikai elemzés folyamatát a nem kívánt tokenek eltávolításával
- A fordító hatékonyságának javítása: Segít a fordító hatékonyságának javításában
- Specializáció: speciális technikák alkalmazhatók a lexikális elemzési folyamat javítására
- Hordozhatóság: csak a szkennernek kell kommunikálnia a külvilággal
- Nagyobb hordozhatóság: beviteli eszköz-specifikus sajátosságok a lexerre korlátozva
A lexikális elemzés előnyei
- A lexikális elemző módszert olyan programok használják, mint a fordítók, amelyek a programozói kódból származó elemzett adatokat felhasználva lefordított bináris végrehajtható kódot hozhatnak létre.
- A webböngészők ezt használják a weboldal formázására és megjelenítésére a onnan származó elemzett adatok segítségével JavaScript, HTML, CSS
- Egy külön lexikális elemző segíti a speciális és potenciálisan hatékonyabb processzor felépítését a feladathoz
A lexikális elemzés hátránya
- Jelentős időt kell töltenie a forrásprogram olvasásával és tokenek formájában történő particionálásával
- Néhány reguláris kifejezést meglehetősen nehéz megérteni a PEG vagy EBNF szabályokhoz képest
- Több erőfeszítésre van szükség a lexer és a token leírásainak fejlesztéséhez és hibakereséséhez
- További futásidejű többletterhelésre van szükség a lexer táblák létrehozásához és a tokenek létrehozásához
Összegzésként
- A lexikális elemzés a fordító tervezésének legelső fázisa
- A lexémák és a tokenek azok a karakterek sorozata, amelyek a forrásprogramban szerepelnek a token illeszkedési mintájának megfelelően
- A Lexical Analizátor a program teljes forráskódjának szkennelésére van megvalósítva
- A Lexical Analizátor segít azonosítani a tokent a szimbólumtáblázatban
- Az olyan karaktersorozat, amelyet nem lehet beolvasni egyetlen érvényes tokenbe sem, lexikai hiba
- Hasznos egy karakter eltávolítása a fennmaradó bevitelből. Hiba-helyreállítási módszer
- A Lexical Analyzer átvizsgálja a beviteli programot, miközben az elemző szintaktikai elemzést végez
- Megkönnyíti a lexikális elemzés és a szintaktikai elemzés folyamatát a nem kívánt tokenek eltávolításával
- A Lexical Analizátort a webböngészők használják a weboldal formázására és megjelenítésére JavasScript, HTML, CSS elemzett adatok segítségével.
- A Lexical analizátor használatának legnagyobb hátránya, hogy további futási időre van szükség a lexer táblák generálásához és a tokenek létrehozásához.