Lexical Analysis in Compiler Design

tässä artikkelissa käsitellään kääntäjän suunnittelun ensimmäistä vaihetta, jossa korkean tason tuloohjelma muunnetaan polettisarjaksi. Tätä vaihetta kutsutaan kääntäjän suunnittelussa Leksikaaliseksi analyysiksi.

sisällysluettelo:

  1. leksikaalisen analyysin määritelmät
  2. leksikaalisen analyysin esimerkki
  3. leksikaalisen analysaattorin Arkkitehtuuri
  4. Säännölliset lausekkeet
  5. finiittinen Automata
  6. säännöllisten lausekkeiden ja finiittisen Automatan välinen suhde
  7. pisin täsmäyssääntö
  8. leksikaaliset virheet
  9. error recovery schemes
  10. need for lexical Analyzers
  11. need for lexical Analyzers

lexical analysis on prosessi, jossa muunnetaan sarja merkkejä Lähdeohjelmasta, joka otetaan syötteenä jonoon Tokens.

a lex on ohjelma, joka luo leksikaalisia analysaattoreita.

lexical analyzer/lexer/scanner on ohjelma, joka suorittaa lexical analysis.

leksikaalisen analysaattorin tehtäviin kuuluu;

  • Lähdeohjelman syöttömerkkien lukeminen.
  • virheilmoitusten korrelaatio lähdeohjelman kanssa.
  • raidoittavat valkoiset välilyönnit ja lähdeohjelman Kommentit.
  • Laajennusmakrot, jos ne löytyvät source-ohjelmasta.
  • merkitään tunnistetut poletit symbolitaulukkoon.

Lexeme on Tokenin ilmentymä, toisin sanoen lähdeohjelmaan sisältyvä merkkien sarja Tokenin vastaavuuskaavan mukaan.

esimerkki lausekkeesta;
c = A + b * 5

lekseemit ja poletit ovat;

Lekseemit poletit
c tunniste
= tehtävämerkki
a tunniste
+ +(lisäyssymboli)
b tunniste
* *(kertolaskusymboli)
5 5(numero)

leksikaalisen analysaattorin tuottaman polettisarjan avulla jäsennin voi analysoida syntaksin ohjelmointikieli.

token on lekseemin antama kelvollinen merkkisarja, sitä käsitellään ohjelmointikielen kieliopissa yksikkönä.
ohjelmointikielessä tämä voi sisältää;

  • avainsanat
  • operaattorit
  • välimerkit
  • vakiot
  • tunnisteet
  • numerot

kuvio on sääntö, jota vastaa merkin käyttämä sarja(lexemes). Se voidaan määritellä säännöllisillä lausekkeilla tai kielioppisäännöillä.

esimerkki Leksikaalisesta analyysistä

koodi

#include<iostream>// exampleint main(){ int a, b; a = 7; return 0;}

Tokens

Lekseemit poletit
int hakusana
main avainsana
( operaattori
) operaattori
{ operaattori
int hakusana
a tunniste
, operaattori
tunniste
; operaattori
a tunniste
= tehtävämerkki
10 10(numero)
; operaattori
paluu avainsana
0 0(numero)
; toimija
} operaattori

Ei Sanakkeita

Tyyppi poletit
esikäsittelijädirektiivi #include<iostream>
kommentti / / esimerkki

leksikaalisessa analyysissa on kaksi vaihetta.

  1. skannaus-tämä edellyttää syöttömerkkien lukemista ja valkoisten välilyöntien ja kommenttien poistamista.
  2. Tokenointi – tämä on tokenien tuottamista tuotoksena.

leksikaalisen analysaattorin Arkkitehtuuri

leksikaalisen analysaattorin päätehtävä on skannata koko lähdeohjelma ja tunnistaa tokeneita yksi kerrallaan.
Skannerit on toteutettu tuottamaan poletteja jäsentäjän pyynnöstä.

lexical

vaiheet:

  1. ”get next token” lähetetään jäsentimestä leksikaaliseen analysaattoriin.
  2. leksikaalinen analysaattori skannaa tulon, kunnes ”seuraava token” on paikannettu.
  3. merkki palautetaan jäsentäjälle.

Säännölliset lausekkeet

käytämme säännöllisiä lausekkeita ilmaisemaan äärellisiä kieliä määrittelemällä kuvioita äärelliselle symbolijoukolle.

säännöllisten lausekkeiden määrittelemää kielioppia kutsutaan säännölliseksi kielioppiksi ja säännöllisen kielioopin määrittelemää kieltä säännölliseksi kieleksi.
on olemassa säännöllisten lausekkeiden noudattamia algebrallisia sääntöjä, joita käytetään manipuloimaan säännöllisiä lausekkeita vastaaviin muotoihin.

operaatiot.

kahden kielen liitto A ja B kirjoitetaan kuten
a U b = {s | s On A: ssa tai s on B: ssä
kahden kielen Yhtymä A ja B kirjoitetaan kuten
AB = {SS | s On A: ssa ja s on B: ssä
kleen sulkeuma a kirjoitetaan muodossa
a* = joka on nolla tai useampia esiintymiä kielen A: ssa.

merkinnät.

jos X ja y ovat säännöllisiä lausekkeita, jotka ilmaisevat kieliä A(x) ja B(y), niin
(x) on säännöllinen lauseke, joka ilmaisee A(x).
unioni (x)|(y) on säännöllinen lauseke, joka ilmaisee A(x) B(y).
Concatenation (x) (y)on säännöllinen lauseke, joka dentoi A(x) B (y).
Kleenin sulkeminen (x)* on säännöllinen lauseke, joka ilmaisee (A (x))*

ensisijaisuutta ja assosiatiivisuutta.

* ” concatenation .”ja / (pipe) ovat assosiatiivisia.
Kleen sulkeminen * on korkein sijoitus.
Concatenation (.) seuraa arvojärjestyksessä.
(putki) | on alin ennakkosuosikki.

, jotka edustavat kielen kelvollisia tokeneita säännöllisissä lausekkeissa.

X on säännöllinen lauseke, joten;

  • x* tarkoittaa nollaa tai useampaa X: n esiintymistä.
  • x+ tarkoittaa yhtä tai useampaa X: n esiintymistä, ie{x, xx, xxx}
  • x? edustaa korkeintaan yhtä muotoa X ie {x}
  • edustaen kaikkia englannin kielen pienaakkosia.
  • edustavat kaikkia englanninkielisiä suuraakkosia.
  • edustavat kaikkia luonnollisia lukuja.

, joka edustaa säännöllisiä lausekkeita käyttävien symbolien esiintymistä
Letter = tai
Digit = tai|0|1|2|3|4|5|6|7|8|9
Sign =

edustaa säännöllisiä lausekkeita käyttäviä kielimerkkejä.
desimaali = (merkki)?(numero) +
Identifier = (kirjain) (kirjain | numero)*

äärellinen Automata

tämä on yhdistelmä viidestä tuplasta (Q, Σ, q0, qf, δ), jotka keskittyvät olotiloihin ja siirtymiin syöttösymbolien avulla.
se tunnistaa kuviot ottamalla symbolijonon syötteeksi ja muuttaa tilaansa sen mukaisesti.
äärellisen automaatin matemaattinen malli koostuu;

  • äärellinen tilajoukko(Q)
  • äärellinen tulosymbolien joukko(Σ)
  • yksi aloitustila(q0)
  • lopputilojen joukko(QF)
  • Siirtymäfunktio (δ)

äärellistä automataa käytetään leksikaalisessa analyysissä tuottamaan poletteja tunnisteiden, avainsanojen ja vakioiden muodossa syöteohjelmasta.

äärellinen automata syöttää säännöllisen lausekkeen merkkijonoa ja tila vaihtuu jokaisen kirjaimiston kohdalla.

jos syöte käsitellään onnistuneesti, Automaatti saavuttaa lopullisen tilan ja hyväksytään muuten se hylätään.

äärellisen Automatan konstruktio

olkoon L(r) jonkin äärellisen Automatan F(A) säännöllinen kieli.

siksi;

  • valtiot: ympyrät edustavat FA: n osavaltioita ja niiden nimet kirjoitetaan ympyröiden sisään.
  • Aloitustila: tämä on tila, jossa Automaatti alkaa. Siinä on nuoli, joka osoittaa sitä kohti.
  • välitilat: näissä on kaksi nuolta, joista toinen osoittaa siihen ja toinen välitiloista.
  • Lopullinen Tila: Automatan oletetaan olevan lopullisessa tilassa, kun syöttömerkkijono on jäsennetty onnistuneesti ja esitetty kaksoisympyröillä, muuten tulo hylätään. Siinä voi olla pariton määrä sitä kohti osoittavia nuolia ja parillinen siitä osoittava luku, eli
    parittomia nuolia = parillisia nuolia + 1.
  • Siirtymä: kun syötteestä löytyy haluttu symboli, tapahtuu siirtyminen tilasta toiseen. Automata joko siirtyy seuraavaan tilaan tai jatkuu.
    suunnattu nuoli näyttää liikkeen tilasta toiseen nuolen osoittaessa kohti kohdetilaa.
    jos automata pysyy samassa tilassa, piirretään tilasta itseensä osoittava nuoli.

esimerkki; Oletetaan, että FA hyväksyy 3-numeroisen binääriarvon, joka päättyy 1: een.
silloin FA = {Q (q0, qf), Σ(0,1), q0, qf, δ}

finite_automata

säännöllisten lausekkeiden ja äärellisen Automatan suhde

säännöllisen lausekkeen ja äärellisen Automatan suhde on seuraava;
alla oleva luku osoittaa, että se on helppo muuntaa;

  • Säännölliset lausekkeet Ei-deterministiseen äärelliseen automataan (NFA) ∈ – siirroilla.
  • ei-deterministinen äärellinen automata, jossa ∈ siirtyy ilman ∈ liikkuu
  • ei-deterministinen äärellinen automata ilman ∈ siirtyy deterministiseen äärelliseen Automataan(DFA).
  • deterministinen äärellinen Automatia säännölliseen lausekkeeseen.

refa

Lex hyväksyy säännölliset lausekkeet syötteenä ja palauttaa ohjelman, joka simuloi äärellistä automaattia tunnistamaan säännölliset lausekkeet.
tämän vuoksi lex yhdistää merkkijonokuvion generoinnin (säännölliset lausekkeet, jotka määrittelevät lexille kiinnostavat merkkijonot) ja merkkijonokuvion tunnistamisen (äärellinen automaatti, joka tunnistaa kiinnostavat merkkijonot).

pisin Ottelusääntö

sen mukaan skannattu lekseemi tulee määrittää kaikkien käytettävissä olevien polettien pisimmän vastaavuuden perusteella.
Tätä käytetään epäselvyyksien selvittämiseen päätettäessä seuraavaa tokenia tulovirrassa.
lähdekoodia analysoitaessa sanastoanalysaattori skannaa koodin kirjain kirjaimelta ja kun operaattori, erikoissymboli tai välilyönti havaitaan, se päättää, onko sana kokonainen.

esimerkki:

int intvalue;

analysaattori ei yllä olevaa skannatessaan pysty määrittämään, onko ”int” avainsana int vai tunnisteen intvalue etuliite.
sovelletaan sääntöä, jossa avainsanalle annetaan etusija käyttäjän syötteeseen nähden, mikä tarkoittaa yllä olevassa esimerkissä, että analysaattori tuottaa virheen.

Sanastovirheet

sanastollinen virhe syntyy, kun merkkisarjaa ei voida skannata kelvolliseksi tokeniksi.
nämä virheet voivat johtua tunnisteiden, avainsanojen tai operaattoreiden kirjoitusvirheistä.
yleensä, vaikkakin hyvin harvinaisia sanastovirheitä aiheuttavat Tokenin laittomat merkit.

virheitä voi olla;

  • kirjoitusvirhe.
  • kaksi merkkiä.
  • laittomat merkit.
  • tunnisteen tai numeerisen vakion pituus ylittyy.
  • merkin korvaaminen virheellisellä merkillä
  • siinä olevan merkin poistaminen.

Virheenpalautus merkitsee;

  • poistetaan yksi merkki jäljelle jääneestä syötteestä
  • siirtämällä kaksi vierekkäistä merkkiä
  • poistamalla yksi merkki jäljellä olevasta syötteestä
  • lisäämällä puuttuva merkki jäljellä olevaan syötteeseen
  • korvaamalla merkki toisella merkillä.
  • sivuutetaan peräkkäiset merkit, kunnes muodostetaan laillinen poletti(panic mode recovery).

virheiden palautusjärjestelmät

paniikkitilan palautus.
tässä virheenkorjausohjelmassa jäljettömät kuviot poistetaan jäljellä olevasta tulosta, kunnes leksikaalinen analysaattori löytää hyvin muodostuneen Tokenin jäljellä olevan tulon alusta.
täytäntöönpanon helpottaminen on tämän lähestymistavan etu.
siinä on rajoitus, että suuri määrä syötettä ohitetaan tarkistamatta ylimääräisiä virheitä.

Paikallinen Korjaus.
kun pisteessä havaitaan virhe lisäys/poisto ja / tai korvaava toimenpide suoritetaan, kunnes teksti on muodostettu hyvin.
analysaattori käynnistetään uudelleen tuloksena olevan uuden tekstin ollessa syötettynä.

Kokonaiskorjaus.
se on parannettu paniikkitilan palautus, jota suositaan, kun paikallinen korjaus epäonnistuu.
sillä on korkeat aika-ja tilavaatimukset, joten sitä ei toteuteta käytännössä.

leksikaalisten analysaattoreiden tarve

  1. parempi kääntäjän hyötysuhde – erikoistuneet puskurointitekniikat merkkien lukemiseen nopeuttavat kääntäjän prosessia.
  2. kääntäjän suunnittelun yksinkertaisuus – valkoisten välilyöntien ja kommenttien poistaminen mahdollistaa tehokkaat syntaktiset konstruktiot syntaksianalysaattorille.
  3. kääntäjän siirrettävyys – vain skanneri kommunikoi ulkoisen maailman kanssa.
  4. erikoistuneita tekniikoita voidaan käyttää leksikaalisen analyysiprosessin parantamiseen

ongelmat, joissa leksikaalinen analyysi

  1. Lookahead
    kun otetaan huomioon syöttömerkkijono, merkit luetaan vasemmalta oikealle yksi kerrallaan.
    päättääksemme, onko token valmis vai ei, meidän on katsottava seuraavaa merkkiä.
    esimerkki: on ” = ”tehtäväoperaattori tai” = ” – operaattorin ensimmäinen merkki.
    Lookahead ohittaa merkkejä syötteessä, kunnes hyvin muodostettu token löytyy, tämä osoittaa, että look ahead ei voi napata merkittäviä virheitä lukuun ottamatta yksinkertaisia virheitä, kuten laittomia symboleita.
  2. epäselvyydet
    Lexin kanssa kirjoitetut ohjelmat hyväksyvät monitulkintaiset määritykset, joten valitaan pisin täsmäys ja kun useat lausekkeet täsmäävät syötteeseen, valitaan joko pisin täsmäys tai priorisoidaan ensimmäinen sääntö vastaavuussääntöjen joukossa.
  3. varatut avainsanat
    eräissä kielissä on varattuja sanoja, joita ei ole varattu muissa ohjelmointikielissä, esim.Elif on varattu sana Pythonissa mutta ei C: ssä.
  4. Kontekstiriippuvuus
    esimerkki:
    kun otetaan huomioon lauseke DO 10 l = 10.86, DO10l on tunniste eikä DO ole avainsana.
    ja kun otetaan huomioon lausuma DO 10 l = 10, 86, DO on avainsana
    tällaiset lausumat vaatisivat merkittävää harkintaa ratkaisun löytämiseksi.

kääntäjien käyttämät sovellukset

  1. luovat yhteensopivat binääriset suoritustiedostot jäsennetystä koodista.
  2. Web-selaimet käyttävät HTML -, CSS-ja java-skriptiä jäsentävän web-sivun muotoiluun ja näyttämiseen.

tämän opengenuksen artikkelin myötä sinulla täytyy olla vahva käsitys Sanastoanalyysistä kääntäjän suunnittelussa.

Vastaa

Sähköpostiosoitettasi ei julkaista.