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 -

Leksikaalne analüsaator Architektuur
Leksikaalne analüsaator Architektuur
  1. "Get next token" on käsk, mis saadetakse parserist leksikaalanalüsaatorisse.
  2. Selle käsu saamisel skannib leksikaalanalüsaator sisendit, kuni leiab järgmise märgi.
  3. 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.