/* Интерпретатор Получая формальный язык, определяет представление его грамматики и интерпретатор, использующий это представление для обработки выражений языка (Применяется для часто повторяющихся операций) */ class Program { public static void Main(string[] args) { #region Пример №1 - базовое var context = new Context(); //создаём переменные int x = 5; int y = 8; int z = 2; int k = 10; //задаём переменные в контекст context.SetVariable("x", x); context.SetVariable("y", y); context.SetVariable("z", z); context.SetVariable("k", k); //(x + y - z) * k var expressionAdd = new AddExpression(new NumberExpression("x"), new NumberExpression("y")); var expressionSub = new SubstructExpression(expressionAdd, new NumberExpression("z")); var expressionPow = new PowExpression(expressionSub, new NumberExpression("k")); Console.WriteLine(expressionPow.Interpret(context)); Console.WriteLine("Please press Enter..."); Console.ReadKey(); #endregion } } /// /// Агрегатор выражений /// class Context { Dictionary variables; public Context() { variables = new Dictionary(); } public int GetVariable(string name) { if(variables.ContainsKey(name)) return variables[name]; else return -1; } public void SetVariable(string name, int value) { if(variables.ContainsKey(name)) variables[name] = value; else variables.Add(name, value); } } /// /// Поведение интерпретатора /// interface IExpression { int Interpret(Context context); } /// /// Терминальное выражение /// class NumberExpression : IExpression { string Name { get; set; } public NumberExpression(string name) { Name = name; } public int Interpret(Context context) { return context.GetVariable(Name); } } /// /// Нетерминальное выражение для сложения /// class AddExpression : IExpression { IExpression LeftExpression { get; set; } IExpression RightExpression { get; set; } public AddExpression(IExpression left, IExpression right) { LeftExpression = left; RightExpression = right; } public int Interpret(Context context) { return LeftExpression.Interpret(context) + RightExpression.Interpret(context); } } /// /// Нетерминальное выражение для умножения /// class PowExpression : IExpression { IExpression LeftExpression { get; set; } IExpression RightExpression { get; set; } public PowExpression(IExpression left, IExpression right) { LeftExpression = left; RightExpression = right; } public int Interpret(Context context) { return LeftExpression.Interpret(context) * RightExpression.Interpret(context); } } /// /// Нетерминальное выражение для вычитания /// class SubstructExpression : IExpression { IExpression LeftExpression { get; set; } IExpression RightExpression { get; set; } public SubstructExpression(IExpression left, IExpression right) { LeftExpression = left; RightExpression = right; } public int Interpret(Context context) { return LeftExpression.Interpret(context) - RightExpression.Interpret(context); } }