Интерпретатор, Модели в C# и
Моделът на интерпретатора дефинира граматично представяне за даден език и интерпретатор на изречения за този език. Обикновено този модел на проектиране се използва за често повтарящи се операции.
Въпреки че моделът изисква разбиране на теорията на формалните езици и граматики, всъщност не е толкова трудно да се разбере.
Използвайки UML диаграми, моделът може да бъде описан по следния начин:
В C# официалната структура на една програма може да изглежда така:
AbstractExpression : дефинира интерфейс на израз, декларира метод Interpret().
TerminalExpression : терминален израз, прилага метода Interpret() за терминалните символи на граматиката. Всеки граматичен символ има свой собствен обект TerminalExpression.
NonterminalExpression : Нетерминален израз, който представлява граматично правило. За всяко отделно граматично правило се създава отделен обект NoTerminalExpression.
Контекст: съдържа информация, обща за преводача. Може да се използва от терминални и нетерминални изразни обекти за запазване на състоянието на операциите и след това достъп до запазеното състояние
Клиент: конструира изреченията на езика с дадената граматика като абстрактно синтактично дърво, чиито възли са обектите TerminalExpression и NoTerminalExpression
Методите за интерпретиране в нетерминални изрази ви позволяват да прилагате граматически правила. В същото време можем лесно да добавим нови граматични правила, като дефинираме нови обекти NoTerminalExpression с нашата собствена реализация на метода Interpret. Този модел обаче е подходящ само за случаи, когато граматическите правила са относително прости. В по-сложни случаи трябва да изберете други начини за проектиране на вашето приложение.
Например, трябва да разработим програми за изчисляване на най-простите операции на събиране и изваждане с помощта на променливи: x + y - z. За да направите това, можете да дефинирате следната граматика:
Изпълнението на тази граматика в C# би било следната програма:
В този случай всички действия на интерпретатора могат да бъдат описани със следното дърво:
Класът Context дефинира методи за задаване на стойностите на променливите и за получаване на техните стойности.
Интерфейсът IExpression се използва като интерпретатор. Неговата реализация - класът NumberExpression - е проектиран да изразява отделни променливи - това са терминални обекти.
Други реализации на интерфейса, класовете AddExpression и SubtractExpression, представляват нетерминални обекти. Те изпълняват най-простите операции на събиране и изваждане и могат рекурсивно да извикват методите за интерпретиране на използваните терминални и нетерминални обекти.
Клиентът, който е класът Program, инициализира контекста и се създава обект SubtractExpression, за да оцени израза x + y - z, който приема други обекти IExpression като параметри.