Скачиваний:
203
Добавлен:
27.01.2015
Размер:
1.66 Mб
Скачать

Приложение е Контрольный пример

Вид рабочего окна программы с текстом программы на модельном языке(Выводит максимальное число) представлен рисунке Е.1.

Рисунок Е.1 – Текст программы на модельном языке

Результаты работы лексического анализатора представлены на рисунке Е.2.

Рисунок Е.2 – Выходные данные лексического анализатора

Результат работы программы представлен на рисунке Е.3.

Рисунок Е.3 – Результат работы программы

Приложение ж Список ошибок, выводимых программой

  1. { требуется.

  2. ;,: или перевод строки ожидается.

  3. Повторное описание переменной

  4. Необъявленная переменная

  5. Несовпадение типов

  6. Ожидалась ")" в операторе

  7. Требуется идентификатор

  8. Ожидалась "(" в операторе

  9. Ожидалось do в конструкции while

  10. Ожидалось выражение

  11. После to должен быть тип integer в конструкции for

  12. Ожидался оператор в конструкции for

  13. Ожидалось do в конструкции for

  14. Ожидалось to в конструкции for

  15. Ожидался оператор присваивания

  16. Ожидалось выражение типа boolean в конструкции if

  17. Ожидался оператор после else в конструкции if

  18. Ожидался оператор после then в конструкции if

  19. Ожидался then после выражения в конструкции if

  20. Ожидалось выражение после if

  21. Ожидался множитель

  22. Ожидалось выражение типа boolean после унарной операции

  23. Не хватает "}" в конце программы

  24. Лексическая ошибка

Приложение з Текст программы

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);

}

}

}