Obsah

22 - Struktura překladače a charakteristika fází překladu

Export page to Open Document format

Lexikální analyzátor

Regulární jazyk

Nechť L je jazyk. L je regulární jazyk (RJ), pokud existuje regulární výraz r, který tento jazyk značí.

Regulární výraz

Nechť Σ je abeceda. Regulární výrazy nad abecedou Σ a jazyky, které značí, jsou definovány následovně:
  • ∅ je RV značící prázdnou množinu (prázdný jazyk)
  • ε je RV značící jazyk {ε}
  • a, kde a ∈ Σ, je RV značící jazyk {a}
  • Nechť r a s jsou regulární výrazy značící po řadě jazyky Lr a Ls, potom:
    • (r.s) je RV značící jazyk L = Lr Ls
    • (r + s) je RV značící jazyk L = Lr ∪ Ls
    • (r*) je RV značící jazyk L = Lr*

Konečný automat

Konečný automat (KA) je pětice: M = (Q, Σ, R, s, F), kde
  • Q je konečná množina stavů
  • Σ je vstupní abeceda
  • R je konečná množina pravidel tvaru: pa → q, kde p, q ∈ Q, a ∈ Σ ∪ {ε}
  • s ∈ Q je počáteční stav
  • F ⊆ Q je množina koncových stavů

Praxe

Syntaktický analyzátor

Bezkontextový jazyk

Nechť L je jazyk. L je bezkontextový jazyk (BKJ), pokud existuje bezkontextová gramatika, která generuje tento jazyk L.

Bezkontextová gramatika

Bezkontextová gramatika (BKG) je čtveřice G = (N, T, P, S), kde:
  • N je abeceda neterminálů
  • T je abeceda terminálů, přičemž N ∩ T = ∅
  • P je konečná množina pravidel tvaru A → x, kde A ∈ N, x ∈ (N ∪ T)*
  • S ∈ N je počáteční neterminál

Zásobníkový automat

Zásobníkový automat (ZA) je sedmice: M = (Q, Σ, Γ, R, s, S, F), kde
  • Q je konečná množina stavů
  • Σ je vstupní abeceda
  • Γ je zásobníková abeceda
  • R je konečná množina pravidel tvaru Apa → wq, kde A ∈ Γ, p, q ∈ Q, a ∈ Σ ∪ {ε}, w ∈ Γ*
  • s ∈ Q je počáteční stav
  • S ∈ Γ je počáteční symbol na zásobníku
  • F ⊆ Q je množina koncových stavů

koukněte sem na příklad na vytváření LL-tabulky - dobré na pochopení množin Empty, First a Follow

Sémantický analyzátor

Generátor vnitřního kódu

Optimalizátor

// --- zabalení konstanty --- //
a = 1;
b = 2;
c = a + b; //c = 3;
 
// --- šíření konstanty --- //
a = 2;
b = a;
c = b; // c = 2;
 
// --- kopírování proměnné --- //
// stejné jako šíření konstanty, akorát šířím proměnnou
 
// --- výrazové invarianty v cyklu --- //
for(i = 0; i < 100; i++)
{
  sum = p*q/r + i // p*q/r (výrazový invariant) se nemění s krokem, ale generovali bychom to 100x
}
 
// --- eliminace mrtvého kódu --- //
a = a; // toto je také mrtvý kód => sice se provede, ale nemá žádný význam
 
// --- rozbalení cyklu --- //
// zrušíme podmínku cyklu, ale nagenerujeme např 10x za sebou příkaz foru - třeba určit, kolikrát provádíme cyklus
// urychlí to cyklus, ale zabere víc paměti
; ...
store r1, c
load r1, c  ; zbytečně loadujeme do c => slepé generování toto nezoptimalizuje => nekoukáme na kontext
mul r1, d
; ...

Generátor cílového kódu


při vypracovávání jsem čerpal ze slajdů předmětu IFJ

Potvrzení

24
Celé jménoOK!!!
Jirka Hynek2011-02-05 12:47:14 
vagy2011-04-12 21:07:13 
roman jasho2011-05-03 15:31:30 
 3