[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.
Vstupem programu je jméno souboru obsahujícího pravidla bezkontextové gramatiky ve formátu podle dokumentace k balíku grammar.
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}.
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).