Курсовая работа: Конструирование модели лексического и синтаксического анализа

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

lastRow = ops1->RowCount - 2;

ops1->Rows[lastRow]->Cells[0]->Value = ops1->RowCount - 1;

ops1->Rows[lastRow]->Cells[1]->Value = tmp;

ops1->Rows[lastRow]->Cells[2]->Value = tmp;

}

richTextBox3->Text += "(30," + (j + 1).ToString() + ") ";

richTextBox4->Text += tmp;

}

}

private: void ident(int i, int pr) {

if (!err) {

String^ tmp = code->Substring(pr, i - pr);

nlol = true;

//проверка на повторяемость

int j = 0;

for (; j < ident1->RowCount - 1; j++)

if (ident1[1, j]->Value->ToString() == tmp) {

nlol = false;

break;

}

if (nlol) {

ident1->Rows->Add();

lastRow = ident1->RowCount - 2;

ident1->Rows[lastRow]->Cells[0]->Value = ident1->RowCount - 1;

ident1->Rows[lastRow]->Cells[1]->Value = tmp;

ident1->Rows[lastRow]->Cells[2]->Value = "id";

}

richTextBox3->Text += "(40," + (j + 1).ToString() + ") ";

richTextBox4->Text += "id";

if (code->Substring(i, 1) == " ")

richTextBox4->Text += " ";

}

}

//сиволы пунктуации

private: void punctuation(int i) {

//взять символ

if (!err) {

String^ tmp = code->Substring(i, 1);

//проверка на повторяемость

nlol = true;

int j = 0;

for (; j < punctuation1->RowCount - 1; j++)

if (punctuation1[1, j]->Value->ToString() == tmp) {

nlol = false;

break;

}

if (nlol) {

punctuation1->Rows->Add();

lastRow = punctuation1->RowCount - 2;

punctuation1->Rows[lastRow]->Cells[0]->Value = punctuation1->RowCount - 1;

punctuation1->Rows[lastRow]->Cells[1]->Value = tmp;

punctuation1->Rows[lastRow]->Cells[2]->Value = tmp;

}

richTextBox3->Text += "(50," + (j + 1).ToString() + ") ";

richTextBox4->Text += tmp;

}

}

private:void constant(int i, int pr) {

if (!err) {

//для возврата к символу-разделителю

String^ tmp = code->Substring(pr, i - pr);

nlol = true;

//проверка на повторяемость

int j = 0;

for (; j < constant1->RowCount - 1; j++)

if (constant1[1, j]->Value->ToString() == tmp) {

nlol = false;

break;

}

if (nlol) {

constant1->Rows->Add();

lastRow = constant1->RowCount - 2;

constant1->Rows[lastRow]->Cells[0]->Value = constant1->RowCount - 1;

constant1->Rows[lastRow]->Cells[1]->Value = tmp;

constant1->Rows[lastRow]->Cells[2]->Value = "const";

}

richTextBox3->Text += "(60," + (j + 1).ToString() + ") ";

richTextBox4->Text += "const";

}

}

private: int rand_S(int i) {

if (word(code[i]) || digit(code[i])) {

return 200;//цифры и буквы

}

else if (o_perat(code[i]) != 0) {

return 305; //операторы

}

else {

return 401;//пунктуация

}

}

//удаление лишних пробелов, переходов на новую строку, коментариевж

private: void delet_problem() {

richTextBox3->Text = "Дискрипторный код:\n";

richTextBox4->Text = "Псевдо код\n";

richTextBox2->Text = "";

bool cet=false;

code2 = "1";

int i =2,i1=10;

bool ret = false;

code1 = "";

for (int y = 0; y <= code->Length - 1; y++) {

if (code[y] == '/') {

if (code[y + 1] == '/') {

while (code[y] != '\n')

y++;

y++;

}

else if (code[y + 1] == '*') {

while (!(code[y] == '*' && code[y + 1] == '/'))

y++;

y += 2;

}

}

if (ret)

while (code[y] == 9 || code[y] == '\n') {

y++;

}

if(cet)

while (code[y] == 9 || code[y] == 32) {

y++;

}

ret = false;

cet = false;

if (code[y] == '\n')

ret = true;

if (code[y] == 32)

cet = true;

if (code[y] != 9)

{

code1 += code[y];

code2 += code[y];

if (code[y] == '\n') {

if (i < 10)

code2 += "";

if (i < 100)

code2 += " ";

if (i < 1000)

code2 += "";

code2 += i+ "";

i++;

}

}

}

code = code1;

}

private: void programm() {

code = richTextBox1->Text;

delet_problem();

int S = 0, i = 0, pr = 0, stroka = 1, pir;

String^ error;

error = "";

int df = code->Length;

while (i < code->Length ) {

if (i - pr == 32) {

if (err) {

error += "строка-" + stroka + ":" + code->Substring(pr, i - pr) + "\n//переполнение символов в идентификаторе\n\n";

}

else {

String^ esd = "4" + stroka.ToString() + code->Substring(pr, i - pr);

throwesd;

}

}

switch (S) {

//старт

case 0:

if (code[i] == 'c') S = 3;

else if (code[i] == 'b') S = 6;

else if (code[i] == 'e') S = 11;

else if (code[i] == 'i') S = 16;

else if (code[i] == 'f') S = 18;

else if (code[i] == 's') S = 22;

else if (code[i] == 'v') S = 31;

else if (code[i] == 'm') S = 41;

else if (code[i] == 'n') S = 47;

else if (code[i] == 'd') S = 56;

else if (code[i] == 'r') S = 61;

else if (word( code[i])){ S = 200; pr = i; }

else if (digit(code[i])) {

S = 100;

pr = i;

}

else if (punctz(code[i])) { S = 400; }

else if (o_perat(code[i]) != 0) {

S = 300;

}

else if (code[i] == '/') {

o_peratr(i + 1, i);

}

else if (code[i] == '%') {

S = 0;

}

else if (code[i] == '#'|| code[i] == ' ') {

S = 0;

}

else if (code[i] == '\n') {

stroka++;

S = 0;

}

else {

if (err) {

error += "строка-" + stroka + ":" + code->Substring(i, 1) + "\n//неопознанный символ\n\n";

S = 0;

}

else {

String^ esd = "1" + stroka.ToString() + code->Substring(i, 1);

throwesd;

}

}

//пунктуация

break;

case 400:

i--;

punctuation(i);

S = 0;

break;

//проверка ключевых слов

case 1:

if (word(code[i]) || digit(code[i])) {

S = 200;

}

else if (!word(code[i]) && !digit(code[i])) {

keyWord(i, pr);

S = 0;

i--;

}

else if (o_perat(code[i]) != 0) { S = 0; i--; }

break;

//идентификаторы

case 2:

if (word(code[i]) || digit(code[i]))

{

S = 2;

}

else {

ident(i, pr);

i--;

S = 0;

}

break;

case 200:

if (word(code[i]) || digit(code[i]))

{

S = 200;

}

else {

ident(i, pr);

i--;

S = 0;

}

break;

//операторы

case 300:

i--;

pir = 0;

pr = i;

pir = o_perat(code[i]);

if (o_perat(code[i+1]) == 0) {

pir = o_perat1(pir);

if (pir == 1) {

S = 0;

o_peratr(i + 1, i);// /+,-,=,*,&,/

}

if (pir == 2) {

S = 0;

o_peratr_sravn(i + 1, i);// /<,>,!

}

}

else {

S = 301;

}

break;

case 301:

if (o_perat(code[i+1]) == 0) {

pir *= 10;

pir += o_perat(code[i]);

pir = o_perat1(pir);

if (pir == 0)

{

if (err) {

int c = i + 1;

while (o_perat(code[c]) != 0) {

c++;

}

error += "строка-" + stroka + ":" + code->Substring(pr, i-pr+1) + "\n//ошибка чтения оператора\n\n";

S = 200;

i = c;

}

else {

String^ asd = "3" + stroka + " " + code->Substring(pr,i-pr + 1);

throw asd;

}

}

if (pir == 1) {

o_peratr(i + 1, i-1);//305/++,--,+=,-=,*=

S = 0;

}

if (pir == 2) {

o_peratr_sravn(i + 1, i-1);//306 <=,>=,==,!=,||,&&

S = 0;

}

}

else {

S = 302;

}

break;

case 302:

if (o_perat(code[i]) != 0) {

S = 302;

}

else {

if (err) {

error += "строка-" + stroka + ":" + code->Substring(pr, i - pr) + "\n//ошибка чтения оператора\n\n";

S = 200;

}

else {

String^ asd = "3" + stroka + " " + code->Substring(pr, i - pr);

throw asd;

}

}

break;

case 305:

i--;

ident(i, pr);

S = 300;

break;

case 401:

i--;

ident(i, pr);

S = 400;

break;

//(c)char//cout/cin/case

case 3:

pr = i - 1;

if (code[i] == 'h') { S = 4; }

else if (code[i] == 'o') { S = 34; }

else if (code[i] == 'i') { S = 43; }

else if (code[i] == 'a') { S = 69; }

else { S = rand_S(i); }

break;

case 4:

if (code[i] == 'a') { S = 5; }

else { S = rand_S(i); }

break;

case 5:

if (code[i] == 'r') { S = 1; }

else { S = rand_S(i); }

break;

//(b)bool/break

case 6:

pr = i - 1;

if (code[i] == 'o' && code[i + 1] == 'o') { i++; S = 7; }

else if (code[i] == 'r') { S = 8; }

else { S = rand_S(i); }

break;

case 7:

if (code[i] == 'l') { S = 1; }

else { S = rand_S(i); }

break;

//break

case 8:

if (code[i] == 'e') { S = 9; }

else { S = rand_S(i); }

break;

case 9:

if (code[i] == 'a') { S = 10; }

else { S = rand_S(i); }

break;

case 10:

if (code[i] == 'k') { S = 1; }

else { S = rand_S(i); }

break;

//(e)endl,else

case 11:

pr = i - 1;

if (code[i] == 'n') { S = 12; }

else if (code[i] == 'l') { S = 14; }

else { S = rand_S(i); }

break;

case 12:

if (code[i] == 'd') { S = 7; }

else { S = rand_S(i); }

break;

//else

case 14:

if (code[i] == 's') { S = 15; }

else { S = rand_S(i); }

break;

case 15:

if (code[i] == 'e') { S = 1; }

else { S = rand_S(i); }

break;

//(i)int/include

case 16:

pr = i - 1;

if (code[i] == 'n') { S = 17; }

else { S = rand_S(i); }

break;

//include

case 17:

if (code[i] == 't') { S = 1; }

else if (code[i] == 'c') { S = 27; }

else { S = rand_S(i); }

break;

//float/for

case 18:

pr = i - 1;

if (code[i] == 'l') { S = 19; }

else if (code[i] == 'o') { S = 40; }

else { S = rand_S(i); }

break;

case 19:

if (code[i] == 'o') { S = 20; }

else { S = rand_S(i); }

break;

case 20:

if (code[i] == 'a') { S = 21; }

else { S = rand_S(i); }

break;

case 21:

if (code[i] == 't') { S = 1; }

else { S = rand_S(i); }

break;

//(s)string/system/switch

case 22:

pr = i - 1;

if (code[i] == 't') { S = 23; }

else if (code[i] == 'y') { S = 36; }

else if (code[i] == 'w') { S = 64; }

else { S = rand_S(i); }

break;

case 23:

if (code[i] == 'r') { S = 24; }

else { S = rand_S(i); }

break;

case 24:

if (code[i] == 'i') { S = 25; }

else { S = rand_S(i); }

break;

case 25:

if (code[i] == 'n') { S = 26; }

else { S = rand_S(i); }

break;

case 26:

if (code[i] == 'g') { S = 1; }

else { S = rand_S(i); }

break;

//include

case 27:

if (code[i] == 'l' ) {S = 28; }

else { S = rand_S(i); }

break;

case 28:

if ( code[i ] == 'u' ) { S = 29; }

else { S = rand_S(i); }

break;

case 29:

if ( code[i ] == 'd' ) {S = 30; }

else { S = rand_S(i); }

break;

case 30:

if (code[i ] == 'e') { S = 1; }

else { S = rand_S(i); }

break;

//void

case 31:

pr = i - 1;

if (code[i] == 'o' ) {S = 32; }

else { S = rand_S(i); }

break;

case 32:

if ( code[i] == 'i' ) {S = 33; }

else { S = rand_S(i); }

break;

case 33:

if ( code[i] == 'd') {S = 1; }

else { S = rand_S(i); }

break;

//cout

case 34:

if (code[i] == 'u') { S = 35; }

else { S = rand_S(i); }

break;

case 35:

if ( code[i ] == 't') {S = 1; }

else { S = rand_S(i); }

break;

//system

case 36:

if (code[i] == 's') {S = 37; }

else { S = rand_S(i); }

break;

case 37:

if ( code[i] == 't' ) {S =38; }

else { S = rand_S(i); }

break;

case 38:

if (code[i] == 'e' ) {S = 39; }

else { S = rand_S(i); }

break;

case 39:

if (code[i] == 'm') {S = 1; }

else { S = rand_S(i); }

break;

case 40:

if (code[i] == 'r') { S = 1; }

else { S = rand_S(i); }

break;

//main

case 41:

pr = i - 1;

if (code[i] == 'a') { S = 42; }

else { S = rand_S(i); }

break;

case 42:

if (code[i] == 'i') { S = 43; }

else { S = rand_S(i); }

break;

case 43:

if (code[i] == 'n') { S = 1; }

else { S = rand_S(i); }

break;

//new,namespace

case 47:

pr = i - 1;

if (code[i] == 'e') {S = 48; }

else if (code[i] == 'a') { S = 49; }

else { S = rand_S(i); }

break;

case 48:

if (code[i] == 'w') { S = 1; }

else { S = rand_S(i); }

break;

case 49:

if (code[i] == 'm') { S = 50; }

else { S = rand_S(i); }

break;

case 50:

if (code[i] == 'e') { S = 51; }

else { S = rand_S(i); }

break;

case 51:

if (code[i] == 's') { S = 52; }

else { S = rand_S(i); }

break;

case 52:

if (code[i] == 'p') { S = 53; }

else { S = rand_S(i); }

break;

case 53:

if (code[i] == 'a') { S = 54; }

else { S = rand_S(i); }

break;

case 54:

if (code[i] == 'c') { S = 55; }

else { S = rand_S(i); }

break;

case 55:

if (code[i] == 'e') { S = 1; }

else { S = rand_S(i); }

break;

//double

case 56:

pr = i - 1;

if (code[i] == 'o') { S = 57; }

else { S = rand_S(i); }

break;

case 57:

if (code[i] == 'u') { S = 58; }

else { S = rand_S(i); }

break;

case 58:

if (code[i] == 'b') { S = 59; }

else { S = rand_S(i); }

break;

case 59:

if (code[i] == 'l') { S = 60; }

else { S = rand_S(i); }

break;

case 60:

if (code[i] == 'e') { S = 1; }

else { S = rand_S(i); }

break;

//rand

case 61:

pr = i - 1;

if (code[i] == 'a') { S = 62; }

else { S = rand_S(i); }

break;

case 62:

if (code[i] == 'n') { S = 63; }

else { S = rand_S(i); }

break;

case 63:

if (code[i] == 'd') { S = 1; }

else { S = rand_S(i); }

break;

//switch

case 64:

if (code[i] == 'w') { S = 65; }

else { S = rand_S(i); }

break;

case 65:

if (code[i] == 'i') { S = 66; }

else { S = rand_S(i); }

break;

case 66:

if (code[i] == 't') { S = 67; }

else { S = rand_S(i); }

break;

case 67:

if (code[i] == 'c') { S = 68; }

else { S = rand_S(i); }

break;

case 68:

if (code[i] == 'h') { S = 1; }

else { S = rand_S(i); }

break;

//case

case 69:

if (code[i] == 'a') { S = 70; }

else { S = rand_S(i); }

break;

case 70:

if (code[i] == 's') { S = 71; }

else { S = rand_S(i); }

break;

case 71:

if (code[i] == 'e') { S = 1; }

else { S = rand_S(i); }

break;

//константы

case 100:

if (digit(code[i])) { S = 100; }

else if (punctz(code[i]) || code[i] == ' ') {

constant(i,pr); S = 0;

}

else if (code[i] == '.')

{ S = 101; }

else if (!digit(code[i]) && !punctz(code[i])) {

while (word(code[i])&& i-pr<=32)

i++;

if (err) {

while (word(code[i]) || digit(code[i]))

{

i++;

}

error += "строка-" + stroka + ": " + code->Substring(pr, i - pr) + "\n//ошибка чтения константы\n\n";

i--;

S = 0;

}

else {

String^ asd = "2" + stroka + " " + code->Substring(pr, i - pr);

throw asd;

}

}

break;

case 101:

if (!digit(code[i]) && !punctz(code[i]) && code[i] != ' ') { //danger

if (err) {

while (!punctz(code[i]) && code[i] != ' ' && code[i] != '\n')

{

i++;

}

error += "строка-" + stroka + ": " + code->Substring(pr, i - pr) + "\n//ошибка чтения константы\n\n";

i--;

S = 0;

}

else {

String^ asd = "2" + stroka + " " + code->Substring(pr, i - pr);

throw asd;

}

}

else if (digit(code[i])) {

S = 101;

}

else if (punctz(code[i]) || code[i] == ' '|| code[i] == '\n') {

constant(i, pr); S = 0;

}

break;

}

i++;

}

if (error!="")

richTextBox4->Text = error;

textBox1->Text = stroka.ToString();

}

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {

Источник: https://otherreferats.allbest.ru/download/1282040/