diff --git a/CodeTranslator/CodeTranslator.csproj b/CodeTranslator/CodeTranslator.csproj
index a28b46f..7ea80df 100644
--- a/CodeTranslator/CodeTranslator.csproj
+++ b/CodeTranslator/CodeTranslator.csproj
@@ -55,6 +55,8 @@
MSBuild:Compile
Designer
+
+
MSBuild:Compile
diff --git a/CodeTranslator/Exceptions/OredrException.cs b/CodeTranslator/Exceptions/OredrException.cs
new file mode 100644
index 0000000..b3f552f
--- /dev/null
+++ b/CodeTranslator/Exceptions/OredrException.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CodeTranslator.Exceptions
+{
+ public class OredrException : Exception
+ {
+ public OredrException() : base() { }
+ public OredrException(string exception, int line, params object[] args)
+ : base(string.Format(exception, line, args[0])) { }
+ public OredrException(string exceptionMessage, Exception inner) : base(exceptionMessage, inner) { }
+ }
+}
diff --git a/CodeTranslator/Exceptions/SyntaxException.cs b/CodeTranslator/Exceptions/SyntaxException.cs
new file mode 100644
index 0000000..f610150
--- /dev/null
+++ b/CodeTranslator/Exceptions/SyntaxException.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CodeTranslator.Exceptions
+{
+ public class SyntaxException : Exception
+ {
+ public SyntaxException() : base() { }
+
+ public SyntaxException(string exception, int line, params object[] args)
+ : base(string.Format(exception, line, args[0])) { }
+
+ public SyntaxException(string exceptionMessage, Exception inner) : base(exceptionMessage, inner) { }
+ }
+}
diff --git a/CodeTranslator/MainWindow.xaml b/CodeTranslator/MainWindow.xaml
index 1603dc5..7161d34 100644
--- a/CodeTranslator/MainWindow.xaml
+++ b/CodeTranslator/MainWindow.xaml
@@ -5,7 +5,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:CodeTranslator"
mc:Ignorable="d"
- Title="MainWindow" Height="764" Width="800" Visibility="Visible" WindowStyle="None" Padding="0" Margin="0">
+ Title="MainWindow" Height="784" Width="1200" Visibility="Visible" WindowStyle="ToolWindow" Padding="0" Margin="0">
@@ -16,12 +16,12 @@
-
-
+
+
-
+
@@ -47,14 +47,91 @@
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/CodeTranslator/MainWindow.xaml.cs b/CodeTranslator/MainWindow.xaml.cs
index b222d33..94d1d7b 100644
--- a/CodeTranslator/MainWindow.xaml.cs
+++ b/CodeTranslator/MainWindow.xaml.cs
@@ -13,6 +13,7 @@
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
+using CodeTranslator.Exceptions;
namespace CodeTranslator
{
@@ -33,8 +34,13 @@ public MainWindow()
private void Button_Click(object sender, RoutedEventArgs e)
{
+ ErrorBox.Content = "";
var codeBoxText = new TextRange(CodeBox.Document.ContentStart, CodeBox.Document.ContentEnd).Text;
- ErrorBox.Content = _translator.CheckSyntax(codeBoxText);
+ try { _translator.CheckSyntax(codeBoxText); }
+ catch (Exception ex) when (ex is SyntaxException | ex is OredrException)
+ {
+ ErrorBox.Content = ex.Message;
+ }
if ((string) ErrorBox.Content == "")
{
Results.Clear();
diff --git a/CodeTranslator/Translator.cs b/CodeTranslator/Translator.cs
index 32b1e35..536cebb 100644
--- a/CodeTranslator/Translator.cs
+++ b/CodeTranslator/Translator.cs
@@ -16,9 +16,11 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
+using System.Data;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
+using CodeTranslator.Exceptions;
namespace CodeTranslator
{
@@ -28,78 +30,132 @@ public class Translator
private Dictionary _errorsDic;
private List _marks;
+ private List _usedMarks;
private Dictionary _variables;
+ private int _currentLine;
+
public Translator()
{
_regexs = new Dictionary()
{
- {"Числa", new Regex(@"^\d+$")},
+ {"Числа", new Regex(@"^\d+$")},
{"Операторы", new Regex("[&|*/+-]") },
- {"БульевыЧислa", new Regex("[!01]+")},
+ {"БульевыЧисла", new Regex("[!01]+")},
{"БульевыЗнаки", new Regex("[!&|]")},
- {"БулеваОперация", new Regex("[!&|01]+")},
+ {"БулеваОперация", new Regex("^[)(!&|01]+$")},
{"ЯзыкНачало", new Regex("^Программа$")},
{"ЯзыкКонец", new Regex("^Конец программа$")},
{"Заголовок", new Regex(@"^Метки( [\d]+)+$")},
{"Операция", new Regex(@"^([\d]+) : ([\dа-яА-Я]+) = ([\d()!&|+*/ -]+)$")},
+ {"ОперацияЛеваяЧасть", new Regex(@"^([\d]+) : ([\dа-яА-Я]+) = ")},
{"ПраваяЧасть", new Regex(@"^([\d()!&|+*/,-]+)([&|+*/-])([\d()!&|+*/,-]+)$")},
{"ПраваяЧастьПростая", new Regex(@"^(-?\d+,?\d*?)(([+*/-])(-?\d+,?\d*?))+$")},
- {"ПраваяЧастьБуль", new Regex(@"^(!?[0-1]+)(([|&])(!?[0-1]+))+$")}
+ {"ПраваяЧастьБуль", new Regex(@"^(!?[0-1]+)(([|&])(!?[0-1]+))+$")},
+
+ {")Первая", new Regex(@"^[^(.]+\)")}
};
+ const string exceptionBase = "Ошибка в строке {0}.";
+ const string kostil = "'{1}'";
_errorsDic = new Dictionary()
{
- {"Язык", "^Программа(.+)Конец программа$"},
- {"Заголовок", $"Метки( [0-9]+)+"},
- {"Операция", "[0-9]+ : [0-9а-яА-Я]+ = test"},
- {"НетОперация", "Нет ни одного блока 'Операция'"},
- {"НеизвестнаяМарка", "Марка {0} не была обхявлена!"},
+ {"^Язык", $"{exceptionBase} Неверное ключевое слово {kostil}. Ожидается: Программа"},
+ {"Язык$", $"{exceptionBase} Неверное ключевое слово {kostil}. Ожидается: Конец программа"},
+ {"Заголовок", $"{exceptionBase} Неверное ключевое слово {kostil}." +
+ $" Ожидается: Метки <Знак> ... <Знак>"},
+ {"ДубльМарка", $"{exceptionBase} Попытка добавить одинаковую марку 2 раза {kostil}"},
+ {"Операция", $"{exceptionBase} Неверное ключевое слово {kostil}." +
+ $" Ожидается: <Метка> \":\" <Перем> \"=\" <Прав.часть>"},
+ {"НетОперация", $"{exceptionBase} Нет ни одного блока <Операция>"},
+ {"НеизвестнаяМарка", $"{exceptionBase} Марка {kostil} не была объявлена!"},
+ {"ПовторяющаясяМарка", $"{exceptionBase} Марка {kostil} была использована более двух раз!"},
+ {"ПовторяющаясяПеременная", $"{exceptionBase} Такая переменная уже была объявлена ранее\n{kostil}"},
+ {"ПлохаяПраваяЧасть", $"{exceptionBase} Правая часть содержит недопустимые символы\n{kostil}"},
+ {"НепарнаяСкобка", $"{exceptionBase} Правая часть с непарными скобками\n{kostil}"},
+ {"БульНеБуль", $"{exceptionBase} Правая часть содержит обычные и булевы операции\n{kostil}"},
+ {"Цифра(", $"{exceptionBase} Цифра не может идти после открывающей скобки." +
+ $" Нужен соединяющий оператор\n{kostil}" },
+ {")(", $"{exceptionBase} Закрывающая скобка не может идти после открывающей скобки." +
+ $" Нужен соединяющий оператор\n{kostil}" },
+ {"()", $"{exceptionBase} Скобки ничего не содержат\n{kostil}" },
+ {"Знак)", $"{exceptionBase} Знак не может соединять закрывающую скобку\n{kostil}" },
+ {"^)", $"{exceptionBase} Закрывающая скобка как начало правой части\n{kostil}" },
+ {")Первая", $"{exceptionBase} Закрывающая скобка без открывающей скобки\n{kostil}" },
+ {"ПорядокПравойЧасти", $"{exceptionBase} Неверный порядок чисел и связующих операторов\n{kostil}" },
};
_variables = new Dictionary();
_marks = new List();
+ _usedMarks = new List();
+ _currentLine = 1;
}
- public string CheckSyntax(string text)
+ public void CheckSyntax(string text)
{
_variables.Clear();
_marks.Clear();
+ _usedMarks.Clear();
+ _currentLine = 1;
+
+ var codeLines = text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
- var codeLines = text.Split(new[] {'\r','\n'}, StringSplitOptions.RemoveEmptyEntries);
-
if (!_regexs["ЯзыкНачало"].IsMatch(codeLines[0]))
- return _errorsDic["Язык"];
+ throw new SyntaxException(_errorsDic["^Язык"], 1, codeLines[0]);
if (!_regexs["Заголовок"].IsMatch(codeLines[1]))
- return _errorsDic["Заголовок"];
+ throw new SyntaxException(_errorsDic["Заголовок"], 2, codeLines[1]);
foreach (var markCapture in _regexs["Заголовок"].Match(codeLines[1]).Groups[1].Captures)
- _marks.Add(markCapture.ToString().TrimStart(' '));
+ {
+ var mark = markCapture.ToString().TrimStart(' ');
+ if (_marks.Contains(mark))
+ throw new SyntaxException(_errorsDic["ДубльМарка"], 2, mark);
+ _marks.Add(mark);
+ }
- var codeLineNum = 2;
- while (_regexs["Операция"].IsMatch(codeLines[codeLineNum]))
+ _currentLine = 2;
+ while (_regexs["ОперацияЛеваяЧасть"].IsMatch(codeLines[_currentLine]))
{
- var groups = _regexs["Операция"].Match(codeLines[codeLineNum]).Groups;
+ var groups = _regexs["Операция"].Match(codeLines[_currentLine]).Groups;
+
+ if (groups[0].Value == "")
+ {
+ var rightPart = _regexs["ОперацияЛеваяЧасть"].Match(codeLines[_currentLine]).Value;
+ var wrongPart = codeLines[_currentLine].Replace(rightPart, "");
+ throw new SyntaxException(_errorsDic["ПлохаяПраваяЧасть"], _currentLine + 1, wrongPart);
+ }
if (!_marks.Contains(groups[1].Value))
- return string.Format(_errorsDic["НеизвестнаяМарка"], groups[1].Value);
+ throw new SyntaxException(_errorsDic["НеизвестнаяМарка"], _currentLine + 1, groups[1].Value);
+
+ if (_usedMarks.Contains(groups[1].Value))
+ throw new SyntaxException(_errorsDic["ПовторяющаясяМарка"], _currentLine + 1, groups[1].Value);
+
+ _usedMarks.Add(groups[1].Value);
if (_variables.ContainsKey(groups[2].Value))
- return "Такая переменная уже была объявлена ранее!";
+ throw new SyntaxException(_errorsDic["ПовторяющаясяПеременная"], _currentLine + 1, groups[2].Value);
if (_regexs["ПраваяЧасть"].IsMatch(groups[3].Value))
_variables.Add(groups[2].Value, double.Parse(ParseOperation(groups[3].Value)));
- codeLineNum++;
- }
- if (codeLineNum == 2) return _errorsDic["НетОперация"];
+ else
+ throw new SyntaxException(_errorsDic["ПраваяЧасть"], _currentLine + 1);
- if (!_regexs["ЯзыкКонец"].IsMatch(codeLines[codeLineNum]))
- return _errorsDic["Язык"];
+ _currentLine++;
+ }
+ if (_currentLine == 2)
+ {
+ if (_regexs["ЯзыкКонец"].IsMatch(codeLines[_currentLine]))
+ throw new SyntaxException(_errorsDic["НетОперация"], 3, codeLines[2]);
+ else
+ throw new SyntaxException(_errorsDic["Операция"], 3, codeLines[2]);
+ }
- return "";
+ if (!_regexs["ЯзыкКонец"].IsMatch(codeLines[_currentLine]))
+ throw new SyntaxException(_errorsDic["Язык$"], _currentLine + 1, codeLines[_currentLine]);
}
public Dictionary GetResult()
@@ -140,7 +196,7 @@ private string ParseOperation(string text)
substring.Append(
text.Substring(
- lastSuccessfulBracket+1, text.Length-lastSuccessfulBracket-1));
+ lastSuccessfulBracket + 1, text.Length - lastSuccessfulBracket - 1));
}
text = substring.ToString();
@@ -156,16 +212,22 @@ private void CheckBrackets(string text)
"ПраваяЧастьБуль" : "ПраваяЧастьПростая";
if (text.Count(c => c == ')') != text.Count(c => c == '('))
- throw new ArgumentException("Есть непарные скобки");
+ throw new OredrException(_errorsDic["НепарнаяСкобка"], _currentLine + 1, text);
if (operationType == "ПраваяЧастьБуль")
if (!_regexs["БулеваОперация"].IsMatch(text))
- throw new Exception("Булева операция содержит недопустимые символы");
+ throw new OredrException(_errorsDic["БульНеБуль"], _currentLine + 1, text);
+
+ if (_regexs[")Первая"].IsMatch(text))
+ throw new OredrException(_errorsDic[")Первая"], _currentLine + 1, text);
+ var i = 0;
+ var lastSymbol = "";
var openBracketCount = 0;
var lastBracketContent = new StringBuilder();
foreach (var chr in text)
{
+ i++;
if (brackets.Contains(chr))
{
if (chr == '(')
@@ -173,44 +235,56 @@ private void CheckBrackets(string text)
openBracketCount++;
if (lastBracketContent.Length != 0)
{
- var lastSymbol = lastBracketContent.ToString().Last().ToString();
if (lastSymbol == "(" || _regexs["Операторы"].IsMatch(lastSymbol))
+ {
+ lastSymbol = "(";
continue;
+ }
if (_regexs["Числа"].IsMatch(lastSymbol))
- throw new Exception("Fuck you bracket operator!");
+ throw new OredrException(_errorsDic["Цифра("], _currentLine + 1, text.Substring(0, i));
if (lastSymbol == ")")
- throw new Exception("Fuck you close bracket!");
+ throw new OredrException(_errorsDic[")("], _currentLine + 1, text.Substring(0, i));
}
}
else
{
- if (openBracketCount == 0)
- throw new Exception("Close bracket without fking open bracket! Damn~");
+ if (openBracketCount == 0 && i == 1)
+ throw new OredrException(_errorsDic["^)"], _currentLine + 1, text);
openBracketCount--;
if (lastBracketContent.Length != 0)
{
- var lastSymbol = lastBracketContent.ToString().Last().ToString();
- if (lastSymbol == ")" || _regexs["Числa"].IsMatch(lastSymbol))
+ if (lastSymbol == ")" || _regexs["Числа"].IsMatch(lastSymbol))
if (_regexs[operationType].IsMatch(lastBracketContent.ToString()))
+ {
+ lastSymbol = ")";
continue;
- else throw new Exception("Fuck number-operator order!");
+ }
+ else
+ throw new OredrException(_errorsDic["ПорядокПравойЧасти"],
+ _currentLine + 1, lastBracketContent);
if (lastSymbol == "(")
- throw new Exception("Fuck empty brackets!~");
+ throw new OredrException(_errorsDic["()"], _currentLine + 1, text.Substring(0, i));
if (_regexs["Операторы"].IsMatch(lastSymbol))
- throw new Exception("Fuck operator before bracket!~");
- } else
- throw new Exception("Fuck first close bracket character!~");
+ throw new OredrException(_errorsDic["Знак)"], _currentLine + 1, text.Substring(0, i));
+ }
+ else
+ throw new OredrException(_errorsDic["^)"], _currentLine + 1, text);
+
+ lastSymbol = ")";
}
}
else
+ {
+ lastSymbol = chr.ToString();
lastBracketContent.Append(chr);
+ }
}
if (!_regexs[operationType].IsMatch(lastBracketContent.ToString()))
- throw new Exception("Fuck number-operator order!");
+ throw new OredrException(_errorsDic["ПорядокПравойЧасти"], _currentLine + 1, lastBracketContent);
}
private string PerformCalculation(string operation)
@@ -244,7 +318,7 @@ private string PerformCalculation(string operation)
}
return opers[0];
}
-
+
private string[] OperatorsArray(string operation)
{
var operationType = _regexs["БульевыЗнаки"].IsMatch(operation) ?
@@ -289,9 +363,9 @@ public void ReplaceBoolInversion(ref string[] opers)
private double Calculate(string leftSide, string oper, string rightSide)
{
- if (new [] { "&", "|", "!" }.Contains(oper) &&
- !_regexs["БульевыЧислa"].IsMatch(leftSide) &&
- !_regexs["БульевыЧислa"].IsMatch(rightSide))
+ if (new[] { "&", "|", "!" }.Contains(oper) &&
+ !_regexs["БульевыЧисла"].IsMatch(leftSide) &&
+ !_regexs["БульевыЧисла"].IsMatch(rightSide))
throw new Exception("Булевые операции доступны только для булевых значений");
if (leftSide.StartsWith("!"))
diff --git a/UnitTests/Calculations.cs b/UnitTests/Calculations.cs
index e631f93..36673e6 100644
--- a/UnitTests/Calculations.cs
+++ b/UnitTests/Calculations.cs
@@ -9,27 +9,27 @@
namespace UnitTests
{
- public class TestSuite
+ class CalculationTest
{
[Test]
public void SimpleCalculations()
{
var translator = new Translator();
- Assert.AreEqual(246, translator.PrivateMethod("CalculateNumber", "123 + 123"));
- Assert.AreEqual(81, translator.PrivateMethod("CalculateNumber", "123 - 42"));
- Assert.AreEqual(369, translator.PrivateMethod("CalculateNumber", "123 * 3"));
- Assert.AreEqual(61.5, translator.PrivateMethod("CalculateNumber", "123 / 2"));
+ Assert.AreEqual("246", translator.PrivateMethod("ParseOperation", "123+123"));
+ Assert.AreEqual("81", translator.PrivateMethod("ParseOperation", "123-42"));
+ Assert.AreEqual("369", translator.PrivateMethod("ParseOperation", "123*3"));
+ Assert.AreEqual("61,5", translator.PrivateMethod("ParseOperation", "123/2"));
}
[Test]
public void BooleanCalculation()
{
var translator = new Translator();
- Assert.AreEqual(1, translator.PrivateMethod("CalculateNumber", "1 | 0"));
- Assert.AreEqual(0, translator.PrivateMethod("CalculateNumber", "!1 | 0"));
- Assert.AreEqual(0, translator.PrivateMethod("CalculateNumber", "1 & 0"));
- Assert.AreEqual(1, translator.PrivateMethod("CalculateNumber", "1 & 1"));
- Assert.AreEqual(1, translator.PrivateMethod("CalculateNumber", "1 & !0"));
+ Assert.AreEqual("1", translator.PrivateMethod("ParseOperation", "1|0"));
+ Assert.AreEqual("0", translator.PrivateMethod("ParseOperation", "!1|0"));
+ Assert.AreEqual("0", translator.PrivateMethod("ParseOperation", "1&0"));
+ Assert.AreEqual("1", translator.PrivateMethod("ParseOperation", "1&1"));
+ Assert.AreEqual("1", translator.PrivateMethod("ParseOperation", "1&!0"));
}
[Test]
diff --git a/UnitTests/ExceptionTest.cs b/UnitTests/ExceptionTest.cs
new file mode 100644
index 0000000..c269256
--- /dev/null
+++ b/UnitTests/ExceptionTest.cs
@@ -0,0 +1,370 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using CodeTranslator;
+using CodeTranslator.Exceptions;
+using NUnit.Framework;
+
+namespace UnitTests
+{
+ class ExceptionTest
+ {
+ #region SyntaxExceptions
+
+ [Test]
+ public void ProgramStartSyntax()
+ {
+ var translator = new Translator();
+ try { translator.CheckSyntax("Программа1"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 1. Неверное ключевое слово 'Программа1'. Ожидается: Программа",
+ ex.Message);
+ }
+ try { translator.CheckSyntax("1Программа"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 1. Неверное ключевое слово '1Программа'. Ожидается: Программа",
+ ex.Message);
+ }
+ try { translator.CheckSyntax("программа"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 1. Неверное ключевое слово 'программа'. Ожидается: Программа",
+ ex.Message);
+ }
+ }
+
+ [Test]
+ public void HeaderSyntax()
+ {
+ var translator = new Translator();
+ var text = "Программа\r\n";
+
+ try { translator.CheckSyntax($"{text}Метка 12 13 14"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 2. Неверное ключевое слово 'Метка 12 13 14'. Ожидается: Метки <Знак> ... <Знак>",
+ ex.Message);
+ }
+ try { translator.CheckSyntax($"{text}метки 12 13 14"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 2. Неверное ключевое слово 'метки 12 13 14'. Ожидается: Метки <Знак> ... <Знак>",
+ ex.Message);
+ }
+ try { translator.CheckSyntax($"{text}Метки ф3 13 14"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 2. Неверное ключевое слово 'Метки ф3 13 14'. Ожидается: Метки <Знак> ... <Знак>",
+ ex.Message);
+ }
+ }
+
+ [Test]
+ public void NotUniqueMarkSyntax()
+ {
+ var translator = new Translator();
+ var text = "Программа\r\n";
+
+ try { translator.CheckSyntax($"{text}Метки 12 13 14 13"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 2. Попытка добавить одинаковую марку 2 раза '13'",
+ ex.Message);
+ }
+ try { translator.CheckSyntax($"{text}Метки 12 12"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 2. Попытка добавить одинаковую марку 2 раза '12'",
+ ex.Message);
+ }
+ try { translator.CheckSyntax($"{text}Метки 154 487 123 488 48 11 488"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 2. Попытка добавить одинаковую марку 2 раза '488'",
+ ex.Message);
+ }
+ }
+
+ [Test]
+ public void LeftSideOperationSyntax()
+ {
+ var translator = new Translator();
+ var text = "Программа\r\nМетки 1 2 3\r\n";
+
+ try { translator.CheckSyntax($"{text}10 : тест = 123-123"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 3. Неверное ключевое слово '10 : тест = 123-123'." +
+ " Ожидается: <Метка> \":\" <Перем> \"=\" <Прав.часть>",
+ ex.Message);
+ }
+ try { translator.CheckSyntax($"{text}а10 : тест = 123-123"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 3. Неверное ключевое слово 'а10 : тест = 123-123'." +
+ " Ожидается: <Метка> \":\" <Перем> \"=\" <Прав.часть>",
+ ex.Message);
+ }
+ try { translator.CheckSyntax($"{text}10 : тест = 123-123"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 3. Неверное ключевое слово '10 : тест = 123-123'." +
+ " Ожидается: <Метка> \":\" <Перем> \"=\" <Прав.часть>",
+ ex.Message);
+ }
+ }
+
+ [Test]
+ public void RightSideOperationSyntax()
+ {
+ var translator = new Translator();
+ var text = "Программа\r\nМетки 1 2 3\r\n10 : тест = ";
+
+ try { translator.CheckSyntax($"{text}12-(43-43)\\"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 3. Правая часть содержит недопустимые символы\n'12-(43-43)\\'",
+ ex.Message);
+ }
+ try { translator.CheckSyntax($"{text}12.34-434"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 3. Правая часть содержит недопустимые символы\n'12.34-434'",
+ ex.Message);
+ }
+ try { translator.CheckSyntax($"{text}124-43,4"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 3. Правая часть содержит недопустимые символы\n'124-43,4'",
+ ex.Message);
+ }
+ }
+
+ [Test]
+ public void UnknownMark()
+ {
+ var translator = new Translator();
+ var text = "Программа\r\nМетки 1 2 3\r\n34 : тест = 324-43";
+
+ try { translator.CheckSyntax($"{text}"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 3. Марка '34' не была объявлена!",
+ ex.Message);
+ }
+ }
+
+ [Test]
+ public void UniqueMark()
+ {
+ var translator = new Translator();
+ var text = "Программа\r\nМетки 12 23 31\r\n12 : тест = 324-43\r\n12 : тест = 324-43";
+
+ try { translator.CheckSyntax($"{text}"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 4. Марка '12' была использована более двух раз!",
+ ex.Message);
+ }
+ }
+
+ [Test]
+ public void SameVariable()
+ {
+ var translator = new Translator();
+ var text = "Программа\r\nМетки 1 2 3\r\n1 : тест = 324-43";
+
+ try { translator.CheckSyntax($"{text}\r\n2 : тест = 324-413"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 4. Такая переменная уже была объявлена ранее\n'тест'",
+ ex.Message);
+ }
+ }
+
+ [Test]
+ public void NoOperations()
+ {
+ var text = "Программа\r\nМетки 1 2 3\r\nКонец программа";
+
+ var translator = new Translator();
+ try { translator.CheckSyntax($"{text}"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 3. Нет ни одного блока <Операция>",
+ ex.Message);
+ }
+ }
+
+ [Test]
+ public void ProgramEndSyntax()
+ {
+ var text = "Программа\r\nМетки 1 2 3\r\n1 : тест = 324-43\r\n";
+
+ var translator = new Translator();
+ try { translator.CheckSyntax($"{text}Конец программа1"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 4. Неверное ключевое слово 'Конец программа1'. Ожидается: Конец программа",
+ ex.Message);
+ }
+ try { translator.CheckSyntax($"{text}!Конец программа"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 4. Неверное ключевое слово '!Конец программа'. Ожидается: Конец программа",
+ ex.Message);
+ }
+ try { translator.CheckSyntax($"{text}Конецпрограмма"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 4. Неверное ключевое слово 'Конецпрограмма'. Ожидается: Конец программа",
+ ex.Message);
+ }
+ try { translator.CheckSyntax($"{text}конец программа"); }
+ catch (SyntaxException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 4. Неверное ключевое слово 'конец программа'. Ожидается: Конец программа",
+ ex.Message);
+ }
+ }
+ #endregion
+
+ #region OrderExceptions
+
+ [Test]
+ public void NotPairedBrackets()
+ {
+ var translator = new Translator();
+ var text = "Программа\r\nМетки 1 2 3\r\n1 : тест = ((324-43)";
+
+ try { translator.CheckSyntax($"{text}"); }
+ catch (OredrException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 3. Правая часть с непарными скобками\n'((324-43)'",
+ ex.Message);
+ }
+ }
+
+ [Test]
+ public void BoolNotBool()
+ {
+ var translator = new Translator();
+ var text = "Программа\r\nМетки 1 2 3\r\n1 : тест = ((324-43)|1)&1";
+
+ try { translator.CheckSyntax($"{text}"); }
+ catch (OredrException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 3. Правая часть содержит обычные и булевы операции\n'((324-43)|1)&1'",
+ ex.Message);
+ }
+ }
+
+ [Test]
+ public void NumberBeforeOpenBrackets()
+ {
+ var translator = new Translator();
+ var text = "Программа\r\nМетки 1 2 3\r\n1 : тест = ((324-43)-43(3*2))-2";
+
+ try { translator.CheckSyntax($"{text}"); }
+ catch (OredrException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 3. Цифра не может идти после открывающей скобки. " +
+ "Нужен соединяющий оператор\n'((324-43)-43('",
+ ex.Message);
+ }
+ }
+
+ [Test]
+ public void CloseBracketBeforeOpenBrackets()
+ {
+ var translator = new Translator();
+ var text = "Программа\r\nМетки 1 2 3\r\n1 : тест = 12-((2*3)(3*2))-2";
+
+ try { translator.CheckSyntax($"{text}"); }
+ catch (OredrException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 3. Закрывающая скобка не может идти после открывающей скобки." +
+ $" Нужен соединяющий оператор\n'12-((2*3)('",
+ ex.Message);
+ }
+ }
+
+ [Test]
+ public void OpenBracketsBeforeCloseBracket()
+ {
+ var translator = new Translator();
+ var text = "Программа\r\nМетки 1 2 3\r\n1 : тест = 12-((2*3)-()(3*2))-2";
+
+ try { translator.CheckSyntax($"{text}"); }
+ catch (OredrException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 3. Скобки ничего не содержат\n'12-((2*3)-()'",
+ ex.Message);
+ }
+ }
+
+ [Test]
+ public void LineStartFromCloseBracket()
+ {
+ var translator = new Translator();
+ var text = "Программа\r\nМетки 1 2 3\r\n1 : тест = )12-((2*3)-((3*2))-2";
+
+ try { translator.CheckSyntax($"{text}"); }
+ catch (OredrException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 3. Закрывающая скобка как начало правой части\n')12-((2*3)-((3*2))-2'",
+ ex.Message);
+ }
+ }
+
+ [Test]
+ public void CloseBracketWithoutOpen()
+ {
+ var translator = new Translator();
+ var text = "Программа\r\nМетки 1 2 3\r\n1 : тест = 2*3)-(3*2)-2(";
+
+ try { translator.CheckSyntax($"{text}"); }
+ catch (OredrException ex)
+ {
+ Assert.AreEqual(
+ "Ошибка в строке 3. Закрывающая скобка без открывающей скобки\n'2*3)-(3*2)-2('",
+ ex.Message);
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/UnitTests/Syntax.cs b/UnitTests/Syntax.cs
deleted file mode 100644
index 9b40eb9..0000000
--- a/UnitTests/Syntax.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using CodeTranslator;
-using NUnit.Framework;
-
-namespace UnitTests
-{
- class Syntax
- {
- [Test]
- public void TestSyntax()
- {
- var input = "asdf";
- var output = new Translator().CheckSyntax(input);
- }
- }
-}
diff --git a/UnitTests/UnitTests.csproj b/UnitTests/UnitTests.csproj
index 4a8875a..f8bd2de 100644
--- a/UnitTests/UnitTests.csproj
+++ b/UnitTests/UnitTests.csproj
@@ -47,7 +47,7 @@
-
+