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

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

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

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

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

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

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

                else

                    z = operatSearch(str, Ch, h);

            }

            else

                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 = 0;

                    }

                }     

            else

            if (Ch=='\'')

            {

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

                if (sconst == 3)

                {

                    sconst = 0;

                }

                else

                {

                    sconst = 1;

                    b=str[z+1];

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

                }

                //вызов обработки символьных констант

            }

            else if(Ch=='\"')

            {

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

                if (sconst == 3)

                {

                    sconst = 0;

                }

                else

                {

                    sconst = 2;

                    //вызов обработки символьных констант

                    b = str[z + 1];

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

                }

            }

            else

            {

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

            }

                this.Refresh();

            return z;

        }

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

        {

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

            string sr; char b;

            sr = Ch.ToString();

            if (sconst == 1)//значит пришла одинарная константа, берем один символ и возвращаемся к обработке кавычек

            {

                //проверка наличия в таблицах, если нет - дописать

                int flag = 0; int g = 0;

                sconst = 3;

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

                {

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

                }

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

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

                else

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

                {

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

                    g = dataSymbolConst.Rows.Count - 2;

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

                }

            }

            if (sconst == 2)//значит пришла строковая константа, берем один символ и возвращаемся к обработке кавычек

            {

                // набираем строку

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

                {

                    b = str[z];

                    if (b != '\"') sr += b;

                    else { z--; break; }

                }

                //проверка наличия в таблицах, если нет - дописать

                int flag = 0; int g = 0; sconst = 3;

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

                {

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

                }

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

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

                else

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

                {

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

                    g = dataSymbolConst.Rows.Count - 2;

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

                }

            }

            if (comment == 1)

            {

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

                {

                    b = str[z];

                    sr += b;

                }

                comment = 0;

                int flag = 0; int g = 0;

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

                {

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

                }

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

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

                else

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

                {

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

                    g = dataSymbolConst.Rows.Count - 2;

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

                }

            }

            if (comment == 2)

            {

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

                { 

                    b = str[z];

                    if ((b == '*') && (str[z + 1] == '/')) { z--; comment = 0; break; }

                    else

                    {

                        sr += b;

                    }

                    comment = 3;

                }

                if (comment == 3)

                {

                    next += sr;

                }

                else

                {

                    next += sr;

                    int flag = 0; int g = 0;

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

                    {

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

                    }

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

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

                    else

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

                    {

                        dataSymbolConst.Rows.Add(next, (dataSymbolConst.Rows.Count - 1).ToString());

                        g = dataSymbolConst.Rows.Count - 2;

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

                    }

                }

            }

            this.Refresh();

            return z;

        }

/// <summary>

/// обработка нажатия кнопки

/// </summary>

        private void button1_Click(object sender, EventArgs e)

        {

            OpenFileDialog OP = new OpenFileDialog();

            OP.FileName = "";

            OP.Filter = "TXT File (*.txt) | *.txt ";

            OP.Title = "Открыть документ";

            if (OP.ShowDialog() != DialogResult.Cancel)

            {

                {

                    try

                    {

                        richTextBox1.LoadFile(OP.FileName, RichTextBoxStreamType.PlainText);

                    }

                    catch (Exception ex)

                    {

                        MessageBox.Show(ex.ToString(), ex.Source);

                    }

                }

            }

            sName = OP.FileName;

            OP.Dispose();

            //загрузка таблиц

            string[] buf = sName.Split('\\');

            sName = buf[0];

            //operation

            StreamReader file = new StreamReader(sName+"\\Operation.txt");

            while ((line = file.ReadLine()) != null)

            {

                string[] split = line.Split('\t');

                //записываем в столбец

                dataOperation.Rows.Add(split[0], split[1]);

            }

            file.Close();

            file.Dispose();

 

            StreamReader file3 = new StreamReader(sName + "\\prioritet.txt");

            while ((line = file3.ReadLine()) != null)

            {

                string[] split = line.Split('\t');

                //записываем в столбец

                dataPrioritet.Rows.Add(split[0], split[1]);

            }

            file3.Close();

            file3.Dispose();

            //words

            StreamReader file1 = new StreamReader(sName+"\\words.txt");

            while ((line = file1.ReadLine()) != null)

            {

                string[] split = line.Split('\t');

                dataWords.Rows.Add(split[0], split[1]);

            }

            file1.Close(); file1.Dispose();

            //separator

            StreamReader file2 = new StreamReader(sName+"\\separator.txt");

            while ((line = file2.ReadLine()) != null)

            {

                string[] split = line.Split('\t');

                dataSplit.Rows.Add(split[0], split[1]);

            }

            file2.Close(); file2.Dispose();

        }

        private void buttonConvert_Click(object sender, EventArgs e)

        {

            richTextBox2.Clear();

            Reader();

        }

        private void buttonSave_Click(object sender, EventArgs e)

        {

            richTextBox2.SaveFile(sName+"\\result.txt", RichTextBoxStreamType.UnicodePlainText);//возможно сменить на юни

 

        }

    }

}


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