Автор работы: Пользователь скрыл имя, 26 Июня 2013 в 01:35, лабораторная работа
Построение программы лексического анализатора, корректно распознающего все перечисленные выше лексемы и формирующего таблицы лексем и внутреннее представление проанализированного текста.
Постановка задачи программы: Построение программы лексического анализатора, корректно распознающего все перечисленные выше лексемы и формирующего таблицы лексем и внутреннее представление проанализированного текста.
На вход программы подается файл, содержащий тест на входном языке программирования. Результатом работы программы должен быть файл, содержащий последовательность кодов лексем входной программы, а также один или несколько файлов, содержащие все таблицы лексем.
Запуск программы
TyaP_laba1: программа TyaP_laba1 не требует
установки всё что нам нужно это найти
файл с называнием TyaP_laba1 и расширением
exe в каталоге проекта вот примерный
путь D:\TYAP\TyaP_laba1\TyaP_laba1\
Пример рассматриваемого программного кода мы также можем увидеть в 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 */
}
Нажать на кнопку 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','
'q','w','e','r','t','y','u','
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
richTextBox2.AppendText(" ");
}
richTextBox2.AppendText(
}
}
/// <summary>
/// раздел описания функций
/// </summary>
private int abcSearch(string str, char Ch, int h) //пришла буква определяем это words или identifier
{
int z;
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[
}
for (int i = 0; i < (dataIdentifier.Rows.Count)-1; i++)
{
if (dataIdentifier.Rows[i].Cells[
}
//смотрим куда входит наше слово
if (flag == 1)//значит в таблице слов
richTextBox2.Text += "W" + dataWords.Rows[g].Cells[1].
else if (flag == 2)//значит уже есть в переменных
richTextBox2.Text += "I" + dataIdentifier.Rows[g].Cells[
else
//дописываем в identifier
{
dataIdentifier.Rows.Add(sr, (dataIdentifier.Rows.Count-1).
g=dataIdentifier.Rows.Count-2;
richTextBox2.Text += "I" + dataIdentifier.Rows[g].Cells[
}
this.Refresh();
return z;//возвращаем положение в строке
}
private int zifrSearch(string str, char Ch, int h)
{
int z;
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].
}
if (flag == 1)//значит уже есть в переменных
richTextBox2.Text += "N" + dataNumericConst.Rows[g].
else
//дописываем в identifier
{
dataNumericConst.Rows.Add(sr, (dataNumericConst.Rows.Count - 1).ToString());
g = dataNumericConst.Rows.Count - 2;
richTextBox2.Text += "N" + dataNumericConst.Rows[g].
}
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[
}
richTextBox2.Text += "O" + dataOperation.Rows[g].Cells[1]
}
else
{
int g = 0; z = z - 1;
for (int i = 0; i < (dataOperation.Rows.Count) - 1; i++)
{
if (dataOperation.Rows[i].Cells[
}
richTextBox2.Text += "O" + dataOperation.Rows[g].Cells[1]
}
}
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[
}
richTextBox2.Text += "O" + dataOperation.Rows[g].Cells[1]
}
//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[
}
richTextBox2.Text += "O" + dataOperation.Rows[g].Cells[1]
}
else
{
int g = 0;
for (int i = 0; i < (dataOperation.Rows.Count) - 1; i++)
{
if (dataOperation.Rows[i].Cells[
}
richTextBox2.Text += "O" + dataOperation.Rows[g].Cells[1]
}
}
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[
}
richTextBox2.Text += "O" + dataOperation.Rows[g].Cells[1]
}
else
{
int g = 0;
for (int i = 0; i < (dataOperation.Rows.Count) - 1; i++)
{
if (dataOperation.Rows[i].Cells[
}
richTextBox2.Text += "O" + dataOperation.Rows[g].Cells[1]
}
}
else
{
int g = 0;
for (int i = 0; i < (dataOperation.Rows.Count) - 1; i++)
{
if (dataOperation.Rows[i].Cells[
}
richTextBox2.Text += "O" + dataOperation.Rows[g].Cells[1]
}
this.Refresh();
return z;
}
private int spltSearch(string str, char Ch, int h)
{
int z;
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].
}
richTextBox2.Text += "D" + dataSplit.Rows[g].Cells[1].
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].
}
richTextBox2.Text += "D" + dataSplit.Rows[g].Cells[1].
comment = 1;
b = str[z + 1];
z = symbolSearch(str, b, (z+1));
}
Информация о работе Построение программы лексического анализатора