Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебное пособие 800564

.pdf
Скачиваний:
3
Добавлен:
01.05.2022
Размер:
5.57 Mб
Скачать

openFileDialog1.Filter = "txt files (*.txt)|*.txt|cs files (*.cs)|*.cs|All files (*.*)|*.*";

if (openFileDialog1.ShowDialog() == DialogResult.OK) { s = openFileDialog1.FileName;}

else

{

return;

}

try

{

//открытие потока для считывания файла

FS = File. Open(s, FileMode.Open, FileAccess.Read); StreamReader reader = new StreamReader(FS);

//всё содержимое файла записывается в переменную

str

string str = reader.ReadToEnd(); richTextBox1.Text = str;

//разбиваем текст по переходу на новую строку string[] fields = str.Split('\n');

reader.Close();

}

catch (Exception ex)

{

MessageBox.Show("Невозможно открыть файл");

}

finally

{

FS.Close();

}

}

//обработка нажатия кнопки "проанализировать" private void button2_Click(object sender, EventArgs e)

221

{

//обнуление значений номеров лексем al2count=0;

spec = false; number = 0; number_i = 0;

number_pr = 0; number_ao = 0;

number_sk = 0; number_kn = 0; number_vsfunk = 0;

int i_m = 0;

find = true;

string text = richTextBox1.Text;

//делим загруженный текст на части, разделенные символами ';', '{', '('

str = text.Split(';', '{', '(');

//и анализируем каждую полученную строку for (int i = 0; i < str.Length; i++)

{

//разбиваем строку на слова разделенные пробелом string[] leks = str[i].Split(' ');

//анализируем каждое слово for (int j = 0; j < leks.Length; j++)

{

if (find == true)

{

//ищем идентификаторы по ключевым словам //если найдено слово "void" то идентификатор -

процедура

if (leks[j] == "void")

{

222

element el = new element(); el.F = "процедура"; el.Type = leks[j];

//если это не функция, тогда получаем имя

процедуры

if (leks[j + 1] != "(") el.Name = leks[j + 1];

//и добавляем полученный элемент в массив идентификаторов

al.Add(el); break;

}

//аналогично выполняем проверку для остальных слов

строки

//и определяем их тип для занесения в таблицу идентификаторов

if (leks[j] == "ArrayList")

{

element el = new element(); el.F = "массив";

el.Type = "object";

//если это не функция, тогда получаем имя

процедуры

if (leks[j + 1] != "(") el.Name = leks[j + 1];

//и добавляем полученный элемент в массив идентификаторов

al.Add(el); break;

}

//тип - конструктор

if (leks[j] == "public")

{

223

element el = new element();

el.F = "конструктор"; el.Type = leks[j];

if (leks[j + 1] != "(") el.Name = leks[j + 1];

al.Add(el); break;

}

//константа

if (leks[j] == "const")

{

element el = new element(); el.F = "константа"; el.Type = leks[j + 1];

if (leks[j + 2] != "[") el.Name = leks[j + 2];

// richTextBox2.Text += el.ToString(); al.Add(el);

break;

}

//переменная, массив или функция for (int k = 0; k < keyword.Length; k++)

{

if (leks[j] == keyword[k])

{

element el = new element();

if (leks[j + 1] != "[]" && leks[j + 1] != "(")

{

el.F = "переменная"; el.Name = leks[j + 1];

mas[i_m] = el;

224

i_m++;

}

if (leks[j + 1] == "[]")

{

el.F = "массив"; el.Name = leks[j + 2];

mas[i_m] = el; i_m++;

}

el.Type = leks[j];

if (j + 2 < leks.Length)

{

if (leks[j + 2] == "(") el.F = "функция";

mas[i_m] = el; i_m++;

find = false;

}

al.Add(el); break;

}

}

}

}

find = true;

}

//проверяем полученный массив на наличие повторных записей одной и той же переменной

for (int k = 0; k < al.Count; k++)

225

{

for (int k2 = k + 1; k2 < al.Count; k2++)

{

//если имя и тип двух элементов массива

совпадают

if (((element)al[k]).Name == ((element)al[k2]).Name && ((element)al[k]).Type == ((element)al[k2]).Type)

{

//удаляем второй элемент из массива al.Remove(al[k2]);

}

}

}

text = richTextBox1.Text;

//делим текст на части, разделенные символом ; str = text.Split(';');

for (int i = 0; i < str.Length; i++)

{

//делим полученные строки на слова string[] leks = str[i].Split(' ','\n');

//проверяем каждое слово и заносим в таблицу лексем for (int j = 0; j < leks.Length; j++)

{

spec = false;

//слово является ключевым //проверка происходит при поэлементном сравнении с массивом ключевых слов

for (int k = 0; k < keyword_all.Length; k++)

{

if (leks[j] == keyword_all[k])

{

//если текущее слово совпало с ключевым

226

fl = false; spec = true;

//создаем новую лексему leksem lk = new leksem(); //записываем её

lk.Leks = leks[j]; //тип

lk.Type = "ключевое слово"; //и её значение

//проверив при этом, было ли уже это значение использовано //если да, то значение оставляем неизменным

for (int k2 = 0; k2 < al2count; k2++)

{

if (lk.Leks == al2[k2].Leks && lk.Type == al2[k2].Type)

{

lk.Zn = al2[k2].Zn; fl = true;

break;

}

}

//если такой лексемы ещё не было, //то присваиваем ей новое значение if (fl == false)

{

lk.Zn = "X" + (number + 1).ToString(); number++;

al2[al2count] = lk; al2count++;

}

//заносим лексему в таблицу на форме dataGridView1.Rows.Add(lk.Leks, lk.Type, lk.Zn); break;

}

227

}

//аналогичная проверка выполняется для каждого массива //с ключевыми словами, операциями, методами //также записывается лексема, её тип и значение

//вместе с проверкой на то было ли оно уже использовано или нет

for (int k = 0; k < keyword.Length; k++)

{

if (leks[j] == keyword[k])

{

fl = false; spec = true;

leksem lk = new leksem(); lk.Leks = leks[j];

lk.Type = "ключевое слово";

for (int k2 = 0; k2 < al2count; k2++)

{

if (lk.Leks == al2[k2].Leks && lk.Type == al2[k2].Type)

{

lk.Zn = al2[k2].Zn; fl = true;

break;

}

}

if (fl == false)

{

lk.Zn = "X" + (number + 1).ToString(); number++;

al2[al2count] = lk; al2count++;

}

dataGridView1.Rows.Add(lk.Leks, lk.Type, lk.Zn);

228

break;

}

}

for (int k = 0; k < al.Count; k++)

{

if (al[k] != null)

{

if (leks[j] == ((element)al[k]).Name)

{

fl = false; spec = true;

leksem lk = new leksem(); lk.Leks = ((element)al[k]).Name; lk.Type = "иднтификатор";

for (int k2 = 0; k2 < al2count; k2++)

{

if (lk.Leks == al2[k2].Leks && lk.Type ==

al2[k2].Type)

{

lk.Zn = al2[k2].Zn; fl = true;

break;

}

}

if (fl == false)

{

lk.Zn = lk.Leks + ":" + (number_i +

1).ToString();

number_i++; al2[al2count] = lk; al2count++;

}

229

dataGridView1.Rows.Add(lk.Leks, lk.Type, lk.Zn); break;

}

}

}

for (int k = 0; k < arifm_op.Length; k++)

{

if (leks[j] == arifm_op[k])

{

fl = false; spec = true;

leksem lk = new leksem(); lk.Leks = leks[j];

lk.Type = "знак

арифметической перации";

for (int k2 = 0; k2 < al2count; k2++)

{

if (lk.Leks == al2[k2].Leks && lk.Type == al2[k2].Type)

{

lk.Zn = al2[k2].Zn; fl = true;

break;

}

}

if (fl == false)

{

lk.Zn = "A" + (number_ao + 1).ToString(); number_ao++; al2[al2count] = lk; al2count++;

}

230