Разработка компилятора модельного языка. Отчет. Пояснительная записка гоу огу 230105. 60. 11. 06 O руководитель работы Ишакова Е. Н. " " 2011г. Исполнитель
Скачать 1.59 Mb.
|
Приложение ЕКонтрольный пример Вид рабочего окна программы с текстом программы на модельном языке(Выводит максимальное число) представлен рисунке Е.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 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 { 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 private List private List private List 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); } } } |