№ теста
|
Цель теста
|
Ожидаемый результат
|
Полученный результат
|
1
|
Проверка вывода ошибок при вводе не корректного кода.
|
Вывод сообщения об ошибки
|
Полученный результат совпадает с ожидаемым (рис. 3,4,5).
|
2
|
Вычисление необъявленной переменной
|
Вывод сообщения об ошибки
|
Полученный результат совпадает с ожидаемым (рис. 6).
|
3
|
Ввод корректного кода программы
|
Программа выводит результат работы программы
|
Полученный результат совпадает с ожидаемым (рис. 7).
|
Заключение
В данной курсовой работе была поставлена задача разработки компилятора к
заданной грамматике.
В ходе решения задачи был разработан интерфейс программы,
алгоритмического анализатора. Программа производит анализ исходного текста и
выдает сообщения об ошибках, если они есть. Было произведено кодирование на
языке программирования C# в
среде объектно-ориентированного программирования Visual Studio 2012 и тестирование, в ходе которого было выявлено,
что программа решает задачу корректно и устойчиво работает на тестовом наборе
данных.
Список используемых источников
1. Д. Креншоу «Пишем компилятор»
2. Р. Хантер «Проектирование и конструирование
компиляторов»
. Компаниец Р.И., Маньков Е.В., Филатов Н.Е.
«Системное программирование. Основы построения трансляторов»
. Костельцев А.В. «Построение интерпретаторов и
компиляторов»
. Касьянов В.Н., Поттосин И.В. «Методы построения
трансляторов»
. Д. Грис «Конструирование компиляторов для цифровых
вычислительных машин»
. Ахо А., Ульман Дж. «Теория синтаксического анализа,
перевода и компиляции»
8. Льюис Ф., Розенкранц Д., Смирну Д. «Теоретические
основы проектирования компиляторов»
Приложения
Приложение А
Исходный код Form1.cs
using
System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Threading.Tasks;System.Windows.Forms;System.Threading;System.IO;KYRS_TLP
{partial class Form1 : Form
{Form1()
{();
}void Form1_Load(object sender, EventArgs e)
{.ReadOnly = true;.Renderer = new
CustomProfessionalRenderer();.Text = "╔";(int i = 0; i < 1;
label1.Text += "═", i++) ;.Text += "DEFAULT.FLP";(int
i = 0; i < 40; label1.Text += "═", i++) ;.Text += "╗\r";(int
i = 0; i < 26; i++)
{.Text += "║";(int j = 0; j
< 52; label1.Text += " ", j++) ;.Text += "║\r";
}.Text += "╚";(int i = 0; i
< 52; label1.Text += "═", i++) ;.Text += "╝";.Text
= "╔";(int i = 0; i < 1; label2.Text += "═",
i++) ;.Text += "OUTPUT";(int i = 0; i < 17; label2.Text += "═",
i++) ;.Text += "╗\r";(int i = 0; i < 26; i++)
{.Text += "║";(int j = 0; j
< 24; label2.Text += " ", j++) ;.Text += "║\r";
}.Text += "╚";(int i = 0; i
< 24; label2.Text += "═", i++) ;.Text += "╝";.Visible
= false;
}len = 0;bool IsEnter = false;string
ReadString = "";void AddText(string msg);void IsVisible(bool msg);snd
{List<Stack<string>>
IN;RichTextBox rtb;snd(List<Stack<string>> a, RichTextBox b)
{= a;= b;
}
};ConstIdent
{string Ident;string Const;ConstIdent(string
a, string b)
{= a;= b;
}
};CaseStruct
{int one;string two;string
three;CaseStruct(int a, string b, string c)
{= a;= b;= c;
}
};
//компилимvoid
debugToolStripMenuItem_Click(object sender, EventArgs e)
{lex = new Lexer(CodeRichTextBox.Text);pars
= new Parser(lex.TOKENS);(pars.DebugMsg == "debug successful")
{.Focus();shell = new
Shell(pars.TokensShell, lex.IDENTIFIES, lex.CONSTANTS);[] snd1 = { new
snd(shell.OUT, AsmRichTextBox) };RunThread = new Thread(Run);.Start(snd1);
}.Visible = true;.Text = pars.DebugMsg;time =
new Thread(timer);.Start(label3);
}void Run( object INI)
{[] snd1 = (snd[])INI;<ConstIdent> CI
= new List<ConstIdent>();(int i = 0; i < snd1[0].IN.Count(); i++)
{(snd1[0].IN[i].Count() != 0)
{(snd1[0].IN[i].Peek())
{"05":
{(snd1[0].rtb.InvokeRequired)[0].rtb.Invoke(new
IsVisible((s) => snd1[0].rtb.ReadOnly = s),
false);[0].IN[i].Pop();(snd1[0].IN[i].Count !=0)
{rr=0;b = "";a =
snd1[0].IN[i].Pop();(rr == 0)
{(IsEnter == false) { Thread.Sleep(100); }=
ReadString;{ int k = Convert.ToInt32(b); IsEnter = false; rr++; }
{(snd1[0].rtb.InvokeRequired)[0].rtb.Invoke(new
AddText((s) => snd1[0].rtb.AppendText(s)), "Incorrect type\n");=
false;
}
}.Add(new ConstIdent(a, b));
}=
false;(snd1[0].rtb.InvokeRequired)[0].rtb.Invoke(new IsVisible((s) =>
snd1[0].rtb.ReadOnly = s), true);;
}"06":
{[0].IN[i].Pop();(snd1[0].IN[i].Count != 0)
{(int j = CI.Count-1; j >= 0 ; j-- )
{(snd1[0].IN[i].Peek() == CI[j].Ident)
{
{
.ToInt32(CI[j].Const);(snd1[0].rtb.InvokeRequired)[0].rtb.Invoke(new
AddText((s) => snd1[0].rtb.AppendText(s)), Convert.ToString(CI[j].Const +
"\n"));
}
{(snd1[0].rtb.InvokeRequired)[0].rtb.Invoke(new
AddText((s) => snd1[0].rtb.AppendText(s)), "");
}[0].IN[i].Pop();;
}
}
} ;
}"07":
{<string> s1 = new
Stack<string>();<CaseStruct> CS = new
List<CaseStruct>();three;case1 = 0;[0].IN[i].Pop();[0].IN[i].Pop();case2
= snd1[0].IN[i].Pop();(snd1[0].IN[i].Peek() == "$")
{
{= Convert.ToInt32(case2);
}
{{ case1 = Convert.ToInt32(TryFind(case2,
CI)); }
{(snd1[0].rtb.InvokeRequired)[0].rtb.Invoke(new
AddText((s) => snd1[0].rtb.AppendText(s)), TryFind(case2, CI) +
"\n");
}
}
}
{[0].IN[i].Push(case2);
{= Convert.ToInt32(Operation(snd1[0].IN[i],
CI));
}
{(snd1[0].rtb.InvokeRequired)[0].rtb.Invoke(new
AddText((s) => snd1[0].rtb.AppendText(s)), Operation(snd1[0].IN[i], CI) +
"\n");
}
}[0].IN[i].Pop();(snd1[0].IN[i].Count != 0)
{one =
Convert.ToInt32(snd1[0].IN[i].Pop());two =
snd1[0].IN[i].Pop();[0].IN[i].Pop();= Operation(snd1[0].IN[i], CI);.Add(new
CaseStruct(one, two, three));[0].IN[i].Pop();
}(int j = 0; j < CS.Count; j++ )
{(case1 == CS[j].one)
{.Add(new ConstIdent(CS[j].two,
CS[j].three));;
}
};
}:
{(snd1[0].IN[i].Count() == 4)
{a = snd1[0].IN[i].Pop();[0].IN[i].Pop();err
= TryFind(snd1[0].IN[i].Pop(), CI);.Add(new ConstIdent(a,
err));[0].IN[i].Pop();;
}
{a = snd1[0].IN[i].Pop();[0].IN[i].Pop();ww
= Operation(snd1[0].IN[i], CI);(ww == "variable is not set" || ww ==
"zero division")(snd1[0].rtb.InvokeRequired)[0].rtb.Invoke(new AddText((s)
=> snd1[0].rtb.AppendText(s)), ww + "\n");.Add(new ConstIdent(a,
ww));[0].IN[i].Pop();
};
}
}
}
}
}string TryFind( string a,
List<ConstIdent> ci)
{ret;kol=0;(true)
{{ ret = Convert.ToInt32(a); return a; }
{= 0;(int j = ci.Count-1; j >= 0; j--)
{(ci[j].Ident == a)
{= ci[j].Const;++;;
}
}(kol == 0)"variable is not set";
}
}
}string Operation(Stack<string> a,
List<ConstIdent> CI)
{<string> s1 = new
Stack<string>();(a.Peek() != "$")
{(a.Peek())
{"+":
{.Pop();b1, c1;
{= Convert.ToInt32(TryFind(s1.Pop(), CI));=
Convert.ToInt32(TryFind(s1.Pop(), CI));
{"variable is not set";
}(a.Peek() !=
"$").Push(Convert.ToString(b1 + c1));Convert.ToString(b1 + c1);;
}"-":
{.Pop();b1, c1;
{= Convert.ToInt32(TryFind(s1.Pop(), CI));=
Convert.ToInt32(TryFind(s1.Pop(), CI));
}
{"variable is not set";
}(a.Peek() !=
"$").Push(Convert.ToString(c1 - b1));Convert.ToString(c1 - b1);;
}"/":
{.Pop();b1, c1;
{= Convert.ToInt32(TryFind(s1.Pop(), CI));=
Convert.ToInt32(TryFind(s1.Pop(), CI));(b1 == 0)"zero division";
}
{"variable is not set";
}(a.Peek() !=
"$").Push(Convert.ToString(c1 / b1));Convert.ToString(c1 / b1);;
}:
{ .Push(a.Pop()); (a.Peek()=="$"
&& s1.Count == 1)
{s1.Pop();
};
}
}
}"error";
}void timer(object l3)
{lbl = (Label)l3;.Sleep(10000);(lbl.InvokeRequired).Invoke(new
IsVisible((s) => lbl.Visible = s), false);
}
//новый проектvoid
newProjectToolStripMenuItem_Click(object sender, EventArgs e)
{.Text = "";
}
//открытьvoid
openToolStripMenuItem_Click(object sender, EventArgs e)
{(OpenFileDialog OpnFDlg = new
OpenFileDialog())
{
{.Filter = "TLP files(*.TLP)|*.TLP|All
files(*.*)|*.*";.FilterIndex = 1;.InitialDirectory =
"D:";(OpnFDlg.ShowDialog() == DialogResult.OK)
{sr = new StreamReader(OpnFDlg.FileName,
Encoding.Default);str = sr.ReadToEnd();.Close();.Text = str;
}
}(Exception msg)
{.Show(msg.Message);
}
}
}
//сохранитьvoid
saveToolStripMenuItem_Click(object sender, EventArgs e)
{SvFlDlg = new SaveFileDialog();.DefaultExt
= "*.TLP";.Filter = "TLP files(*.TLp)|*.TLP";(SvFlDlg.ShowDialog()
== DialogResult.OK && SvFlDlg.FileName.Length > 0)
{.SaveFile(SvFlDlg.FileName,
RichTextBoxStreamType.PlainText);
}
}
//выходvoid
exitToolStripMenuItem_Click(object sender, EventArgs e)
{();
}
//о программеvoid
helpToolStripMenuItem_Click(object sender, EventArgs e)
{about = new About();.Show();
}
//обработка сочетаний клавишvoid
CodeRichTextBox_KeyDown(object sender, KeyEventArgs e)
{(e.KeyValue == (int)Keys.Control ||
e.KeyValue == (int)Keys.E || e.KeyValue == (int)Keys.J || e.KeyValue ==
(int)Keys.R)
{.Handled = true;
}
}
//обработка сочетаний клавишvoid
AsmRichTextBox_KeyDown(object sender, KeyEventArgs e)
{(e.KeyValue == (int)Keys.Control ||
e.KeyValue == (int)Keys.E || e.KeyValue == (int)Keys.J || e.KeyValue ==
(int)Keys.R || e.KeyValue == (int)Keys.Z)
{.Handled = true;
}(e.KeyValue == (int)Keys.Control ||
e.KeyValue == (int)Keys.A)
{.Handled = true;k =
AsmRichTextBox.Text.Length -
AsmRichTextBox.GetFirstCharIndexOfCurrentLine();.Select(AsmRichTextBox.GetFirstCharIndexOfCurrentLine(),
k);.Refresh();
}(e.KeyValue == (int)Keys.Control ||
e.KeyValue == (int)Keys.Home)
{.Handled = true;
}(e.KeyValue == (int)Keys.Up || e.KeyValue
== (int)Keys.Down)
{.Handled = true;
}(e.KeyValue == (int)Keys.Left)
{(AsmRichTextBox.SelectionStart <= len)
{.Handled = true;
}
}(e.KeyValue == (int)Keys.PageDown ||
e.KeyValue == (int)Keys.PageUp)
{.Handled = true;
}(e.KeyValue == (int)Keys.Back)
{(AsmRichTextBox.SelectionStart <= len)
{.Handled = true;
}
}(e.KeyValue == (int)Keys.Enter)
{(AsmRichTextBox.ReadOnly == false)
{=
AsmRichTextBox.Lines[AsmRichTextBox.GetLineFromCharIndex(AsmRichTextBox.GetFirstCharIndexFromLine(AsmRichTextBox.SelectionStart-1))];=
true;
}= AsmRichTextBox.SelectionStart = AsmRichTextBox.Text.Length+1;
}
}
}
}CustomProfessionalRenderer :
ToolStripProfessionalRenderer
{override void
OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
{r =
Rectangle.Inflate(e.Item.ContentRectangle, 1, 1);(e.Item.Selected)
{(Brush b = new SolidBrush(Color.DarkGray))
{.Graphics.FillRectangle(b, r);
}
}
{(Pen p = new Pen(Color.Black))
{.Graphics.DrawRectangle(p, r);b = new
SolidBrush(Color.Black);.Graphics.FillRectangle(b, r);
}
}
}
}
Исходный код Lexer.cs
using System;System.Collections.Generic;System.Linq;System.Text;System.Threading.Tasks;System.Text.RegularExpressions;KYRS_TLP
{Lexer
{int IdentLength = 11;Code;FindInt =
0;string Error="";int kolError = 0;KeyWords
{string Words;string WordKey;KeyWords(string
a, string b)
{= a;= b;
}
}[] KEYS = { new KeyWords("VAR",
"01"), new KeyWords("INTEGER", "02"),new
KeyWords("BEGIN", "03"),KeyWords("END",
"04"), new KeyWords("READ", "05"),new
KeyWords("WRITE", "06"),KeyWords("CASE",
"07"), new KeyWords("OF", "08"),new
KeyWords("END_CASE", "09") };[] CHARS = { new
KeyWords(":", "10"), new KeyWords(";",
"11"), new KeyWords("=",
"12"),KeyWords("+", "13"), new
KeyWords("-", "14"), new KeyWords("/", "15"),KeyWords("(",
"16"), new KeyWords(")", "17"), new
KeyWords(",", "18") };
/*
Недопустимый символ 91
Слишком длинное имя переменной 92
Повторное объявление переменной 93
Необъявленная переменная 94
Неверное имя переменной 95
*/
//регулярное выражениеrgz =
@"(?<char>[^:;\(\)\=\+\-\/\s\,]*)(?<separator>[:;\(\)\=\+\-\/\s\,]{1})?";
//список полученных токенов, идентификаторов,
константStack<string> TOKENS = new Stack<string>();
public List<string> IDENTIFIES = new
List<string>();List<string> CONSTANTS = new
List<string>();Lexer()
{.Error = "Lexer error.\n";
}Lexer(string Code)
{.Code = Code;pattern = "(
)+";replacement = " ";(this.Code.Length == 0)
{.Error += "Error: No entry.\n";
}
{
//удаление лишних пробелов, перевод в вверхний регистр
Regex rgx = new Regex(pattern);.Code =
rgx.Replace(this.Code, replacement);.Code = this.Code.ToUpper();
}();
}void LexerOut()
{match = Regex.Match(this.Code,
this.rgz);(match.Success)
{(match.Groups["char"].Length >
0)(!IsKeyword(match.Groups["char"].ToString(),
KEYS))(!IsIdenOrConst(match.Groups["char"].ToString(),
"[^0-9]+", "21", CONSTANTS,
int.MaxValue.ToString().Length))
{.Add(match.Groups["char"].ToString());(match.Groups["char"].ToString());
}((match.Groups["separator"].ToString()
!= " ") && (match.Groups["separator"].ToString() !=
"\n"))(match.Groups["separator"].ToString(), CHARS);=
match.NextMatch();
}
}bool IsKeyword(string word, KeyWords[] kwd)
{TOF = false;(int i=0; i< kwd.Count();
i++)
{(kwd[i].Words == word)
{.Push(kwd[i].WordKey);= true;(word ==
"BEGIN")= IDENTIFIES.Count;;
}
}TOF;
}bool IsIdenOrConst(string word, string
regular, string ID, List<string> lst, int len)
{TOF = true;(Regex.Match(word,
regular).Success)= false;
{.Push(ID);.Add(word);
}TOF;
}void AddError(string word)
{kol = 0;(int i = 0; i < 5; i++)
{(i)
{0: { if (Regex.Match(word,
@"[^A-Z0-9:;\(\)\=\+\-\/\s\,]").Success) { kol++;
TOKENS.Push("91"); } break; }1: { if (word.Length > IdentLength) {
kol++; TOKENS.Push("92"); } break; }2: { int k2 = 0; if (FindInt ==
0) for (int j = 0; j < IDENTIFIES.Count; j++) if (word == IDENTIFIES[j])
k2++; if (k2 > 1) { kol++; TOKENS.Push("93"); } break; }3: { int
k2 = 1; if (FindInt != 0) { k2 = 0; for (int j = 0; j < FindInt; j++) if
(word == IDENTIFIES[j]) k2++; } if (k2 == 0) { kol++;
TOKENS.Push("94"); } break; }4: { if (Regex.Match(word,
"[^A-Z]").Success) { kol++; TOKENS.Push("95"); } break; }
}
}(kol == 0).Push("20");
}
}
}
Исходный код Parser.cs
using
System;System.Collections.Generic;System.Linq;System.Text;System.Threading.Tasks;KYRS_TLP
{Parser
{Stack<string> Tokens = new
Stack<string>();Stack<string> TokensStack = new
Stack<string>();Stack<string> StatesStack = new
Stack<string>();string DebugMsg = "";Stack<string>
TokensShell = new Stack<string>();Parser(Stack<string> Tokens)
{.Tokens = Tokens;();
}
//создаем список состояний[,] States = { {
"04", "53", "03", "11", "02",
"10", "51", "00" },
{ "54", "11",
"17", "51", "16", "00", "00",
"00" },
{ "54", "11",
"09", "56", "08", "58", "00",
"00" },
{ "54", "11",
"58", "12", "00", "00", "00",
"00" },
{ "11", "58",
"12", "00", "00", "00", "00",
"00" },
{ "57", "55",
"10", "00", "00", "00", "00",
"00" },
{ "60", "17",
"58", "00", "00", "00", "00",
"00" } };
//записываем лексемы в стекvoid ToStack()
{.Push("$");.Push("$");(Tokens.Count
!= 0)
{.Push(Tokens.Peek());.Push(Tokens.Pop());
}
}
//парсерint Parsing()
{();.Push("$");.Push("50");((StatesStack.Count
!= 0) || (TokensStack.Count != 0))
{(StatesStack.Pop())
{"50":
{ (TokensStack.Pop())
{"01": { int i = 0; while
(States[0, i] != "00") StatesStack.Push(States[0, i++]); break; }: {
DebugMsg = "error: expected \"VAR\""; return 0; }
};
}"51":
{ (TokensStack.Pop())
{"20": {
StatesStack.Push("52"); break; }"91": { DebugMsg =
"error: invalid code"; return 0; }"92": { DebugMsg =
"error: long variable name"; return 0; }"93": { DebugMsg =
"error: re variable declaration"; return 0; }"94": {
DebugMsg = "error: undeclared variable"; return 0; }"95": {
DebugMsg = "error: incorrect variable name"; return 0; }: { DebugMsg
= "error: expected variable"; return 0; }
};
}"52":
{ (TokensStack.Pop())
{"18": {
StatesStack.Push("51"); break; }"10": { StatesStack.Pop();
break; }"17": { StatesStack.Pop(); break; }: { DebugMsg =
"error: Syntax error"; return 0; }
};
}"53":
{ (TokensStack.Pop())
{"05": { int i = 0; while
(States[1, i] != "00") StatesStack.Push(States[1, i++]); break;
}"06": { int i = 0; while (States[1, i] != "00")
StatesStack.Push(States[1, i++]); break; }"07": { int i = 0; while
(States[2, i] != "00") StatesStack.Push(States[2, i++]); break;
}"20": { int i = 0; while (States[3, i] != "00")
StatesStack.Push(States[3, i++]); break; }"91": { DebugMsg =
"error: invalid code"; return 0; }"92": { DebugMsg =
"error: long variable name"; return 0; }"93": { DebugMsg =
"error: re variable declaration"; return 0; }"94": {
DebugMsg = "error: undeclared variable"; return 0; }"95": {
DebugMsg = "error: incorrect variable name"; return 0; }: { DebugMsg
= "error: Syntax error"; return 0; }
};
}"54":
{ (TokensStack.Peek())
{"05": {
StatesStack.Push("53"); break; }"06": {
StatesStack.Push("53"); break; }"07": {
StatesStack.Push("53"); break; }"20": {
StatesStack.Push("53"); break; }"04": { StatesStack.Pop();
TokensStack.Pop(); break; }"91": { DebugMsg = "error: invalid
code"; return 0; }"92": { DebugMsg = "error: long variable
name"; return 0; }"93": { DebugMsg = "error: re variable
declaration"; return 0; }"94": { DebugMsg = "error:
undeclared variable"; return 0; }"95": { DebugMsg = "error:
incorrect variable name"; return 0; }: { DebugMsg = "error: Syntax
error"; return 0; }
};
}"55":
{ (TokensStack.Pop())
{"20": { int i = 0; while
(States[4, i] != "00") StatesStack.Push(States[4, i++]); break;
}"91": { DebugMsg = "error: invalid code"; return 0;
}"92": { DebugMsg = "error: long variable name"; return 0;
}"93": { DebugMsg = "error: re variable declaration";
return 0; }"94": { DebugMsg = "error: undeclared variable";
return 0; }"95": { DebugMsg = "error: incorrect variable
name"; return 0; }: { DebugMsg = "error: Syntax error"; return
0; }
};
}"56":
{ (TokensStack.Pop())
{"21": { int i = 0; while
(States[5, i] != "00") StatesStack.Push(States[5, i++]); break; }: {
DebugMsg = "error: Syntax error"; return 0; }
};
}"57":
{ (TokensStack.Peek())
{"21": {
StatesStack.Push("56"); break; }"09": { TokensStack.Pop();
break; }: { DebugMsg = "error: Syntax error"; return 0; }
};
}"58":
{ (TokensStack.Peek())
{"14": { TokensStack.Pop(); StatesStack.Push("59");
break; }"16": { StatesStack.Push("59"); break;
}"20": { StatesStack.Push("59"); break; }"21": {
StatesStack.Push("59"); break; }"91": { DebugMsg = "error:
invalid code"; return 0; }"92": { DebugMsg = "error: long
variable name"; return 0; }"93": { DebugMsg = "error: re
variable declaration"; return 0; }"94": { DebugMsg =
"error: undeclared variable"; return 0; }"95": { DebugMsg =
"error: incorrect variable name"; return 0; }: { DebugMsg =
"error: incorrect expression"; return 0; }
};
}
"59":
{ (TokensStack.Pop())
{"16": { int i = 0; while
(States[6, i] != "00") StatesStack.Push(States[6, i++]); break;
}"20": { StatesStack.Push("60"); break; }"21": {
StatesStack.Push("60"); break; }"91": { DebugMsg =
"error: invalid code"; return 0; }"92": { DebugMsg =
"error: long variable name"; return 0; }"93": { DebugMsg =
"error: re variable declaration"; return 0; }"94": {
DebugMsg = "error: undeclared variable"; return 0; }"95": {
DebugMsg = "error: incorrect variable name"; return 0; }: { DebugMsg
= "error: Syntax error"; return 0; }
};
}"60":
{ (TokensStack.Pop())
{"13": {
StatesStack.Push("59"); break; }"14": {
StatesStack.Push("59"); break; }"15": {
StatesStack.Push("59"); break; }"08": { StatesStack.Pop();
break; }"11": { StatesStack.Pop(); break; }"17": {
StatesStack.Pop(); break; }: { DebugMsg = "error: Syntax error";
return 0; }
};
}"02":
{(TokensStack.Pop())
{"02": { break; }: { DebugMsg =
"error: expected \"integer\""; return 0; }
};
}"03":
{(TokensStack.Pop())
{"03": { break; }: { DebugMsg =
"error: expected \"begin\""; return 0; }
};
}"11":
{(TokensStack.Pop())
{"11": { break; }: { DebugMsg =
"error: expected \";\""; return 0; }
};
}"12":
{(TokensStack.Pop())
{"12": { break; }: { DebugMsg =
"error: expected \"=\""; return 0; }
};
}"10":
{(TokensStack.Pop())
{"10": { break; }: { DebugMsg =
"error: expected \":\""; return 0; }
};
}"16":
{(TokensStack.Pop())
{"16": { break; }: { DebugMsg =
"error: expected \"(\""; return 0; }
};
}"17":
{(TokensStack.Pop())
{"17": { break; }: { DebugMsg =
"error: expected \")\""; return 0; }
};
}"$":
{(TokensStack.Pop())
{"$": { break; }: { DebugMsg =
"error: incorrect completion"; return 0; }
};
}: { break; }
}
}= "debug successful";0;
}
}
}
Исходный код Shell.cs
System;System.Collections.Generic;System.Linq;System.Text;System.Threading.Tasks;KYRS_TLP
{Shell
{List<string> IDENTIFIES = new
List<string>();List<string> CONSTANTS = new
List<string>();Stack<string> TokensStack = new
Stack<string>();int CounterIdentifies = 0;int CounterConstants = 0;List<Stack<string>>
OUT = new List<Stack<string>>();string OutAdd =
"";string[] priority = { "14", "13",
"15" };Shell(Stack<string> TOKENS, List<string>
IDENTIFIES, List<string> CONSTANTS)
{.TokensStack = TOKENS;.IDENTIFIES =
IDENTIFIES;.CONSTANTS = CONSTANTS;();
}void FindOperations()
{(TokensStack.Peek() != "03")
{(TokensStack.Pop() == "20")
{++;
}
}(TokensStack.Count != 0)
{(TokensStack.Peek())
{"05":
{<string> s1 = new
Stack<string>();<string> s2 = new
Stack<string>();.Push(TokensStack.Pop());(TokensStack.Peek() !=
"11")
{(TokensStack.Pop() == "20")
{.Push(IDENTIFIES[CounterIdentifies++]);
}
}(s1.Count != 0).Push(s1.Pop());.Add(s2);;
}"06":
{<string> s1 = new
Stack<string>();<string> s2 = new
Stack<string>();.Push(TokensStack.Pop());(TokensStack.Peek() !=
"11")
{(TokensStack.Pop() == "20")
{.Push(IDENTIFIES[CounterIdentifies++]);
}
}(s1.Count != 0).Push(s1.Pop());.Add(s2);;
}"07":
{<string> s1 = new
Stack<string>();<string> s2 = new
Stack<string>();.Push(TokensStack.Pop());= Equal("08");(s2.Count
!= 0).Push(s2.Pop());(TokensStack.Pop() != "09")
{(TokensStack.Peek() ==
"09");.Push(CONSTANTS[CounterConstants++]);(int i = 0; i < 4;
TokensStack.Pop(), i++);.Push(IDENTIFIES[CounterIdentifies++]);=
Equal("11");(s2.Count != 0).Push(s2.Pop());
}(s1.Count != 0).Push(s1.Pop());.Add(s2);;
}"12":
{<string> s1 = new
Stack<string>();<string> s2 = new
Stack<string>();.Push(IDENTIFIES[CounterIdentifies++]);.Pop();=
Equal("11");(s2.Count != 0).Push(s2.Pop());(s1.Count !=
0).Push(s1.Pop());.Add(s2);;
}:
{.Pop();;
}
}
}
}Stack<string> Equal(string end)
{<string> s1 = new
Stack<string>();<string> s2 = new
Stack<string>();.Push("$");<string> operations = new
Stack<string>();.Push("00");(TokensStack.Peek() != end)
{(TokensStack.Peek())
{"20": { s1.Push(IDENTIFIES[CounterIdentifies++]);
TokensStack.Pop(); break; }"21": {
s1.Push(CONSTANTS[CounterConstants++]); TokensStack.Pop(); break; }
default:
{
//для унарного минуса
//если стек пуст и мы считываем минус
if(s1.Peek() == "$" &&
TokensStack.Peek() == "14").Push("0");(operations.Peek() ==
"16" && TokensStack.Peek() ==
"14").Push("0");(operations.Peek() == "16" ||
operations.Peek() == "00")
{.Push(TokensStack.Pop());;
}(TokensStack.Peek() == "16")
{.Push(TokensStack.Pop());;
}(TokensStack.Peek() == "17")
{(operations.Peek() != "16")
{.Push(BinOp(operations.Pop()));
}.Pop();.Pop();;
}(Convert.ToInt32(TokensStack.Peek()) >
Convert.ToInt32(operations.Peek()))
{.Push(TokensStack.Pop());
}
{(Convert.ToInt32(TokensStack.Peek()) >
Convert.ToInt32(operations.Peek()) || operations.Peek() != "16")
{(operations.Peek() ==
"00");.Push(BinOp(operations.Pop()));
}
};
}
}
}(operations.Peek() !=
"00").Push(BinOp(operations.Pop()));.Push("$");(s1.Count !=
0).Push(s1.Pop());s2;
}string BinOp(string str)
{(str == "13")"+";(str ==
"14")"-";"/";
}
}
}
Исходный код About.cs
using
System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Threading.Tasks;System.Windows.Forms;KYRS_TLP
{partial class About : Form
{About()
{();
}void LabelClose_Click(object sender,
EventArgs e)
{();
}Int32 tmpX;Int32 tmpY;bool flMove =
false;void About_MouseDown(object sender, MouseEventArgs e)
{(e.Button == MouseButtons.Left &&
e.Y <= 21)
{= Cursor.Position.X;= Cursor.Position.Y;=
true;
}
}void About_MouseMove(object sender,
MouseEventArgs e)
{(flMove)
{.Left = this.Left + (Cursor.Position.X -
tmpX);.Top = this.Top + (Cursor.Position.Y - tmpY);= Cursor.Position.X;=
Cursor.Position.Y;
}
}void About_MouseUp(object sender,
MouseEventArgs e)
{= false;
}void LabelClose_MouseHover(object sender,
EventArgs e)
{.ForeColor = Color.LightGray;
}void LabelClose_MouseLeave(object sender,
EventArgs e)
{.ForeColor = Color.White; } }}
Приложение Б
Рис3. Вывод сообщения об ошибки
Рис4. Вывод сообщения об ошибки
Рис5. Вывод сообщения об ошибки
Рис6. Вывод сообщения об ошибки
Рис7. Рабочая программа ввод(a = a, b = 2) вывод (a = 4,
b = 2)