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)