Zadání úlohy č. 4

Výpočty nad bezkontextovou gramatikou II

[Popis řešení] [Řešení v Javě] [Řešení v .NET]

S využitím balíku grammar z předchozího zadání implementujte v jazyce Java funkce pro výpočet množin first a follow:

   Set first(Iterator i_sym);
   Set follow(Nonterminal nt);
Parametrem funkce first je iterátor přes kolekci objektů typu Symbol, parametrem funkce follow je konkrétní neterminální symbol. Návratová hodnota obou funkcí je množinou objektů typu Symbol.

Návod: Nejprve si (např. v konstruktoru třídy GrammarOps z předchozího zadání) vypočtěte množiny first a follow pro všechny neterminální symboly a uložte v proměnné typu Map. Požadované funkce pak snadno vytvoříte na základě těchto předpočítaných hodnot. Pro reprezentaci prázdného slova si vytvořte objekt

   Terminal e = new Terminal("");
Při výpočtu nemusíte uvažovat levou rekurzi.

Specifikace vstupu:

Vstupem programu je jméno souboru obsahujícího pravidla bezkontextové gramatiky ve formátu podle dokumentace k balíku grammar.

Specifikace výstupu:

Program vypíše s pomocí vytvořených funkcí na standardní výstup hodnoty množin first pro všechny pravé strany pravidel, hodnoty množin follow pro všechny neterminální symboly a určí, zda je gramatika typu LL(1). Prázdné slovo na výstupu reprezentujte řetězcem {e}.

Příklad:

Vstup:

   {Testovaci gramatika c. 1}
   A : b C | B d;
   B : C C | b A;
   C : c C | {e};

Výstup:

   first[1] = b
   first[2] = b c d
   first[3] = c {e}
   first[4] = b
   first[5] = c
   first[6] = {e}
   follow[A] = d {e}
   follow[B] = d
   follow[C] = c d {e}
   Gramatika neni LL(1).