
- •Курсовая работа
- •Содержание
- •Введение
- •1 Постановка задачи
- •2 Формальная модель задачи
- •Цепочка, которая не содержит ни одного символа, называется пустой цепочкой и обозначается .
- •Цепочка , для которой существует выводS*, называется сентенциальной формой или сентенцией в грамматике .
- •Расширение допускает единственное -правило вида s, но в этом случае начальный символ грамматики s не должен встречаться в правых частях правил.
- •2.1 Расширенные Формы Бэкуса – Наура
- •Операции языка:
- •Правила, определяющие идентификатор, букву и цифру:
- •Правило, определяющее оператор программы (пятая цифра варианта).
- •2.2 Формальные грамматики
- •2.3 Диаграммы Вирта
- •3 Спецификация основных процедур и функций
- •3.1 Лексический анализатор
- •3.2 Синтаксический анализатор
- •3.3 Семантический анализатор
- •3.4 Генерации внутреннего представления программы
- •Перевод в полиз операторов. Каждый оператор языка программирования может быть представлен как n-местная операция с семантикой, соответствующей семантике оператора.
- •Составной оператор {s1; s2;...; Sn } в полиЗе записывается как s1 s2... Sn.
- •3.5 Интерпретатор программы
- •4 Структурная организация данных
- •4.1 Спецификация входной информации
- •4.2 Спецификация выходной информации
- •5 Разработка алгоритма решения задачи
- •6 Установка и эксплуатация программного средства
- •7 Работа с программным средством
- •Заключение
- •Список использованных источников
- •Приложение а
- •Приложение б Примеры программ на модельном языке
- •Приложение в Цепочка вывода и дерево разбора
- •Приложение г Примеры таблиц идентификаторов и двуместных операций
- •Приложение д полиз и интерпретация программы
- •Здесь используются следующие обозначения:
- •Приложение е Контрольный пример
- •Приложение ж Список ошибок, выводимых программой
- •Приложение з Текст программы
Приложение е Контрольный пример
Вид рабочего окна программы с текстом программы на модельном языке(Выводит максимальное число) представлен рисунке Е.1.
Рисунок Е.1 – Текст программы на модельном языке
Результаты работы лексического анализатора представлены на рисунке Е.2.
Рисунок Е.2 – Выходные данные лексического анализатора
Результат работы программы представлен на рисунке Е.3.
Рисунок Е.3 – Результат работы программы
Приложение ж Список ошибок, выводимых программой
{ требуется.
;,: или перевод строки ожидается.
Повторное описание переменной
Необъявленная переменная
Несовпадение типов
Ожидалась ")" в операторе
Требуется идентификатор
Ожидалась "(" в операторе
Ожидалось do в конструкции while
Ожидалось выражение
После to должен быть тип integer в конструкции for
Ожидался оператор в конструкции for
Ожидалось do в конструкции for
Ожидалось to в конструкции for
Ожидался оператор присваивания
Ожидалось выражение типа boolean в конструкции if
Ожидался оператор после else в конструкции if
Ожидался оператор после then в конструкции if
Ожидался then после выражения в конструкции if
Ожидалось выражение после if
Ожидался множитель
Ожидалось выражение типа boolean после унарной операции
Не хватает "}" в конце программы
Лексическая ошибка
Приложение з Текст программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace LA
{
public partial class Form1 : Form
{
private StreamWriter Tab3, Tab4,Analyze;
private StreamReader Tab1, Tab2;
private int line;
private bool success;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
richTextBox1.SelectAll();
richTextBox1.SelectionColor = Color.Black;
line = 1;
Tab1 = new StreamReader("Tab1.txt");
Tab2 = new StreamReader("Tab2.txt");
Tab3 = new StreamWriter("Tab3.txt");
Tab4 = new StreamWriter("Tab4.txt");
Analyze = new StreamWriter("Lang.txt");
while (!Tab1.EndOfStream)
{
t_one.Add(Tab1.ReadLine());
}
while (!Tab2.EndOfStream)
{
t_two.Add(Tab2.ReadLine());
}
t_two.Add("\n");
scanner();
//==============================
Analyze.Close();
Tab1.Close();
Tab2.Close();
Tab3.Close();
Tab4.Close();
Analyze.Dispose();
Tab1.Dispose();
Tab2.Dispose();
Tab3.Dispose();
Tab4.Dispose();
t_one.Clear();
t_two.Clear();
t_three.Clear();
t_four.Clear();
//============================
if (!success) return;
ss = new Synth("Lang.txt","Tab3.txt",Mark);
ss.Analyse();
}
private Synth ss;
private string code=string.Empty,buf=string.Empty;
private int ind, cnt;
private char gch()
{
char c;
if (ind < code.Length)
{
c = code[ind];
ind++;
return c;
}
else return Convert.ToChar(0);
}
private void Mark(int l)
{
richTextBox1.SelectAll();
richTextBox1.SelectionColor = Color.Black;
int st=0;
int start = richTextBox1.SelectionStart;
int len = richTextBox1.SelectionLength;
Color c = richTextBox1.SelectionColor;
for (int i=0;i<l-1;i++) st+=richTextBox1.Lines[i].Length+1;
richTextBox1.Select(st, richTextBox1.Lines[l - 1].Length);
richTextBox1.SelectionColor = Color.Red;
// richTextBox1.SelectionStart=start;
richTextBox1.SelectionLength=0;
richTextBox1.SelectionColor=c;
}
private void Get_Ident()
{
char ch=buf[0];
buf = string.Empty;
char[] Id={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','g','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','_','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
do
{
buf += ch;
ch = gch();
}
while(Id.Contains(ch));
if (ch!=0) ind--;
Flush(4);
}
private void Get_Num()
{
char[] hex= {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','A','B','C','D','E','F','h','H'};
char[] all = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F', '.', 'h','H','o','O' };
char[] bin={'0','1','b','B'};
char[] oct={'0','1','2','3','4','5','6','7','o','O'};
char[] dec= {'0','1','2','3','4','5','6','7','8','9','.','e','E','d','D','+','-'};
bool d=true, b=true, o=true, h=true, real=true,exp=true;
char ch=buf[0];
buf = string.Empty;
do
{
buf += ch;
if ((ch == 'e') || (ch == 'E'))
{
ch = gch();
buf += ch;
}
if (!bin.Contains(ch)) b=false;
if (!oct.Contains(ch)) o=false;
if (!hex.Contains(ch)) h=false;
if (!dec.Contains(ch)) {d=false;real=false;exp=false;}
ch=gch();
}while ( all.Contains(ch));
if(ch!=0) ind--;
ch = buf[buf.Length - 1];
if (((ch == 'h') || (ch == 'H')) && (h)) { HexToDec(); Flush(3); return; }
if (((ch == 'o') || (ch == 'O')) && (o)) { OctToDec(); Flush(3); return; }
if (((ch == 'b') || (ch == 'B')) && (b)) { BinToDec(); Flush(3); return; }
if (d)
{
bool point=false,ex=false,norm=true,sign=false;
for (int i=0;i<buf.Length;i++)
{
if (((buf[i] == '+') || (buf[i] == '-')) && ((sign) || (!ex))) { norm = false; break; }
if (buf[i]=='.')
if((!point)&&(!ex)) point=true; else {norm=false;break;}
if ((buf[i]=='e')||(buf[i]=='E'))
if(!ex)
{
ex=true;
i++;
if (((buf[i] == '+') || (buf[i] == '-')) && (!sign) && (ex)) sign = true; else i--;
}
else {norm=false;break;}
}
if (norm)
{
// if ((ch == 'd') || (ch == 'D')) ;
// else { ind--; }
if (ex) DecToDec();
buf= buf.TrimEnd(new char[] { 'd', 'D' });
Flush(3);
}
else MessageBox.Show("Number Synthax Error!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification);
}
else MessageBox.Show("Number Synthax Error!","Error",MessageBoxButtons.OK,MessageBoxIcon.Error,MessageBoxDefaultButton.Button1,MessageBoxOptions.ServiceNotification);
}
private void BinToDec()
{
int c;
int x=0;
for (int i = 0; i < buf.Length-1; i++)
{
c = buf[i];
c -= '0';
x=x << 1;
x += c;
}
buf = x.ToString();
}
private void OctToDec()
{
int c;
int x = 0;
for (int i = 0; i < buf.Length - 1; i++)
{
c = buf[i];
c -= '0';
x = x *8;
x += c;
}
buf = x.ToString();
}
private void HexToDec()
{
int c;
int x = 0;
for (int i = 0; i < buf.Length - 1; i++)
{
c = buf[i];
if ((c >= '0') && (c <= '9'))
c -= '0';
else
if ((c >= 'a') && (c <= 'f'))
c -= 'a'-10;
else
c -= 'A'-10;
x = x * 16;
x += c;
}
buf = x.ToString();
}
private void DecToDec()
{
buf = buf.Replace('.', ',');
buf= buf.TrimEnd(new char[] { 'd', 'D' });
double x;
try
{
x = Convert.ToDouble(buf);
buf = x.ToString();
}
catch
{
MessageBox.Show("Число имеет неверный формат", "Error");
}
}
private List<string> t_one = new List<string>();
private List<string> t_two = new List<string>();
private List<string> t_three = new List<string>();
private List<string> t_four = new List<string>();
private void Flush(int tab)
{
switch (tab)
{
case 2: // Separators
{
//Tab2.WriteLine(buf);
Analyze.WriteLine("2," + t_two.IndexOf(buf)+","+line.ToString());
dataGridView3.Rows.Add(dataGridView3.RowCount.ToString(), "2", t_two.IndexOf(buf));
break;
}
case 3: //Numbers
{
if (!t_three.Contains(buf))
{
t_three.Add(buf);
Tab3.WriteLine(buf);
dataGridView1.Rows.Add(t_three.IndexOf(buf).ToString(), buf.ToString());
}
Analyze.WriteLine("3," + t_three.IndexOf(buf) + "," + line.ToString());
dataGridView3.Rows.Add(dataGridView3.RowCount.ToString(), "3", t_three.IndexOf(buf));
break;
}
case 4: // Identificators +service
{
if (!t_one.Contains(buf))
{
if (!t_four.Contains(buf)) { t_four.Add(buf); Tab4.WriteLine(buf); dataGridView2.Rows.Add(t_four.IndexOf(buf).ToString(), buf.ToString()); }
Analyze.WriteLine("4," + t_four.IndexOf(buf) + "," + line.ToString());
dataGridView3.Rows.Add(dataGridView3.RowCount.ToString(), "4", t_four.IndexOf(buf));
}
else
{
Analyze.WriteLine("1," + t_one.IndexOf(buf) + "," + line.ToString());
dataGridView3.Rows.Add(dataGridView3.RowCount.ToString(), "1", t_one.IndexOf(buf));
}
break;
}
}
//write (file[tab],buf); buf.remove(0);
}
private void scanner()
{
success = false;
code = richTextBox1.Text.Trim();
ind = 0;
cnt = code.Length;
char c;
do
{
c = gch();
switch (c)
{
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
case 'g':
case 'h':
case 'i':
case 'j':
case 'k':
case 'l':
case 'm':
case 'n':
case 'o':
case 'p':
case 'q':
case 'r':
case 's':
case 't':
case 'u':
case 'v':
case 'w':
case 'x':
case 'y':
case 'z':
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
case 'G':
case 'H':
case 'I':
case 'J':
case 'K':
case 'L':
case 'M':
case 'N':
case 'O':
case 'P':
case 'Q':
case 'R':
case 'S':
case 'T':
case 'U':
case 'V':
case 'W':
case 'X':
case 'Y':
case 'Z':
{
buf=string.Empty;
buf =buf+ c;
Get_Ident();
break;
}
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':
{
buf = String.Empty;
buf += c;
Get_Num();
break;
}
case '!':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case '*':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case '(':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case ')':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case '-':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case '+':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case '=':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case ':':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case '{':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case ';':
{
buf = string.Empty;
buf += c;
Flush(2);
break;
}
case ',':
{
buf = string.Empty;
buf += c;
Flush(2);
break;
}
case '}':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case '%':
{
buf = string.Empty;
buf += c;
Flush(2);
break;
}
case '$':
{
buf = string.Empty;
buf += c;
Flush(2);
break;
}
case '/':
{
buf=string.Empty;
buf+=c;
c=gch();
if (c == '*')
{
do
{
while (c != '*')
{
c = gch();
if (c == 0) return;
}
c = gch(); //ind--;
} while (c != '/');
buf = string.Empty;
}
else { ind--; }
if (buf!="")
Flush(2);
break;
}
case '>':
{
buf=string.Empty;
buf += c;
c = gch();
if (c == '=') buf += c;
else { ind--; }
Flush(2);
break;
}
case '<':
{
buf=string.Empty;
buf+=c;
c = gch();
if (c == '>'|| c=='=') buf += c;
else { ind--; }
Flush(2);
break;
}
case '\n':
{
buf = string.Empty;
case '*':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case '(':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case ')':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case '-':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case '+':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case '=':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case ':':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case '{':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case ';':
{
buf = string.Empty;
buf += c;
Flush(2);
break;
}
case ',':
{
buf = string.Empty;
buf += c;
Flush(2);
break;
}
case '}':
{
buf=string.Empty;
buf+=c;
Flush(2);
break;
}
case '%':
{
buf = string.Empty;
buf += c;
Flush(2);
break;
}
case '$':
{
buf = string.Empty;
buf += c;
Flush(2);
break;
}
case '/':
{
buf=string.Empty;
buf+=c;
c=gch();
if (c == '*')
{
do
{
while (c != '*')
{
c = gch();
if (c == 0) return;
}
c = gch(); //ind--;
} while (c != '/');
buf = string.Empty;
}
else { ind--; }
if (buf!="")
Flush(2);
break;
}
case '>':
{
buf=string.Empty;
buf += c;
c = gch();
if (c == '=') buf += c;
else { ind--; }
Flush(2);
break;
}
case '<':
{
buf=string.Empty;
buf+=c;
c = gch();
if (c == '>'|| c=='=') buf += c;
else { ind--; }
Flush(2);
break;
}
case '\n':
{
buf = string.Empty; dataGridView4.Sort(dataGridView4.Columns[1], ListSortDirection.Descending);
dataGridView5.Rows.Add(0,"{");
dataGridView5.Rows.Add(1,",");
dataGridView5.Rows.Add(2,";");
dataGridView5.Rows.Add(4,"(");
dataGridView5.Rows.Add(5,">");
dataGridView5.Rows.Add(6,")");
dataGridView5.Rows.Add(7,"*");
dataGridView5.Rows.Add(8,"-");
dataGridView5.Rows.Add(9,"+");
dataGridView5.Rows.Add(10,"=");
dataGridView5.Rows.Add(11,"}");
dataGridView5.Rows.Add(12,":");
dataGridView5.Rows.Add(13,"<>");
dataGridView5.Rows.Add(18,"<");
dataGridView5.Rows.Add(19,">=");
dataGridView5.Rows.Add(20,"<=");
dataGridView5.Rows.Add(21,"/");
dataGridView5.Rows.Add(22,"%");
dataGridView5.Rows.Add(23,"$");
dataGridView5.Rows.Add(16,"!");
dataGridView5.Rows.Add(24,"\n");
dataGridView5.Columns[1].SortMode = DataGridViewColumnSortMode.Programmatic;
dataGridView5.Sort(dataGridView5.Columns[1], ListSortDirection.Descending);
}
}
}