diff --git a/Compiler/Models/Interfaces/IParser.cs b/Compiler/Models/Interfaces/IParser.cs
new file mode 100644
index 0000000..9446b70
--- /dev/null
+++ b/Compiler/Models/Interfaces/IParser.cs
@@ -0,0 +1,10 @@
+
+namespace Compiler
+{
+ public interface IParser
+ {
+ List При нахождении ошибок в левом нижнем углу отобразится их количество и появится кнопка, предлагающая исправить их автоматически в один клик.Оглавление:
Файл
-
-
Создает новый файл для редактирования.Справка
Отображает окно справки с описанием функций редактора.
Показывает информацию о текстовом редакторе и его версии.Исправить найденные ошибки (F6)
-
Методом анализа является алгоритм синтаксического анализа, основанный на графе автоматной грамматики.
-Графы или диаграммы состояний представляют собой геометрическую интерпретацию синтаксического анализа слева направо. В отличие от синтаксических деревьев, графы или диаграммы состояний используются только для автоматных грамматик.
-Определение: Графом Γ(G[Z]) или диаграммой состояний называется совокупность узлов и направленных дуг, соединяющих узлы. Узлы графа соответствуют нетерминальным символам. Дуги графа направлены из одного узла в другой (или в тот же узел) таким образом, что из узла N дуга направляется в M и маркируется терминалом t, если в грамматике имеется правило вида: N → t M.
-Граф конечного автомата:
-Методом анализа является метод рекурсивного спуска, представленный кодом ниже:
+
+private void Z(bool get, bool neutralize = false)
+{
+ if (get) ChangeCurrentToken();
+
+ if (CurrToken.Type == LexemeType.DECLARE || neutralize)
+ {
+ E(true);
+ }
+ else
+ {
+ Errors.Add(new ParserError($"Ожидалось ключевое слово DECLARE,
+ а встречено \"{CurrToken.Value}\"", CurrToken.StartIndex,
+ tokens[MaxIndex].EndIndex, ErrorType.UnfinishedExpression));
+ E(true);
+ }
+}
+
+private void E(bool get, bool neutralize = false)
+{
+ if (get) ChangeCurrentToken();
+
+ if (CurrToken.Type == LexemeType.Identifier || neutralize)
+ {
+ CONST(true);
+ }
+ else
+ {
+ Errors.Add(new ParserError($"Ожидался идентификатор,
+ а встречено \"{CurrToken.Value}\"", CurrToken.StartIndex,
+ tokens[MaxIndex].EndIndex, ErrorType.UnfinishedExpression));
+ CONST(true);
+ }
+}
+
+private void CONST(bool get, bool neutralize = false)
+{
+ if (get) ChangeCurrentToken();
+
+ if (CurrToken.Type == LexemeType.CONSTANT || neutralize)
+ {
+ INT(true);
+ }
+ else
+ {
+ Errors.Add(new ParserError($"Ожидалось ключевое слово CONSTANT,
+ а встречено \"{CurrToken.Value}\"", CurrToken.StartIndex,
+ tokens[MaxIndex].EndIndex, ErrorType.UnfinishedExpression));
+ INT(true);
+ }
+}
+
+private void INT(bool get, bool neutralize = false)
+{
+ if (get) ChangeCurrentToken();
+
+ if (CurrToken.Type == LexemeType.INTEGER || neutralize)
+ {
+ ASSIGN(true);
+ }
+ else
+ {
+ Errors.Add(new ParserError($"Ожидалось ключевое слово INTEGER,
+ а встречено \"{CurrToken.Value}\"", CurrToken.StartIndex,
+ tokens[MaxIndex].EndIndex, ErrorType.UnfinishedExpression));
+ ASSIGN(true);
+ }
+}
+
+private void ASSIGN(bool get, bool neutralize = false)
+{
+ if (get) ChangeCurrentToken();
+
+ if (CurrToken.Type == LexemeType.AssignmentOperator || neutralize)
+ {
+ NUMBER(true);
+ }
+ else
+ {
+ Errors.Add(new ParserError($"Ожидался оператор присваивания,
+ а встречено \"{CurrToken.Value}\"", CurrToken.StartIndex,
+ tokens[MaxIndex].EndIndex, ErrorType.UnfinishedExpression));
+ NUMBER(true);
+ }
+}
+
+private void NUMBER(bool get, bool neutralize = false)
+{
+ if (get) ChangeCurrentToken();
+
+ if (CurrToken.Type == LexemeType.Sign || CurrToken.Type == LexemeType.UnsignedInteger
+ || neutralize)
+ {
+ UNSIGNEDINT(CurrToken.Type == LexemeType.Sign);
+ }
+ else
+ {
+ Errors.Add(new ParserError($"Ожидался знак или число,
+ а встречено \"{CurrToken.Value}\"", CurrToken.StartIndex,
+ tokens[MaxIndex].EndIndex, ErrorType.UnfinishedExpression));
+ UNSIGNEDINT(true);
+ }
+}
+
+private void UNSIGNEDINT(bool get, bool neutralize = false)
+{
+ if (get) ChangeCurrentToken();
+
+ if (CurrToken.Type == LexemeType.UnsignedInteger || neutralize)
+ {
+ END(true);
+ }
+ else
+ {
+ Errors.Add(new ParserError($"Ожидалось число,
+ а встречено \"{CurrToken.Value}\"", CurrToken.StartIndex,
+ tokens[MaxIndex].EndIndex, ErrorType.UnfinishedExpression));
+ END(true);
+ }
+}
+
+private void END(bool get, bool neutralize = false)
+{
+ if (get) ChangeCurrentToken();
+
+ if (CurrToken.Type == LexemeType.Semicolon || neutralize)
+ {
+ Z(true);
+ }
+ else
+ {
+ Errors.Add(new ParserError($"Ожидался идентификатор,
+ а встречено \"{CurrToken.Value}\"", CurrToken.StartIndex,
+ tokens[MaxIndex].EndIndex, ErrorType.UnfinishedExpression));
+ Z(true);
+ }
+}
+