-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
156 lines (139 loc) · 4.16 KB
/
Program.cs
File metadata and controls
156 lines (139 loc) · 4.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/*
* Author: Nikolay Dvurechensky
* Site: https://dvurechensky.pro/
* Gmail: dvurechenskysoft@gmail.com
* Last Updated: 27 апреля 2026 09:40:39
* Version: 1.0.254
*/
/* Интерпретатор
Получая формальный язык, определяет
представление его грамматики и интерпретатор,
использующий это представление для обработки
выражений языка (Применяется для часто повторяющихся операций)
*/
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);
}
}