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

Автор работы: Пользователь скрыл имя, 26 Июня 2013 в 01:35, лабораторная работа

Краткое описание

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

Прикрепленные файлы: 1 файл

тяп Отчёт по лабе №1.docx

— 872.27 Кб (Скачать документ)

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

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

 

 

   Запуск программы TyaP_laba1: программа TyaP_laba1 не требует установки всё что нам нужно это найти файл с называнием TyaP_laba1 и расширением exe  в каталоге проекта вот примерный путь   D:\TYAP\TyaP_laba1\TyaP_laba1\bin\Release\TyaP_laba1.ехе при первом запуске программы в корневом каталоге должен создаться файл под именем operation.txt если его нет или он не создался создайте его в ручную.

  Пример рассматриваемого программного кода мы также можем увидеть в D:\11.txt

string s="hello world"; //privetstvie

int i,j=0;

char ch;

double dd=3.12;

void main

i=45;

i=23.001;

i=.0e;

i=i+.1e+4;

for(j=0;j<i;j+1)

{

int h=45;

if(int g<=h) {

        string ff = "arividerchi ";

char ss = 'd';

}

//odnostrochniy

/*mnogostrochniy

kommentariy */

/*ili tak */

}

                                                                        рис1.1


Нажать на кнопку Open File указанной на картинке выше или рис1.1

рис1.2


Заходим в корневой каталог  D:\ и в строке Имя файла пишем 11 и выбираем 11.txt  и нажимаем кнопку открыть.

 

рис1.3


при нажатии кнопки конверт  программа  TyaP_laba1начнёт посимвольно переводить программный код в польскую запись см. рис 1.4

рис1.4


При нажатии на вкладку  Dynamic мы увидим номера присвоенных переменных, служебных слов и констант. Которые мы можем видеть  в левой выделенной части.

 

   Среда разработки:

 Microsoft Visual C++ 2010 Express

   Системные требования:

Процессор Intel Celeron 800 MHz. Оперативная память 128мб. Жёсткий диск 2мб свободного дискового пространства. Клавиатура,  мышь.

 

Программный код  приложения TyaP_laba1

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;

using System.Linq;

namespace TyaP_laba1

{

    public partial class Form1 : Form

    {

        private string sName;

        public Form1()

        {

            InitializeComponent();    

        }

        string line;

 

        char[] abc = {'Q','W','E','R','T','Y','U','I','O','P','A','S','D','F','G','H','J','K','L','Z','X','C','V','B','N','M',

                     'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m','_'};

        char[] zifr = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' };

        char[] splt = {',',';','/','*','\'','\"' };

        char[] operat = { '+', '-', '*', '/', '<', '>', '=', '!', '{', '}', '[', ']', '(', ')' };

        int comment = 0;

        int sconst = 0;

        int tflag = 0;

        string next;

        private void Reader()

        {

            char ss;

            string str;

            bool flag = false;

            for (int i = 0; i <= richTextBox1.Lines.Length - 1; i++)

            {

                //получаем строку

                string text = richTextBox1.Lines[i];

                //обработка строки

                for (int j = 0; j < text.Length; j++)

                {

                    ss = text[j];//символ

                    if (comment == 0) next = "";

                    if (comment == 3) { comment = 2; j = symbolSearch(text, ss, j); }

                    else

                        if (abc.Contains(ss)) j = abcSearch(text, ss, j);//буква, выполняем процедуру

                        else

                            if (zifr.Contains(ss)) j = zifrSearch(text, ss, j); //цифра, выполняем процедуру

                            else if (ss == '.') { j = zifrSearch(text, ss, j); tflag = 1; }

                            else

                                if (splt.Contains(ss)) j = spltSearch(text, ss, j); //входит ли в разделители

                                else if (operat.Contains(ss)) j = operatSearch(text, ss, j);

                    richTextBox2.AppendText(" ");

                }

                 richTextBox2.AppendText(Environment.NewLine); 

            }

        }  

/// <summary>

/// раздел описания функций выборки

/// </summary>

        private int abcSearch(string str, char Ch, int h) //пришла буква определяем это words или identifier

        {

            int z;                                          //для начала полностью узнаем слово, потом проверяем на наличие его в таблице words, затем в таблице identifier если нет ни там ни там, записываем в идентификаторы

            string sr; char b;

            sr = Ch.ToString();

            for (z = h + 1; z < str.Length; z++)

            {

                b = str[z];

                if ((abc.Contains(b)) || (b == '_') || (zifr.Contains(b))) sr += b;

                else { z--; break; }

            }

            int flag = 0;int g=0;

            for (int i = 0; i < (dataWords.Rows.Count)-1; i++)

            {

                if (sr==dataWords.Rows[i].Cells[0].Value.ToString() ) { flag = 1;g=i; break; }

            }

            for (int i = 0; i < (dataIdentifier.Rows.Count)-1; i++)

            {

                if (dataIdentifier.Rows[i].Cells[0].Value.ToString() == sr) { g = i; flag = 2; break; }  

            }

            //смотрим куда входит наше слово

            if (flag == 1)//значит в таблице слов

             richTextBox2.Text += "W" + dataWords.Rows[g].Cells[1].Value.ToString();

            else if (flag == 2)//значит уже есть в переменных

                richTextBox2.Text += "I" + dataIdentifier.Rows[g].Cells[1].Value.ToString();

            else

            //дописываем в identifier

            {

                dataIdentifier.Rows.Add(sr, (dataIdentifier.Rows.Count-1).ToString());

                g=dataIdentifier.Rows.Count-2;

                richTextBox2.Text += "I" + dataIdentifier.Rows[g].Cells[1].Value.ToString();

            }

            this.Refresh();

                return z;//возвращаем положение в строке

        }

        private int zifrSearch(string str, char Ch, int h)

        {

            int z;                                          //для начала полностью узнаем слово, потом проверяем на наличие его в таблице NConst

            string sr; char b; bool eflag = false; bool znak = false;

            sr = Ch.ToString();

            if ((Ch == '.') && (tflag == 0)) tflag = 1;

            for (z = h + 1; z < str.Length; z++)

            {//набираем число

                b = str[z];

                if ((b == '.') && (tflag == 0)) {tflag = 1;sr+=b;}

                else if ((b == '.') && (tflag == 1)) tflag = 1;//здесь вставить обработку ошибки

                else if (zifr.Contains(b)) sr += b;

                else if ((!eflag)&&(tflag == 1) && ((b == 'E') || (b == 'e'))) { sr += b; eflag = true; }

                else if ((((eflag) && ((str[z - 1] == 'E') || (str[z - 1] == 'e')))) && (b == '-')&&(!znak)) { sr += b; znak = true; }

                else if ((((eflag) && ((str[z - 1] == 'E') || (str[z - 1] == 'e')))) && (b == '+') && (!znak)) { sr += b; znak = true; }

                else { z = z - 1; break; }

            }

            //обрабатываем число

            //записать в таблицу, вывести  в текстбокс

            int flag = 0; int g = 0; tflag = 0;

            for (int i = 0; i < (dataNumericConst.Rows.Count) - 1; i++)

            {

                if (dataNumericConst.Rows[i].Cells[0].Value.ToString() == sr) { flag = 1; g = i; break; }

            }

            if (flag == 1)//значит уже есть в переменных

                richTextBox2.Text += "N" + dataNumericConst.Rows[g].Cells[1].Value.ToString();

            else

            //дописываем в identifier

            {

                dataNumericConst.Rows.Add(sr, (dataNumericConst.Rows.Count - 1).ToString());

                g = dataNumericConst.Rows.Count - 2;

                richTextBox2.Text += "N" + dataNumericConst.Rows[g].Cells[1].Value.ToString();

            }

            this.Refresh();

            return z;

        }

        //если пришел  оператор, то обрабаываем

        private int operatSearch(string str, char Ch, int h)

        {

            int z = h;

            string sr; char b;

            sr = Ch.ToString();

            if (Ch == '=') //если, то проверяем следующий символ на наличие двусоставного знака

            {

                z = z + 1; b = str[z];

                if (b == '=')

                {

                    sr += b; int g = 0;

                    for (int i = 0; i < (dataOperation.Rows.Count) - 1; i++)

                    {

                        if (dataOperation.Rows[i].Cells[0].Value.ToString() == sr) { g = i; break; }

                    }

                    richTextBox2.Text += "O" + dataOperation.Rows[g].Cells[1].Value.ToString();

                }

                else

                {

                    int g = 0; z = z - 1;

                    for (int i = 0; i < (dataOperation.Rows.Count) - 1; i++)

                    {

                        if (dataOperation.Rows[i].Cells[0].Value.ToString() == sr) { g = i; break; }

                    }

                    richTextBox2.Text += "O" + dataOperation.Rows[g].Cells[1].Value.ToString();

                }

            }

            else

            if (Ch == '!')

            {

                z = h + 1; b = str[z];

                if(b=='=')

                {

                    sr += b; int g = 0;

                    for (int i = 0; i < (dataOperation.Rows.Count) - 1; i++)

                    {

                        if (dataOperation.Rows[i].Cells[0].Value.ToString() == sr) { g = i; break; }

                    }

                    richTextBox2.Text += "O" + dataOperation.Rows[g].Cells[1].Value.ToString();

                }

                //else - обработка ошибки

            }

            else

            if (Ch == '<') //если, то проверяем следующий символ на наличие двусоставного знака

            {

                z = h + 1; b = str[z];

                if (b == '=')

                {

                    sr += b; int g = 0;

                    for (int i = 0; i < (dataOperation.Rows.Count) - 1; i++)

                    {

                        if (dataOperation.Rows[i].Cells[0].Value.ToString() == sr) { g = i; break; }

                    }

                    richTextBox2.Text += "O" + dataOperation.Rows[g].Cells[1].Value.ToString();

                }

                else

                {

                    int g = 0;

                    for (int i = 0; i < (dataOperation.Rows.Count) - 1; i++)

                    {

                        if (dataOperation.Rows[i].Cells[0].Value.ToString() == sr) { g = i; break; }

                    }

                    richTextBox2.Text += "O" + dataOperation.Rows[g].Cells[1].Value.ToString();

                }

            }

            else

                if (Ch == '>') //если, то проверяем следующий символ на наличие двусоставного знака

                {

                    z = h + 1; b = str[z];

                    if (b == '=')

                    {

                        sr += b; int g = 0;

                        for (int i = 0; i < (dataOperation.Rows.Count) - 1; i++)

                        {

                            if (dataOperation.Rows[i].Cells[0].Value.ToString() == sr) { g = i; break; }

                        }

                        richTextBox2.Text += "O" + dataOperation.Rows[g].Cells[1].Value.ToString();

                    }

                    else

                    {

                        int g = 0;

                        for (int i = 0; i < (dataOperation.Rows.Count) - 1; i++)

                        {

                            if (dataOperation.Rows[i].Cells[0].Value.ToString() == sr) { g = i; break; }

                        }

                        richTextBox2.Text += "O" + dataOperation.Rows[g].Cells[1].Value.ToString();

                    }

                }

                else

                {

                    int g = 0;

                    for (int i = 0; i < (dataOperation.Rows.Count) - 1; i++)

                    {

                        if (dataOperation.Rows[i].Cells[0].Value.ToString() == sr) { g = i; break; }

                    }

                    richTextBox2.Text += "O" + dataOperation.Rows[g].Cells[1].Value.ToString();

                }

                        this.Refresh();

            return z;

        }

        private int spltSearch(string str, char Ch, int h)

        {

            int z;                                          //для начала полностью узнаем слово, потом проверяем на наличие его в таблице Separators

            string sr; char b;

            sr = Ch.ToString();

            //выясняем что за символ пришел

            z = h;

            if (Ch == '/')

            {

                z = h + 1; b = str[z];

                if (b == '*') //знакчит начинается многоуровневый комментарий, можно ввести проверку на окончание его

                {

                    sr += b;

                    int g = 0;

                    for (int i = 0; i < (dataSplit.Rows.Count) - 1; i++)

                    {

                        if (dataSplit.Rows[i].Cells[0].Value.ToString() == sr) { g = i; break; }

                    }

                    richTextBox2.Text += "D" + dataSplit.Rows[g].Cells[1].Value.ToString();

                    comment = 2;

                    b = str[z + 1];

                    // набираем строчный комментарий  до следующего символа */

                    z = symbolSearch(str, b, z+1);       

                }

                else if (b == '/') //значит однострочный комментарий, стоит записать его в символьные константы

                {

                    sr += b; int g = 0;

                    for (int i = 0; i < (dataSplit.Rows.Count) - 1; i++)

                    {

                        if (dataSplit.Rows[i].Cells[0].Value.ToString() == sr) { g = i; break; }

                    }

                    richTextBox2.Text += "D" + dataSplit.Rows[g].Cells[1].Value.ToString();

                    comment = 1;

                    b = str[z + 1];

                    z = symbolSearch(str, b, (z+1));

                }

               

Информация о работе Построение программы лексического анализатора