Wzorzec projektowy interpreter

Idea

  • Jedna podklasa dla każdej produkcji i dla każdego wyrażenia nieterminalnego
  • Klasy te wspołdzielą jeden obiekt kontekstu, z ktorego pobierają dane wejściowe, i w ktorym zapisują wartości zmiennych
  • Interpreter tworzy efektywny mechanizm przetwarzania danych wyjściowych

Struktura

Uczestnicy

  • Client - tworzy abstrakcyjne drzewo składni przedstawiające zdanie w języku i uruchamia operację interpretacji.
  • Context - przechowuje informacje globalne (np. wartości zmiennych).
  • AbstractExpression - definiuje operację (lub operacje) "interpretowania", czyli pojedynczy węzeł w drzewie składni abstrakcyjnej.
  • TerminalExpression - implementuje operację dla symbolu terminalnego (ktory występuje w przetwarzanych danych wewnętrznych).
  • NonterminalExpression - implementuje operację (regułę gramatyczną) dla symbolu nieterminalnego.

Budowa (podstawowe elementy):

  • Kontekst: Informacja globalna (np. wartości zmiennych).
  • Wyrażenie abstrakcyjne: Definiuje operację (lub operacje) "interpretowania", czyli pojedynczy węzeł w drzewie składni abstrakcyjnej.
  • Wyrażenie terminalne: Implementuje operację dla symbolu terminalnego (ktory występuje w przetwarzanych danych wewnętrznych).
  • Wyrażenie nieterminalne: Implementuje operację (regułę gramatyczną) dla symbolu nieterminalnego.

Zalety

Modyfikowanie gotowej gramatyki jest stosunkowo proste - wystarczy utworzyć nowe klasy, ktore będą reprezentowały nowe produkcje. Przedstawianie każdej reguły gramatyki w klasie sprawia, że jest prosty w implementacji. W przypadku "oskryptowania" wielu elementow działania systemu unika się długiego procesu rekompilacji czy restartu systemu.

Wady

Jest niepraktyczny jeśli gramatyka składa się z więcej niż kilku produkcji (wzrasta wtedy liczebność klas)