/* Интерпретатор
Получая формальный язык, определяет
представление его грамматики и интерпретатор,
использующий это представление для обработки
выражений языка (Применяется для часто повторяющихся операций)
*/
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);
}
}