Интерпретатор, Модели в 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 като параметри.