Lexikálna analýza

Preview:

DESCRIPTION

Lexikálna analýza. LA ako súčasť prekladača. Je prvou časťou prekladača Robí analýzu – na prvej úrovni – zisťuje gramatickú správnosť Robí ďalšie služby podľa požiadavky (i možností) aby sa ďalšia činnosť prekladača zjednodušila Spolupracuje so SA. Úloha LA. - PowerPoint PPT Presentation

Citation preview

Lexikálna analýza

LA ako súčasť prekladača

Je prvou časťou prekladača Robí analýzu – na prvej úrovni – zisťuje

gramatickú správnosť Robí ďalšie služby podľa požiadavky (i

možností) aby sa ďalšia činnosť prekladača zjednodušila

Spolupracuje so SA

Úloha LA

Nájdenie a rozpoznanie lexikálnych jednotiek

Zakódovanie lexikálnych jednotiek Vynechanie nepotrebných reťazcov Výpočet syntetizovaných atribútov

lexikálnych jednotiek ako terminálnych symbolov – najčastejšie textový tvar a jeho dĺžku

Vzťak k SA

LA ako samostatná fáza – sekvenčný postup

Reťazec znakov ZP

LA Reťazec lexikálnych jednotiek ZP

SA

Vzťah k SA

Ako podprogram SA – na požiadanie vytvorí a dodá ďalšiu lexikálnu jednotku zo vstupu

SA

Požiadavka ďalšieho symbolu

LAReťazec znakov ZP

Ďalší symbol/LJ ZP

Lexikálne jednotky – zaradenie do tried Z hľadiska analýzy nie je potrebné poznať všetky

konkrétnosti lexikálnych jednotiek – výraz je napr. a+b, 3-(a+b), atď.

Lexikálne jednotky spájame do tried, ktorých počet je pre ľubovolný programovací jazyk pomerne malý:

a. Číselné a logické hodnotyb. Obmedzovače netextového charakteru, ako +, -, :=, /

ap.c. Obmedzovače textové, ako if, else, dod. identifikátory

Model lexikálneho analyzátora

Modelom LA je konečný automat

Poznámka: vieme už, že problémy môžu byť s determinizmom. Vieme však, že ku každému nedeterministickému KA existuje ekvivalentný deterministický KA.

Konštrukcia LA

LA konštruujeme z RG, ktorá špecifikuje lexikálne jednotky

Konštrukcia:

Nech G = (N, T, P, S) je RG, potom možno skonštruovať KA K = (Q, T, , q0, F) taký, že L(K) = L(G) takto:

Konštrukcia LA Cont.

Konštrukcia:Q = N {A}, pričom A NT = T

q0 = S F = {S, A} ak S e P ; inak F = { A } : pre všetky a T, B N, C N platí: ak B a P tak A (B, a) ak B aC P tak C (B, a) (A, a) = ø

Jazyk lexikálnych jednotiek

Treba vytvoriť gramatiky – regulárne pre jednotlivé triedy LJ

Zjednodušíme si zápis tým, že symboly písmeno a číslica budú terminály a budú reprezentovať všetky písmená a číslice

Prvky z jednotlivých tried obmedzíme

Gramatiky pre jednotlivé triedy

<identifikátor> písmeno | písmeno <zvyšok identifikátora>

<zvyšok identifikátora> písmeno |

písmeno <zvyšok identifikátora> |

číslica | číslica <zvyšok identifikátora>

<celé číslo> číslica | číslica <celé číslo>

<obmedzovač> + | - | x | / | ; | : <rovná sa> | / <hviezdička> |

* <lomeno>

<rovná sa> =

<hviezdička> *

<lomeno> /

Kompozícia gramatík pre triedy

Vytvoríme teraz jednu gramatiku so začiatočným symbolom <lexikálna jednotka>

<lexikálna jednotka> písmeno | písmeno <zvyšok identifikátora> | číslica | číslica <celé číslo> | + | - | x | / | ; | : <rovná sa> | / <hviezdička> | * <lomeno><zvyšok identifikátora> písmeno | písmeno <zvyšok identifikátora> | číslica | číslica <zvyšok identifikátora><celé číslo> číslica | číslica <celé číslo><rovná sa> =<hviezdička> *<lomeno> /

Konštrukcia KA – reprezentácia Stavovým diagramom

lexikálna jednotka K

písmeno | číslica | + | - | x | / | ;

zvyšok identifikátora

písmenopísmeno | číslica

celé čísločíslica číslica

rovná sa: =

hviezdička

lomeno

/ *

* /

Problémy vytvoreného automatu

Hlavným problémom je jeho nedeterminizmus Vieme, že existuje ekvivalentný deterministický

automat My ho môžeme vytvoriť „dekompozíciou“

koncového stavu tak, že vytvoríme koncové stavy pre jednotlivé triedy lexikálnych jednotiek

Budeme mať koncové stavy: zvyšok identifikátora + K, celé číslo + K,

hviezdička + K, K

Nový stavový diagram

lexikálna jednotka

K

+ | - | x | ;

zvyšok identifikátora +K

písmeno

písmeno

celé číslo+K

číslica

číslica

rovná sa: =

hviezdička+K

lomeno

/ *

* /

číslica

Vlastnosti nového automatu

Je deterministický, ale:Nemá rovnaký spôsob rozpoznania lexikálnych jednotiek.Podľa definície, reťazec patrí do jazyka, ak ho KA prijme, teda dostane

sa do koncovej konfigurácie (qf , e). Teraz však nasledujú lexikálne jednotky „za sebou“, čo treba zobrať do

úvahyInterpretácia „prázdneho vstupu“ je taká, že na vstupe je symbol, ktorý

„nepatrí“ rozpoznávanej lexikálnej jednotke – prečítali sme „iný“ symbol .

Týmto „iným“ symbolom ohodnotíme hranu, ktorou prejdeme do nového koncového stavu – koniec LJ

Rozpoznávanie tak „rozšírime“ o jeden krok. Dostaneme nasledujúci automat

Rozpoznávanie postupnosti reťazcov

lexikálna jednotka

K

+ | - | x | ;

zvyšok identifikátora +K

písmeno

písmeno

celé číslo+K

číslica

číslica

rovná sa: =

hviezdička+K

lomeno

/*

* /

číslica

Koniec LJ

inak

inak

inakinak

Začiatok lexikálnej jednotky

Na prvý pohľad je začiatok lexikálnej jednotky jasný

Ak však lexikálne jednotky nasledujú za sebou – ako je to v prípade programu – situácia nie je taká jasná

Problémom môže byť už zmienený symbol „inak“

Treba zabezpečiť, aby sme ho „nestratili”

Explicitné a implicitné LJ

Lexikálne jednotky možno rozdeliť na - explicitne definované - implicitne definované Explicitne definované LJ rozpoznáme po prečítaní jej

posledného symbolu (nepotrebujeme teda symbol „inak“) – napr. +, -, :=, ...

Implicitne definované LJ rozpoznáme až po prečítaní symbolu , ktorý jej nepatrí (potrebujeme teda symbol „inak“) – napr. identifikátor, celé číslo, ...

Zjednotenie je cez hranu „inak“ pre všetky LJ

Rozpoznanie kľúčových slov jazyka Kľúčové slová programovacieho jazyka sú

„identifikátory so špeciálnym významom“. LA ich môže rozpoznať rôznym spôsobom

- pomocou tabuľky symbolov, kde ich

možno uchovávať

- ich predznačením špeciálnym symbolom-

zvyčajne apostrof

Model LA – preklad

Ďalšou úlohou LA po rozpoznaní LJ je ich zakódovanie

Zakódovanie LJ je ich zápis v inom jazyku – teda preklad

Do tejto kategórie prác patrí aj uchovanie informácií o LJ, ako ich textový tvar a dĺžka – pomáha nám pri uchovávaní a následnom vyhľadávaní LJ

Triedy LJ

LJ možno rozdeliť do neveľkého počtu tried Každá trieda reprezentuje LJ, ktoré majú z

hľadiska analýzy rovnaký význam Nami používané LJ - čiastočne rozšírené

možno zakódovať takto

Zakódovanie LJ

Lexikálna jednotka kód

identifikátor 1

celé číslo 2

/* 3

*/ 4

+ 5

- 6

x 7

/ 8

:= 9

; 10

else 11

Prekladový automat na zakódovanie LJ Prekladový automat na zakódovanie LJ

budeme reprezentovať stavovým diagramom

Ohodnotenie hrán bude mať tvar i/o , kde „i“ bude vstupný symbol, „o“ bude výstupný symbol

Kľúčové slová budú „predznačené“ apostrofom

Stavový diagram KPA

lexikálna jednotka

K

+/5 | -/6 | x/7 | ;/10

zvyšok identifikátora +K

písmeno / e

e / písmeno

celé číslo+K

číslica /e

e/číslica

rovná sa: / e = / 9

hviezdička+K

lomeno

/ | e* / 3

* / e / | 4

e / číslica

Koniec LJ

inak / 1

inak / 2

inak/8inak

kľúčové slovo‘/e 1e/e

2l/e

3s/e e/11

Textový tvar a dĺžka LJ

Použijeme prekladovú gramatiku pre kódovanie

Zaujíma nás iba LJ identifikátor Výstupný symbol označíme vs

Prekladová gramatika pre text identifikátoraG = ({LJ, ID}, {p, č, inak} {vs}, P, LJ )P: LJ p ID ID p ID ID č ID ID inak vsPG rozšírime o spracovanie textového tvaru

identifikátora a jeho dĺžkuAtribúty: d – dĺžka identifikátora tti – textový tvar identifikátora

APG

Syntax Sémantika LJ p ID ID.d := 1 ID.tti := p.kód

ID p ID ID1.d := ID0.d + 1

ID1.tti := ID0.tti || p.kód

ID č ID ID1.d := ID0.d + 1

ID1.tti := ID0.tti || č.kód ID inak vs vs.d := ID.d vs.tti := ID.tti

Vynechanie nepotrebných symbolov Ide o komentáre Reťazce pri zvýšenie čitateľnosti programu

OK