Учебный транслятор

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    255,04 Кб
  • Опубликовано:
    2013-08-07
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Учебный транслятор














Пояснительная записка

К курсовой работе по дисциплине

Теория языков программирования и методы трансляции

на тему:

Учебный транслятор


Автор работы:

Ситников М.С.

Реферат

учебный транслятор программа

Пояснительная записка содержит листа, рисунков, таблиц, использованных источников, приложения.

ТРАНСЛЯТОР, КОМПИЛЯТОР, ИНТЕРПРЕТАТОР, МОДУЛЬ ИНТЕРЕТАЦИИ, ПОСТФИКСНАЯ ЗАПИСЬ

Целью курсового проектирования является разработка учебного транслятора с заданного языка.

Разработка проводилась на базовом языке программирования C# в среде объектно-ориентированного программирования Visual Studio 2012.

Разработка проведена с использованием операционной системы Windows 7 на персональном компьютере Acer Aspire 5715z с процессором Intel Pentium Dual-Core T2390.

Осуществлено функциональное тестирование разработанного транслятора, которое показало корректность его работы.

Введение


Перевод программ, написанных на языках программирования, на язык машинных кодов, выполняемых компьютером, осуществляется специальными программами, которые называются трансляторами. По способу работы трансляторы делятся на компиляторы и интерпретаторы. В ходе данной курсовой работы производится разработка компилятора с заданного языка программирования.

Разработка компилятора осуществляется в несколько этапов:

1)   разработка лексического анализатора;

2)   разработка синтаксического анализатора;

3)   разработка модуля интерпретации;

На этапе лексического анализа производится выделение лексем из исходной программы и построение цепочки символов, которая необходима на этапе синтаксического анализа.

На этапе синтаксического анализа происходит анализ синтаксиса исходной программы, выявление ошибок. Для реализации этой задачи производится построение соответствующей грамматики, использование ее для получения необходимых правил и применение этих правил в процессе анализа.

На этапе выполнения модуля интерпретации производится постфиксная запись выражений, которые посылаются на выполнение.

учебный транслятор программа

 

1. Анализ требований


.1 Разработка генератора кода или модуля интерпретации

Данный компонент транслятора, в основном и определяет его форму: компилятор или интерпретатор, поскольку основное различие между компилятором и интерпретатором состоит в том, что интерпретатор, в отличие от компилятора, не порождает объектную программу, которая должна выполняться при необходимости впоследствии, а непосредственно выполняет ее сам.

При разработке генератора кода целесообразно, чтобы на выходе генератора формировалась последовательность команд языка ассемблера с тем, чтобы впоследствии можно было задействовать соответствующее ассемблирование.

При разработке модуля интерпретации в качестве промежуточной формы исходной программы наиболее часто используется постфиксная форма записи, которая позволяет достаточно легко реализовывать процесс выполнения (интерпретации) транслируемой программы.

.2 Постфиксная запись

Постфиксная запись представляет собой такую запись арифметического выражения, в которой сначала записываются операнды, а затем - знак операции. Например, для выражения a + b * c постфиксная запись будет a b c * +. Здесь операндами операции * будут b и c (два ближайших операнда), а операндами операции + будут а и составной операнд b c *. Эта запись удобна тем, что она не требует скобок. Например, для выражения (a + b) * c постфиксная запись будет a b + c *. В этой записи не требуется ставить скобки для того, чтобы изменить порядок вычисления, зависящий от приоритета операций, как в исходном выражении.

Алгоритм перевода в постфиксную запись обрабатывает исходный массив лексем и строит новый массив из тех же лексем, расположенных в другом порядке. Кроме того, необходим еще стек - аналогичный массив, используемый для временного хранения операций.

Для унарного минуса в арифметическом выражении существуют несколько различных способов его записи и идентификации :

1)      унарный минус записывается как бинарная операция, т.е. вместо, например -В записывается 0-В ;

2)      для обозначения унарного минуса используется новый знак, например @;

)        унарный минус может определяться по контексту : он может стоять либо в начале выражения, либо сразу после открывающей скобки, например

х+а(-в+с)/(-d+f)

Основные правила преобразования инфиксной записи выражения в постфиксную заключаются в следующем.

Считанные операнды добавляются к постфиксной записи, операции записываются в стек.

Если операция в вершине стека имеет больший (или равный) приоритет, чем текущая считанная операция, то операция из стека добавляется к постфиксной записи, а текущая операция заносится в стек. В противном случае (при низшем приоритете) происходит только занесение текущей операции в стек.

Считанная открывающая скобка заносится в стек.

После считывания закрывающей скобки все операции до первой открывающей скобки извлекаются из стека и добавляются к постфиксной записи, после чего и открывающая, и закрывающая скобки отбрасываются, т.е. не помещаются ни в постфиксную запись, ни в стек .

После считывания всего выражения, оставшиеся в стеке операции добавляются к постфиксной записи.

Рассмотрим пример преобразования для следующей инфиксной записи:

A+B*C

Шаг

Текущий символ (лексема)

Постфиксная запись

Стек

1.

A

A


2.

+

A

+

3.

B

AB

+

4.

*

AB

*+

5.

C

ABC

*+

6.


ABC*+



Рассмотрим пример преобразования для следующей инфиксной записи:

(A+B)*C

Шаг

Текущий символ (лексема)

Постфиксная запись

Стек


(


(


A

A

(


+

A

+(


 B

AB

+(


)

AB+



*

AB+

*


C

AB+C

*



AB+C*



Рассмотрим пример преобразования для следующей инфиксной записи:

-A*((-B+C)/D-F)

 Шаг

Текущий символ (лексема)

Постфиксная запись

Стек


-


-


A

A

-


*

A-

*


(

A-

(*


(

A-

((*


-

A-

-((*


B

A-B

-((*


+

A-B-

+((*


C

A-B-C

+((*


)

A-B-C+

(*


/

A-B-C+

/(*


D

A-B-C+D

/(*


-

A-B-C+D/

-(*


F

A-B-C+D/F

-(*


)

A-B-C+D/F-

*



A-B-C+D/F-*



Постфиксная запись выражения позволяет производить его вычисление следующим образом.

Если лексема является операндом, то она записывается в стек. Если лексема является операцией, то указанная операция выполняется над последними элементами (последним элементом), записанными в стек, и эти элементы (элемент) заменяются в стеке результатом операции.

2. Анализ предметной области


2.1 Анализ предметной области


Разработать учебный транслятор в форме интерпретатора с языка, определенного соответствующей формальной грамматикой.

Реализовать операторы:

READ<список переменных>,

WRITE<список переменных>,

CASE <Выражение> OF <Список выбора> END_CASE,

Тип переменных - INTEGER.

2.2 Анализ требований


2.2.1 Требования к интерфейсу пользователя

Транслятор должен обладать простым и удобным интерфейсом, который должен включать в себя:

Поле ввода текста программы

·        Поле вывода значений программы

·        Кнопка открытия сохраненной программы

·        Кнопка сохранения текста программы

·        Кнопка выполнения введенной программы

2.2.2 Требования к программным средствам

Назначение: трансляция программы и её выполнение.

Функции: 1. Ввод текста программы

. Лексический анализ программы

. Синтаксический анализ программы

. Выдача сообщений об ошибках

. Вывод результатов выполнения программы

Технические средства: IBM PC

Операционная система: Windows 7

Среда программирования: Microsoft Visual Studio 2012

Язык программирования: C#.

3. Проектирование

 

.1 Проектирование интерфейса пользователя


При запуске программы на экране появляется окно, представленное на рис 1.

Сообщение об ошибках выводится в нижней левой части главного окна программы. При нажатии на кнопку «Run» выполняются лексически анализ, синтаксический анализ, составляется постфиксная запись выражений, при отсутствии ошибок, запускается выполнение программы.





Поле ввода                                                                                                                                                       поле программы                                                                                                                                                                        вывода


Рис1. Интерфейс программы

Кнопка «New Project» очищает окно ввода кода

Кнопка «Open» открывает диалоговое окно открытия программы

Кнопка «Save» открывает диалоговое окно сохранения программы

Кнопка «Exit» выход из программы

Кнопка «Run» запускает выполнение программы

Кнопка «About» открывает окно о программе.(рис 2.)

Рис. 2 Интерфейс окна о программе

3.2 Проектирование модуля интерпретации


На начальном этапе реализации константы (CONSTANTS) и переменные (IDENTIFIES) кладутся в формируемую запись в порядке их появления в исходном массиве.

s1.Push(CONSTANTS[CounterConstants++]);.Push(IDENTIFIES[CounterIdentifies++]);

При появлении операции в исходном массиве:

a.       если в стеке нет операций или верхним элементом стека является открывающая скобка, операции кладётся в стек

if (operations.Peek() == "16" || operations.Peek() == "00")

{.Push(TokensStack.Pop());;

}(TokensStack.Peek() == "16") // (

{.Push(TokensStack.Pop());

break;

}

b.      если новая операция имеет больший приоритет, чем верхняя операции в стеке, то новая операции кладётся в стек

if (Convert.ToInt32(TokensStack.Peek()) > Convert.ToInt32(operations.Peek()))

{.Push(TokensStack.Pop());

}

c.       если новая операция имеет меньший или равный приоритет, чем верхняя операции в стеке, то операции, находящиеся в стеке, до ближайшей открывающей скобки или до операции с приоритетом меньшим, чем у новой операции, перекладываются в формируемую запись, а новая операции кладётся в стек

while (Convert.ToInt32(TokensStack.Peek()) > Convert.ToInt32(operations.Peek()) || operations.Peek() != "16")

{(operations.Peek() == "00");.Push(BinOp(operations.Pop()));

}

Открывающая скобка кладётся в стек.

(operations.Peek() == "16" || operations.Peek() == "00")

{.Push(TokensStack.Pop());;

}

Закрывающая скобка выталкивает из стека в формируемую запись все операции до ближайшей открывающей скобки, открывающая скобка удаляется из стека

if (TokensStack.Peek() == "17") // ) => +/- to stack

{(operations.Peek() != "16")

{.Push(BinOp(operations.Pop()));

}.Pop();.Pop();;

}

После того, как мы добрались до конца исходного выражения, операции, оставшиеся в стеке, перекладываются в формируемое выражение.

while (operations.Peek() != "00").Push(BinOp(operations.Pop()));

Краткая спецификация модуля интерпретации:

Модуль Shell

Название процедуры: Equal

Назначение процедуры: Реализует постфиксную запись.

Название процедуры: BinOp

Назначение процедуры: переводит число в знак

Название процедуры: FindOperations

Назначение процедуры: проход по коду в поисках функций

4. Реализация

 

.1 Кодирование


Программа была написана на языке программирования C# в среде Microsoft Visual Studio 2012. Исходный текст программы представлен в приложении А.

4.2 Тестирование


Проверка разработанной программы заключалась в её активном использовании с целью выявления ошибок и некорректной работы. В результате этого ошибок обнаружено не было, что позволяет сделать вывод о работоспособности программы. Этапы тестирования представлены в таблице 3. Скриншоты результатов тестирования представлены в приложении Б.

Таблица2 - план тестирования

№ теста

Цель теста

Ожидаемый результат

Полученный результат

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)

Похожие работы на - Учебный транслятор

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!