Главная страница
Навигация по странице:

  • Список ошибок, выводимых программой

  • Текст программы

  • Разработка компилятора модельного языка. Отчет. Пояснительная записка гоу огу 230105. 60. 11. 06 O руководитель работы Ишакова Е. Н. " " 2011г. Исполнитель


    Скачать 1.59 Mb.
    НазваниеПояснительная записка гоу огу 230105. 60. 11. 06 O руководитель работы Ишакова Е. Н. " " 2011г. Исполнитель
    АнкорРазработка компилятора модельного языка
    Дата04.10.2020
    Размер1.59 Mb.
    Формат файлаdoc
    Имя файлаОтчет.doc
    ТипПояснительная записка
    #140979
    страница8 из 8
    1   2   3   4   5   6   7   8

    Приложение Е


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

    Вид рабочего окна программы с текстом программы на модельном языке(Выводит максимальное число) представлен рисунке Е.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
    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 t_one = new List();

    private List t_two = new List();

    private List t_three = new List();

    private List t_four = new 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);

    }

    }

    }

    1   2   3   4   5   6   7   8


    написать администратору сайта