Leksinen analyysi (analysaattori) kääntäjäsuunnittelussa esimerkin kanssa

Mikä on leksikaalinen analyysi?

Leksinen analyysi on kääntäjän suunnittelun ensimmäinen vaihe. Lexer ottaa muokatun lähdekoodin, joka on kirjoitettu lauseiden muodossa. Toisin sanoen se auttaa sinua muuttamaan merkkisarjan merkkijonoksi. Leksikaalinen analysaattori hajottaa tämän syntaksin merkkien sarjaksi. Se poistaa lähdekoodiin kirjoitetut ylimääräiset välilyönnit tai kommentit.

Ohjelmia, jotka suorittavat leksisen analyysin kääntäjien suunnittelussa, kutsutaan leksikaalisiksi analysaattoreiksi tai leksereiksi. Lexer sisältää tokenisaattorin tai skannerin. Jos leksikaalinen analysaattori havaitsee, että merkki on virheellinen, se luo virheen. Lexical Analyzerin rooli kääntäjän suunnittelussa on lukea merkkivirtoja lähdekoodista, tarkistaa lailliset tunnukset ja välittää tiedot syntaksianalysaattorille, kun se vaatii.

esimerkki

How Pleasant Is The Weather?

Katso tämä Lexical Analysis -esimerkki; Tässä voimme helposti tunnistaa, että on viisi sanaa How Pleasant, The, Weather, Is. Tämä on meille hyvin luonnollista, koska voimme tunnistaa erottimet, välilyönnit ja välimerkit.

 HowPl easantIs Th ewe ather?

Tarkista nyt tämä esimerkki, voimme myös lukea tämän. Se kuitenkin kestää jonkin aikaa, koska erottimet asetetaan parittomiin paikkoihin. Se ei ole jotain, joka tulee sinulle välittömästi.

Perusterminologiat

Mikä on lekseema?

Lekseema on merkkijono, joka sisältyy lähdeohjelmaan tunnuksen täsmäytysmallin mukaisesti. Se ei ole muuta kuin merkin esiintymä.

Mikä on token?

Kääntäjän suunnittelussa merkit ovat merkkijonoja, jotka edustavat lähdeohjelman tietoyksikköä.

Mikä on kuvio?

Malli on kuvaus, jota merkki käyttää. Kun kyseessä on avainsana, jota käytetään tunnuksena, kuvio on merkkijono.

Leksinen analysaattori Architecture: Kuinka rahakkeet tunnistetaan

Leksikaalisen analyysin päätehtävä on lukea koodiin syötetyt merkit ja tuottaa tokeneita.

Leksinen analysaattori skannaa koko ohjelman lähdekoodin. Se tunnistaa jokaisen tunnuksen yksitellen. Skannerit toteutetaan yleensä tuottamaan tunnuksia vain jäsentäjän pyynnöstä. Näin toimii tokenien tunnistaminen kääntäjien suunnittelussa -

Leksinen analysaattori Archirakenne
Leksinen analysaattori Archirakenne
  1. "Get next token" on komento, joka lähetetään jäsentimestä leksikaaliseen analysaattoriin.
  2. Vastaanotettuaan tämän komennon leksikaalinen analysaattori skannaa syötettä, kunnes se löytää seuraavan merkin.
  3. Se palauttaa tunnuksen jäsentimelle.

Lexical Analyzer ohittaa välilyönnit ja kommentit luodessaan näitä tunnuksia. Jos virhe on olemassa, Lexical-analysaattori korreloi virheen lähdetiedoston ja rivinumeron kanssa.

Leksisen analysaattorin roolit

Leksinen analysaattori suorittaa seuraavat tehtävät:

  • Auttaa tunnistamaan tunnuksen symbolitaulukkoon
  • Poistaa välilyönnit ja kommentit lähdeohjelmasta
  • Korreloi virheilmoitukset lähdeohjelman kanssa
  • Auttaa sinua laajentamaan makroja, jos ne löytyvät lähdeohjelmasta
  • Lue syötetyt merkit lähdeohjelmasta

Esimerkki Lexical Analysis, Tokens, Non-Tokens

Harkitse seuraavaa koodia, joka syötetään Lexical Analyzeriin

#include <stdio.h>
    int maximum(int x, int y) {
        // This will compare 2 numbers
        if (x > y)
            return x;
        else {
            return y;
        }
    }

Esimerkkejä luoduista tokeneista

Lexema Merkki
int avainsana
maksimi tunnistaa
( OperaTor
int avainsana
x tunnistaa
, OperaTor
int avainsana
Y tunnistaa
) OperaTor
{ OperaTor
If avainsana

Esimerkkejä nontokeneista

Tyyppi Esimerkit
Kommentti // Tämä vertaa kahta numeroa
Esiprosessorin direktiivi #sisältää
Esiprosessorin direktiivi #define NUMEROT 8,9
Makro NUMEROJA
välilyönti /n/b/t

Leksiset virheet

Merkkijono, jota ei ole mahdollista skannata mihinkään kelvolliseen merkkiin, on sanavirhe. Tärkeitä faktoja leksikaalisesta virheestä:

  • Leksiset virheet eivät ole kovin yleisiä, mutta ne pitäisi hallita skannerilla
  • Tunnisteiden, operaattoreiden ja avainsanojen kirjoitusvirheitä pidetään leksikaalisina virheinä
  • Yleensä sanavirhe johtuu jonkin laittoman merkin esiintymisestä, useimmiten tunnuksen alussa.

Virheiden palautus Lexical Analyzerissa

Tässä on muutamia yleisimpiä virheiden palautustekniikoita:

  • Poistaa yhden merkin jäljellä olevasta syötteestä
  • Paniikkitilassa peräkkäiset merkit ohitetaan aina, kunnes saavutamme hyvin muodostetun merkin
  • Lisäämällä puuttuva merkki jäljellä olevaan syötteeseen
  • Korvaa hahmo toisella hahmolla
  • Transponoi kaksi sarjamerkkiä

Lexical Analyzer vs. Parser

Leksinen analysaattori jäsennin
Skannaussyöttöohjelma Suorita syntaksianalyysi
Tunnista Tokenit Luo koodista abstrakti esitys
Lisää tunnukset symbolitaulukkoon Päivitä symbolitaulukon merkinnät
Se tuottaa leksikaalisia virheitä Se luo lähdekoodin jäsennyspuun

Miksi erottaa Lexical ja Parser?

  • Suunnittelun yksinkertaisuus: Se helpottaa leksikaalista analyysiä ja syntaksianalyysiä poistamalla ei-toivotut tunnukset
  • Kääntäjän tehokkuuden parantaminen: Auttaa parantamaan kääntäjän tehokkuutta
  • Erikoistuminen: erikoistekniikoita voidaan soveltaa parantamaan leksikaalista analyysiprosessia
  • Siirrettävyys: vain skannerin tarvitsee kommunikoida ulkomaailman kanssa
  • Parempi siirrettävyys: syöttölaitekohtaiset erityispiirteet rajoittuvat lexeriin

Leksisen analyysin edut

  • Leksisen analysaattorin menetelmää käyttävät ohjelmat, kuten kääntäjät, jotka voivat käyttää ohjelmoijan koodin jäsennettyä dataa luodakseen käännetyn binaarisen suoritettavan koodin.
  • Web-selaimet käyttävät sitä web-sivun muotoiluun ja näyttämiseen jäsennetyn tiedon avulla JavaScript, HTML, CSS
  • Erillinen leksikaalinen analysaattori auttaa sinua rakentamaan tehtävään erikoistuneen ja mahdollisesti tehokkaamman prosessorin

Leksisen analyysin haittapuoli

  • Sinun on vietettävä paljon aikaa lähdeohjelman lukemiseen ja sen osiointiin tokenien muodossa
  • Joitakin säännöllisiä lausekkeita on melko vaikea ymmärtää verrattuna PEG- tai EBNF-sääntöihin
  • Lexerin ja sen tunnuskuvausten kehittäminen ja virheenkorjaus vaatii enemmän työtä
  • Lexer-taulukoiden luomiseen ja tokenien rakentamiseen tarvitaan ylimääräistä ajonaikaista lisäkustannuksia

Yhteenveto

  • Leksinen analyysi on kääntäjän suunnittelun ensimmäinen vaihe
  • Lekseemit ja Tokenit ovat merkkijonoja, jotka sisältyvät lähdeohjelmaan tunnuksen täsmäytysmallin mukaisesti
  • Leksinen analysaattori on toteutettu skannaamaan ohjelman koko lähdekoodi
  • Leksinen analysaattori auttaa tunnistamaan tunnuksen symbolitaulukkoon
  • Merkkijono, jota ei ole mahdollista skannata mihinkään kelvolliseen merkkiin, on sanavirhe
  • Poistaa yhden merkin jäljellä olevasta syötteestä on hyödyllinen Virheiden palautusmenetelmä
  • Lexical Analyzer skannaa syöttöohjelman samalla kun jäsentäjä suorittaa syntaksianalyysin
  • Se helpottaa leksikaalisen analyysin ja syntaksianalyysin prosessia poistamalla ei-toivotut merkit
  • Selaimet käyttävät Lexical-analysaattoria web-sivun muotoilemiseen ja näyttämiseen JavaScriptin, HTML:n, CSS:n jäsennetyn tiedon avulla.
  • Lexical-analysaattorin käytön suurin haittapuoli on, että se tarvitsee ylimääräistä ajonaikaista lisäkustannuksia lexer-taulukoiden luomiseen ja tokenien rakentamiseen.