148 lines
4.0 KiB
C#
148 lines
4.0 KiB
C#
|
/* Интерпретатор
|
|||
|
Получая формальный язык, определяет
|
|||
|
представление его грамматики и интерпретатор,
|
|||
|
использующий это представление для обработки
|
|||
|
выражений языка (Применяется для часто повторяющихся операций)
|
|||
|
*/
|
|||
|
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
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Агрегатор выражений
|
|||
|
/// </summary>
|
|||
|
class Context
|
|||
|
{
|
|||
|
Dictionary<string, int> variables;
|
|||
|
|
|||
|
public Context()
|
|||
|
{
|
|||
|
variables = new Dictionary<string, int>();
|
|||
|
}
|
|||
|
|
|||
|
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);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Поведение интерпретатора
|
|||
|
/// </summary>
|
|||
|
interface IExpression
|
|||
|
{
|
|||
|
int Interpret(Context context);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Терминальное выражение
|
|||
|
/// </summary>
|
|||
|
class NumberExpression : IExpression
|
|||
|
{
|
|||
|
string Name { get; set; }
|
|||
|
public NumberExpression(string name)
|
|||
|
{
|
|||
|
Name = name;
|
|||
|
}
|
|||
|
|
|||
|
public int Interpret(Context context)
|
|||
|
{
|
|||
|
return context.GetVariable(Name);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Нетерминальное выражение для сложения
|
|||
|
/// </summary>
|
|||
|
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);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Нетерминальное выражение для умножения
|
|||
|
/// </summary>
|
|||
|
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);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Нетерминальное выражение для вычитания
|
|||
|
/// </summary>
|
|||
|
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);
|
|||
|
}
|
|||
|
}
|