Leksikaalne analüüs (analüsaator) kompilaatori kujundamisel koos näitega
Mis on leksikaalne analüüs?
Leksikaalne analüüs on kompilaatori kujundamise esimene etapp. Lexer võtab modifitseeritud lähtekoodi, mis on kirjutatud lausete kujul. Teisisõnu, see aitab teil märkide jada teisendada märkide jadaks. Leksikaalne analüsaator jagab selle süntaksi märkide seeriaks. See eemaldab kõik lähtekoodis kirjutatud lisaruumid või kommentaarid.
Programme, mis teostavad kompilaatorite kujundamisel leksikaalanalüüsi, nimetatakse leksikaalanalüsaatoriteks või lekseriteks. Lekser sisaldab tokenisaatorit või skannerit. Kui leksikaalne analüsaator tuvastab, et märk on kehtetu, genereerib see vea. Lexical Analyzeri roll kompilaatori kujundamisel on lugeda lähtekoodist märgivoogusid, kontrollida seaduslikke märke ja edastada andmed süntaksianalüsaatorile, kui see nõuab.
Näide
How Pleasant Is The Weather?
Vaadake seda leksikaalse analüüsi näidet; Siin on lihtne ära tunda, et seal on viis sõna How Pleasant, The, Weather, Is. See on meie jaoks väga loomulik, kuna tunneme ära eraldajad, tühikud ja kirjavahemärgid.
HowPl easantIs Th ewe ather?
Nüüd kontrollige seda näidet, saame ka seda lugeda. See võtab aga veidi aega, sest paaritutesse kohtadesse pannakse eraldajad. See ei ole midagi, mis tuleb teile kohe.
Põhiterminoloogiad
Mis on lekseem?
Lekseem on märkide jada, mis sisalduvad lähteprogrammis vastavalt märgi sobitusmustrile. See pole midagi muud kui märgi eksemplar.
Mis on märk?
Kompilaatori kujunduses olevad märgid on märgijada, mis esindab lähteprogrammi teabeühikut.
Mis on muster?
Muster on kirjeldus, mida märgi kasutab. Märksõna puhul, mida kasutatakse märgina, on muster tähemärkide jada.
Leksikaalne analüsaator ArchiTektuur: Kuidas žetoone tuvastatakse
Leksikaalse analüüsi põhiülesanne on koodi sisendmärkide lugemine ja märkide tootmine.
Leksikaanalüsaator skannib kogu programmi lähtekoodi. See tuvastab iga märgi ükshaaval. Skannerid rakendatakse tavaliselt žetoonide tootmiseks ainult siis, kui parser seda nõuab. Siit saate teada, kuidas toimib märkide tuvastamine kompilaatori disainis -
- "Get next token" on käsk, mis saadetakse parserist leksikaalanalüsaatorisse.
- Selle käsu saamisel skannib leksikaalanalüsaator sisendit, kuni leiab järgmise märgi.
- See tagastab märgi Parserile.
Leksikaalanalüsaator jätab nende märkide loomisel vahele tühikud ja kommentaarid. Kui esineb mõni viga, korreleerib Lexical analüsaator selle vea lähtefaili ja reanumbriga.
Leksikaalanalüsaatori rollid
Leksikaanalüsaator täidab järgmisi ülesandeid:
- Aitab tuvastada märgi sümbolitabelis
- Eemaldab lähteprogrammist tühikud ja kommentaarid
- Seob veateated lähteprogrammiga
- Aitab makrosid laiendada, kui need leitakse lähteprogrammist
- Sisestusmärkide lugemine lähteprogrammist
Leksikaalse analüüsi näide, märgid, mittemärgid
Mõelge järgmisele koodile, mis Lexical Analyzerisse sisestatakse
#include <stdio.h> int maximum(int x, int y) { // This will compare 2 numbers if (x > y) return x; else { return y; } }
Näited loodud žetoonidest
Lekseem | Sümboolne |
---|---|
int | Võtmesõna |
maksimaalne | Identifier |
( | Operator |
int | Võtmesõna |
x | Identifier |
, | Operator |
int | Võtmesõna |
Y | Identifier |
) | Operator |
{ | Operator |
If | Võtmesõna |
Nontokenide näited
KASUTUSALA | Näited |
---|---|
kommentaar | // See võrdleb kahte numbrit |
Eelprotsessori direktiiv | #kaasake |
Eelprotsessori direktiiv | #define NUMBRID 8,9 |
Makro | NUMBRID |
Valge ruum | /n /b /t |
Leksikaalsed vead
Märgijada, mida ei ole võimalik ühtegi kehtivasse märgisse skaneerida, on leksikaalne viga. Olulised faktid leksikaalse vea kohta:
- Leksikaalsed vead ei ole väga levinud, kuid neid peaks haldama skanner
- Leksikaalseteks vigadeks loetakse identifikaatorite, operaatorite, märksõna kirjavigu
- Üldjuhul põhjustab leksikaalne viga mõne ebaseadusliku märgi ilmumisest, enamasti märgi alguses.
Vigade taastamine leksikaalanalüsaatoris
Siin on mõned levinumad vea taastamise tehnikad.
- Eemaldab ülejäänud sisendist ühe märgi
- Paanikarežiimis ignoreeritakse järjestikuseid märke alati, kuni jõuame hästi vormistatud märgini
- Sisestades puuduva märgi ülejäänud sisendisse
- Asendage tegelane teise tähemärgiga
- Transponeerige kaks seeriamärki
Leksikaalne analüsaator vs parser
Leksikaalne analüsaator | Parser |
---|---|
Skannimise programm | Tehke süntaksi analüüs |
Tuvastage märgid | Looge koodi abstraktne esitus |
Sisestage märgid sümbolite tabelisse | Uuenda sümbolitabeli kirjeid |
See tekitab leksikaalseid vigu | See genereerib lähtekoodi sõelumispuu |
Miks eraldada Lexical ja Parser?
- Disaini lihtsus: see hõlbustab leksikaalse analüüsi ja süntaksianalüüsi protsessi, kõrvaldades soovimatud märgid
- Kompilaatori tõhususe parandamine: Aitab teil parandada kompilaatori tõhusust
- Spetsialiseerumine: leksikaalse analüüsi protsessi parandamiseks saab kasutada spetsiaalseid tehnikaid
- Kaasaskantavus: välismaailmaga suhtlemiseks vajab ainult skanner
- Suurem kaasaskantavus: sisendseadme spetsiifilised iseärasused, mis on piiratud lekseriga
Leksikaalse analüüsi eelised
- Leksikaalanalüsaatori meetodit kasutavad sellised programmid nagu kompilaatorid, mis saavad kasutada programmeerija koodi parsitud andmeid, et luua kompileeritud binaarne käivitatav kood
- Veebibrauserid kasutavad seda veebilehe vormindamiseks ja kuvamiseks sõelutud andmete abil JavaScript, HTML, CSS
- Eraldi leksikaalanalüsaator aitab teil ülesande jaoks luua spetsiaalse ja potentsiaalselt tõhusama protsessori
Leksikaalse analüüsi puudused
- Peate kulutama palju aega lähteprogrammi lugemisele ja selle märkide kujul partitsioonidele
- Mõned regulaaravaldised on PEG- või EBNF-reeglitega võrreldes üsna raskesti mõistetavad
- Lekseri ja selle märgikirjelduste arendamiseks ja silumiseks on vaja rohkem pingutada
- Lexeri tabelite genereerimiseks ja märkide koostamiseks on vaja täiendavat käitusaja üldkulusid
kokkuvõte
- Leksikaalne analüüs on kompilaatori disaini esimene etapp
- Lekseemid ja märgid on märkide jada, mis sisalduvad lähteprogrammis vastavalt märgi sobitusmustrile
- Leksikaalanalüsaator on rakendatud kogu programmi lähtekoodi skannimiseks
- Leksikaanalüsaator aitab tuvastada märgi sümbolitabelis
- Märgijada, mida ei ole võimalik ühtegi kehtivasse märgisse skaneerida, on leksikaalne viga
- Ühe märgi eemaldamine ülejäänud sisendist on kasulik Vea taastamise meetod
- Lexical Analyzer skannib sisendprogrammi, samal ajal kui parser teostab süntaksianalüüsi
- See hõlbustab leksikaalse analüüsi ja süntaksianalüüsi protsessi, kõrvaldades soovimatud märgid
- Leksikaalanalüsaatorit kasutavad veebibrauserid veebilehe vormindamiseks ja kuvamiseks JavasScripti, HTML-i, CSS-i sõelutud andmete abil.
- Lexical analüsaatori kasutamise suurim puudus on see, et lexeri tabelite genereerimiseks ja märkide loomiseks on vaja täiendavat käitusaega.