PatternsCSharpProgramming/Patterns/Interpreter/Program.cs
Dvurechensky 3a28caed27 1.0
Main
2024-10-05 09:15:54 +03:00

148 lines
4.0 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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