Skip to content

Commit

Permalink
edited html documents
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexey-Sagaydak committed Apr 2, 2024
1 parent 9c1ba99 commit 3fdef52
Show file tree
Hide file tree
Showing 9 changed files with 211 additions and 74 deletions.
10 changes: 10 additions & 0 deletions Compiler/Models/Interfaces/IParser.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@

namespace Compiler
{
public interface IParser
{
List<ParserError> Errors { get; set; }

List<ParserError> Parse(List<Lexeme> tokensList);
}
}
38 changes: 38 additions & 0 deletions Compiler/Models/Parser/DeclareParser.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Compiler;

public class DeclareParser : IParser
{
private List<Lexeme> tokens;
private Lexeme CurrToken;
private int CurrIndex;
private int MaxIndex;

public List<ParserError> Errors { get; set; }

public DeclareParser()
{
Errors = new List<ParserError>();
}

public List<ParserError> Parse(List<Lexeme> tokensList)
{
Errors.Clear();
if (tokensList.Count <= 0)
return Errors;
tokens = tokensList;
CurrIndex = 0;
MaxIndex = tokensList.Count - 1;
CurrToken = tokens[CurrIndex];



return Errors;
}
}
54 changes: 11 additions & 43 deletions Compiler/Models/Parser/ReqParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@

namespace Compiler;

public class ReqParser
public class ReqParser : IParser
{
private List<Lexeme> tokens;
private Lexeme CurrToken;
private int CurrIndex;
private int MaxIndex;

public List<ParserError> Errors { get; set; }

public ReqParser()
{
Errors = new List<ParserError>();
Expand Down Expand Up @@ -45,7 +45,7 @@ public List<ParserError> Parse(List<Lexeme> tokensList)

private void log(string str)
{

}

private void ChangeCurrentToken()
Expand Down Expand Up @@ -85,11 +85,7 @@ private void Z(bool get, bool neutralize = false)
else
{
Errors.Add(new ParserError($"Ожидалось ключевое слово DECLARE, а встречено \"{CurrToken.Value}\"", CurrToken.StartIndex, tokens[MaxIndex].EndIndex, ErrorType.UnfinishedExpression));

//if (GetNextType() == LexemeType.Identifier)
// E(false);
//else
E(true);
E(true);
}
}

Expand All @@ -104,11 +100,7 @@ private void E(bool get, bool neutralize = false)
else
{
Errors.Add(new ParserError($"Ожидался идентификатор, а встречено \"{CurrToken.Value}\"", CurrToken.StartIndex, tokens[MaxIndex].EndIndex, ErrorType.UnfinishedExpression));

//if (GetNextType() == LexemeType.CONSTANT)
// CONST(false);
//else
CONST(true);
CONST(true);
}
}

Expand All @@ -123,11 +115,7 @@ private void CONST(bool get, bool neutralize = false)
else
{
Errors.Add(new ParserError($"Ожидалось ключевое слово CONSTANT, а встречено \"{CurrToken.Value}\"", CurrToken.StartIndex, tokens[MaxIndex].EndIndex, ErrorType.UnfinishedExpression));

//if (GetNextType() == LexemeType.INTEGER)
// INT(false);
//else
INT(true);
INT(true);
}
}

Expand All @@ -142,11 +130,7 @@ private void INT(bool get, bool neutralize = false)
else
{
Errors.Add(new ParserError($"Ожидалось ключевое слово INTEGER, а встречено \"{CurrToken.Value}\"", CurrToken.StartIndex, tokens[MaxIndex].EndIndex, ErrorType.UnfinishedExpression));

//if (GetNextType() == LexemeType.AssignmentOperator)
// ASSIGN(false);
//else
ASSIGN(true);
ASSIGN(true);
}
}

Expand All @@ -161,11 +145,7 @@ private void ASSIGN(bool get, bool neutralize = false)
else
{
Errors.Add(new ParserError($"Ожидался оператор присваивания, а встречено \"{CurrToken.Value}\"", CurrToken.StartIndex, tokens[MaxIndex].EndIndex, ErrorType.UnfinishedExpression));

//if (GetNextType() == LexemeType.Sign || GetNextType() == LexemeType.Number)
// NUMBER(false);
//else
NUMBER(true);
NUMBER(true);
}
}

Expand All @@ -180,11 +160,7 @@ private void NUMBER(bool get, bool neutralize = false)
else
{
Errors.Add(new ParserError($"Ожидался знак или число, а встречено \"{CurrToken.Value}\"", CurrToken.StartIndex, tokens[MaxIndex].EndIndex, ErrorType.UnfinishedExpression));

//if (GetNextType() == LexemeType.UnsignedInteger)
// UNSIGNEDINT(false);
//else
UNSIGNEDINT(true);
UNSIGNEDINT(true);
}
}

Expand All @@ -199,11 +175,7 @@ private void UNSIGNEDINT(bool get, bool neutralize = false)
else
{
Errors.Add(new ParserError($"Ожидалось число, а встречено \"{CurrToken.Value}\"", CurrToken.StartIndex, tokens[MaxIndex].EndIndex, ErrorType.UnfinishedExpression));

//if (GetNextType() == LexemeType.Semicolon)
// END(false);
//else
END(true);
END(true);
}
}

Expand All @@ -218,11 +190,7 @@ private void END(bool get, bool neutralize = false)
else
{
Errors.Add(new ParserError($"Ожидался идентификатор, а встречено \"{CurrToken.Value}\"", CurrToken.StartIndex, tokens[MaxIndex].EndIndex, ErrorType.UnfinishedExpression));

//if (GetNextType() == LexemeType.DECLARE)
// Z(false);
//else
Z(true);
Z(true);
}
}
}
5 changes: 0 additions & 5 deletions Compiler/Resources/Help.html
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,8 @@ <h2>Оглавление:</h2>
<li><a href="#menu_text">Текст</a></li>
<li><a href="#menu_start">Пуск</a></li>
<li><a href="#menu_help">Справка</a></li>
<li><a href="#menu_fix">Исправить найденные ошибки</a></li>
</ul>


<h2 id="menu_file">Файл</h2>
<ul>
<li><strong>Создать</strong><br />Создает новый файл для редактирования.</li>
Expand Down Expand Up @@ -61,9 +59,6 @@ <h2 id="menu_help">Справка</h2>
<li><strong>Вызов справки</strong><br />Отображает окно справки с описанием функций редактора.</li>
<li><strong>О программе</strong><br />Показывает информацию о текстовом редакторе и его версии.</li>
</ul>

<h2 id="menu_fix">Исправить найденные ошибки (F6)</h2>
<p>При нахождении ошибок в левом нижнем углу отобразится их количество и появится кнопка, предлагающая исправить их автоматически в один клик.</p>
</body>


Expand Down
146 changes: 139 additions & 7 deletions Compiler/Resources/MethodOfAnalysis.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,144 @@
</head>
<body>
<h1>Метод анализа</h1>
<p>Методом анализа является алгоритм синтаксического анализа, основанный на графе автоматной грамматики.</p>
<p>Графы или диаграммы состояний представляют собой геометрическую интерпретацию синтаксического анализа слева направо. В отличие от синтаксических деревьев, графы или диаграммы состояний используются только для автоматных грамматик.</p>
<p><strong>Определение:</strong> Графом Γ(G[Z]) или диаграммой состояний называется совокупность узлов и направленных дуг, соединяющих узлы. Узлы графа соответствуют нетерминальным символам. Дуги графа направлены из одного узла в другой (или в тот же узел) таким образом, что из узла N дуга направляется в M и маркируется терминалом t, если в грамматике имеется правило вида: N → t M.</p>
<p><strong>Граф конечного автомата:</strong></p>
<div class="image-container">
<img src="finite_state_machine.jpg" alt="Diagram">
</div>
<p>Методом анализа является метод рекурсивного спуска, представленный кодом ниже:</p>
<pre><code class="language-с#">
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);
}
}
</code></pre>
</body>
</html>
12 changes: 6 additions & 6 deletions Compiler/Resources/ProblemStatement.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,21 +25,21 @@ <h2 id="особенности-языка">Особенности языка</h2
<p>Константы в языке SQL - это элементы данных, значения которых известны на этапе компиляции и не изменяются в процессе выполнения программы. Для описания констант используется оператор DECLARE с ключевым словом CONSTANT.</p>
<p>Формат записи для объявления целочисленной константы в SQL следующий:</p>

<pre><code class="language-sql">DECLARE имя_константы CONSTANT INTEGER := значение;</code></pre>
<pre><code class="language-sql">DECLARE имя_константы CONSTANT INTEGER = значение;</code></pre>

<h2 id="примеры-верных-строк">Примеры верных строк из языка</h2>

<p>В соответствии с разработанной автоматной грамматикой синтаксический анализатор (парсер) целочисленных констант будет считать верными следующие записи:</p>

<pre><code class="language-sql">DECLARE total_amount CONSTANT INTEGER := -150;</code></pre>
<pre><code class="language-sql">DECLARE total_amount CONSTANT INTEGER = -150;</code></pre>

<pre><code class="language-sql">DECLARE productPrice CONSTANT INTEGER := +150;</code></pre>
<pre><code class="language-sql">DECLARE productPrice CONSTANT INTEGER = +150;</code></pre>

<pre><code class="language-sql">DECLARE expense_1_amount CONSTANT INTEGER := -50;</code></pre>
<pre><code class="language-sql">DECLARE expense_1_amount CONSTANT INTEGER = -50;</code></pre>

<pre><code class="language-sql">DECLARE product_price CONSTANT INTEGER := -150; DECLARE total_2 CONSTANT INTEGER := 50;</code></pre>
<pre><code class="language-sql">DECLARE product_price CONSTANT INTEGER = -150; DECLARE total_2 CONSTANT INTEGER = 50;</code></pre>

<pre><code class="language-sql">DECLARE productPrice3 CONSTANT INTEGER := 150; DECLARE expense_amount_4 CONSTANT INTEGER := -50;</code></pre>
<pre><code class="language-sql">DECLARE productPrice3 CONSTANT INTEGER = 150; DECLARE expense_amount_4 CONSTANT INTEGER = -50;</code></pre>

<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.25.0/prism.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.25.0/components/prism-sql.min.js"></script>
Expand Down
8 changes: 4 additions & 4 deletions Compiler/Resources/correct_test_case.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
DECLARE product_price CONSTANT INTEGER := +150;
DECLARE expense_1_amount CONSTANT INTEGER := +50;
DECLARE product_price CONSTANT INTEGER := -150;
DECLARE product_price CONSTANT INTEGER = +150;
DECLARE expense_1_amount CONSTANT INTEGER = +50;
DECLARE product_price CONSTANT INTEGER = -150;

DECLARE total_2 CONSTANT INTEGER:= 50; DECLARE productPrice3 CONSTANT INTEGER = +150;
DECLARE total_2 CONSTANT INTEGER = 50; DECLARE productPrice3 CONSTANT INTEGER = +150;

Loading

0 comments on commit 3fdef52

Please sign in to comment.