Конструирование модели лексического и синтаксического анализа
Проведение исследования лексем в языках программирования. Построение регулярной грамматики по конечному автомату. Характеристика логического и физического проектирования. Изучение связи между контекстно-свободными грамматиками и синтаксическим анализом.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 23.05.2021 |
Размер файла | 2,7 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
this->dataGridViewTextBoxColumn6->Width = 40;
//
// constant1
//
this->constant1->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((System::Windows::Forms::AnchorStyles::Top | System::Windows::Forms::AnchorStyles::Bottom));
this->constant1->ColumnHeadersHeightSizeMode = System::Windows::Forms::DataGridViewColumnHeadersHeightSizeMode::AutoSize;
this->constant1->Columns->AddRange(gcnew cli::array< System::Windows::Forms::DataGridViewColumn^>(3) {
this->dataGridViewTextBoxColumn7,
this->dataGridViewTextBoxColumn8, this->dataGridViewTextBoxColumn9
});
this->constant1->EnableHeadersVisualStyles = false;
this->constant1->Location = System::Drawing::Point(614, 316);
this->constant1->Name = L"constant1";
this->constant1->RightToLeft = System::Windows::Forms::RightToLeft::No;
this->constant1->RowHeadersVisible = false;
this->constant1->Size = System::Drawing::Size(113, 103);
this->constant1->TabIndex = 15;
this->constant1->CellContentClick += gcnew System::Windows::Forms::DataGridViewCellEventHandler(this, &MyForm::constant1_CellContentClick);
//
// dataGridViewTextBoxColumn7
//
this->dataGridViewTextBoxColumn7->HeaderText = L"60";
this->dataGridViewTextBoxColumn7->Name = L"dataGridViewTextBoxColumn7";
this->dataGridViewTextBoxColumn7->Width = 30;
//
// dataGridViewTextBoxColumn8
//
this->dataGridViewTextBoxColumn8->HeaderText = L"д/к";
this->dataGridViewTextBoxColumn8->Name = L"dataGridViewTextBoxColumn8";
this->dataGridViewTextBoxColumn8->Width = 40;
//
// dataGridViewTextBoxColumn9
//
this->dataGridViewTextBoxColumn9->HeaderText = L"п/к";
this->dataGridViewTextBoxColumn9->Name = L"dataGridViewTextBoxColumn9";
this->dataGridViewTextBoxColumn9->Width = 40;
//
// ident1
//
this->ident1->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((System::Windows::Forms::AnchorStyles::Top | System::Windows::Forms::AnchorStyles::Bottom));
this->ident1->ColumnHeadersHeightSizeMode = System::Windows::Forms::DataGridViewColumnHeadersHeightSizeMode::AutoSize;
this->ident1->Columns->AddRange(gcnew cli::array< System::Windows::Forms::DataGridViewColumn^>(3) {
this->dataGridViewTextBoxColumn10,
this->dataGridViewTextBoxColumn11, this->dataGridViewTextBoxColumn12
});
this->ident1->EnableHeadersVisualStyles = false;
this->ident1->Location = System::Drawing::Point(371, 316);
this->ident1->Name = L"ident1";
this->ident1->RightToLeft = System::Windows::Forms::RightToLeft::No;
this->ident1->RowHeadersVisible = false;
this->ident1->Size = System::Drawing::Size(113, 103);
this->ident1->TabIndex = 16;
//
// dataGridViewTextBoxColumn10
//
this->dataGridViewTextBoxColumn10->HeaderText = L"40";
this->dataGridViewTextBoxColumn10->Name = L"dataGridViewTextBoxColumn10";
this->dataGridViewTextBoxColumn10->Width = 30;
//
// dataGridViewTextBoxColumn11
//
this->dataGridViewTextBoxColumn11->HeaderText = L"д/к";
this->dataGridViewTextBoxColumn11->Name = L"dataGridViewTextBoxColumn11";
this->dataGridViewTextBoxColumn11->Width = 40;
//
// dataGridViewTextBoxColumn12
//
this->dataGridViewTextBoxColumn12->HeaderText = L"п/к";
this->dataGridViewTextBoxColumn12->Name = L"dataGridViewTextBoxColumn12";
this->dataGridViewTextBoxColumn12->Width = 40;
//
// label4
//
this->label4->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((System::Windows::Forms::AnchorStyles::Top | System::Windows::Forms::AnchorStyles::Bottom));
this->label4->AutoSize = true;
this->label4->Location = System::Drawing::Point(371, 300);
this->label4->Name = L"label4";
this->label4->Size = System::Drawing::Size(62, 13);
this->label4->TabIndex = 17;
this->label4->Text = L"идентифик";
//
// label5
//
this->label5->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((System::Windows::Forms::AnchorStyles::Top | System::Windows::Forms::AnchorStyles::Bottom));
this->label5->AutoSize = true;
this->label5->Location = System::Drawing::Point(611, 300);
this->label5->Name = L"label5";
this->label5->Size = System::Drawing::Size(33, 13);
this->label5->TabIndex = 18;
this->label5->Text = L"const";
//
// label6
//
this->label6->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((System::Windows::Forms::AnchorStyles::Top | System::Windows::Forms::AnchorStyles::Bottom));
this->label6->AutoSize = true;
this->label6->Location = System::Drawing::Point(490, 300);
this->label6->Name = L"label6";
this->label6->Size = System::Drawing::Size(64, 13);
this->label6->TabIndex = 19;
this->label6->Text = L"пунктуация";
//
// punctuation1
//
this->punctuation1->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((System::Windows::Forms::AnchorStyles::Top | System::Windows::Forms::AnchorStyles::Bottom));
this->punctuation1->ColumnHeadersHeightSizeMode = System::Windows::Forms::DataGridViewColumnHeadersHeightSizeMode::AutoSize;
this->punctuation1->Columns->AddRange(gcnew cli::array< System::Windows::Forms::DataGridViewColumn^>(3) {
this->dataGridViewTextBoxColumn13,
this->dataGridViewTextBoxColumn14, this->dataGridViewTextBoxColumn15
});
this->punctuation1->EnableHeadersVisualStyles = false;
this->punctuation1->Location = System::Drawing::Point(490, 316);
this->punctuation1->Name = L"punctuation1";
this->punctuation1->RightToLeft = System::Windows::Forms::RightToLeft::No;
this->punctuation1->RowHeadersVisible = false;
this->punctuation1->Size = System::Drawing::Size(113, 103);
this->punctuation1->TabIndex = 20;
//
// dataGridViewTextBoxColumn13
//
this->dataGridViewTextBoxColumn13->HeaderText = L"50";
this->dataGridViewTextBoxColumn13->Name = L"dataGridViewTextBoxColumn13";
this->dataGridViewTextBoxColumn13->Width = 30;
//
// dataGridViewTextBoxColumn14
//
this->dataGridViewTextBoxColumn14->HeaderText = L"д/к";
this->dataGridViewTextBoxColumn14->Name = L"dataGridViewTextBoxColumn14";
this->dataGridViewTextBoxColumn14->Width = 40;
//
// dataGridViewTextBoxColumn15
//
this->dataGridViewTextBoxColumn15->HeaderText = L"п/к";
this->dataGridViewTextBoxColumn15->Name = L"dataGridViewTextBoxColumn15";
this->dataGridViewTextBoxColumn15->Width = 40;
//
// richTextBox3
//
this->richTextBox3->Anchor = System::Windows::Forms::AnchorStyles::Top;
this->richTextBox3->Location = System::Drawing::Point(415, 12);
this->richTextBox3->Name = L"richTextBox3";
this->richTextBox3->Size = System::Drawing::Size(312, 139);
this->richTextBox3->TabIndex = 21;
this->richTextBox3->Text = L"";
//
// richTextBox4
//
this->richTextBox4->Anchor = System::Windows::Forms::AnchorStyles::Top;
this->richTextBox4->Location = System::Drawing::Point(415, 157);
this->richTextBox4->Name = L"richTextBox4";
this->richTextBox4->Size = System::Drawing::Size(312, 139);
this->richTextBox4->TabIndex = 22;
this->richTextBox4->Text = L"";
//
// label7
//
this->label7->Anchor = System::Windows::Forms::AnchorStyles::Top;
this->label7->AutoSize = true;
this->label7->Location = System::Drawing::Point(330, 62);
this->label7->Name = L"label7";
this->label7->Size = System::Drawing::Size(65, 26);
this->label7->TabIndex = 23;
this->label7->Text = L"количество\r\nстрок:";
//
// textBox1
//
this->textBox1->Anchor = System::Windows::Forms::AnchorStyles::Top;
this->textBox1->BorderStyle = System::Windows::Forms::BorderStyle::None;
this->textBox1->Location = System::Drawing::Point(370, 75);
this->textBox1->Name = L"textBox1";
this->textBox1->Size = System::Drawing::Size(24, 13);
this->textBox1->TabIndex = 26;
this->textBox1->TextChanged += gcnew System::EventHandler(this, &MyForm::textBox1_TextChanged_1);
//
// button2
//
this->button2->Anchor = System::Windows::Forms::AnchorStyles::Top;
this->button2->Location = System::Drawing::Point(330, 94);
this->button2->Name = L"button2";
this->button2->Size = System::Drawing::Size(75, 47);
this->button2->TabIndex = 27;
this->button2->Text = L"error processing";
this->button2->UseVisualStyleBackColor = true;
this->button2->Click += gcnew System::EventHandler(this, &MyForm::button2_Click);
//
// button3
//
this->button3->Location = System::Drawing::Point(333, 273);
this->button3->Name = L"button3";
this->button3->Size = System::Drawing::Size(75, 23);
this->button3->TabIndex = 28;
this->button3->Text = L"clear";
this->button3->UseVisualStyleBackColor = true;
this->button3->Click += gcnew System::EventHandler(this, &MyForm::button3_Click);
//
// MyForm
//
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Inherit;
this->ClientSize = System::Drawing::Size(739, 430);
this->Controls->Add(this->button3);
this->Controls->Add(this->button2);
this->Controls->Add(this->textBox1);
this->Controls->Add(this->label7);
this->Controls->Add(this->richTextBox4);
this->Controls->Add(this->richTextBox3);
this->Controls->Add(this->punctuation1);
this->Controls->Add(this->label6);
this->Controls->Add(this->label5);
this->Controls->Add(this->label4);
this->Controls->Add(this->ident1);
this->Controls->Add(this->constant1);
this->Controls->Add(this->ops1);
this->Controls->Add(this->op1);
this->Controls->Add(this->label3);
this->Controls->Add(this->label2);
this->Controls->Add(this->label1);
this->Controls->Add(this->keyWord1);
this->Controls->Add(this->richTextBox2);
this->Controls->Add(this->button1);
this->Controls->Add(this->richTextBox1);
this->Name = L"MyForm";
this->Text = L"MyForm";
this->Load += gcnew System::EventHandler(this, &MyForm::MyForm_Load);
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->keyWord1))->EndInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->op1))->EndInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->ops1))->EndInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->constant1))->EndInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->ident1))->EndInit();
(cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->punctuation1))->EndInit();
this->ResumeLayout(false);
this->PerformLayout();
}
#pragma endregion
String^ code;
String^ code1;
String^ code2;
bool err;
int lastRow;
bool nlol;
private: void keyWord(int i,int pr) {
if (!err) {
//для возврата к символу-разделителю
String^ tmp = code->Substring(pr, i - pr);
nlol = true;
int j = 0;
//проверка на повторяемость
for (; j < keyWord1->RowCount - 1; j++)
if (keyWord1[1, j]->Value->ToString() == tmp) {
nlol = false;
break;
}
if (nlol) {
keyWord1->Rows->Add();
lastRow = keyWord1->RowCount - 2;
keyWord1->Rows[lastRow]->Cells[0]->Value = keyWord1->RowCount - 1;
keyWord1->Rows[lastRow]->Cells[1]->Value = tmp;
keyWord1->Rows[lastRow]->Cells[2]->Value = tmp;
}
richTextBox3->Text += "(10," + (j + 1).ToString() + ") ";
if (code->Substring(i, 1) == " ")
tmp += " ";
richTextBox4->Text += tmp;
}
}
private: void o_peratr(int i, int pr) {
if (!err) {
//для возврата к символу-разделителю
String^ tmp = code->Substring(pr, i - pr);
nlol = true;
//проверка на повторяемость
int j = 0;
for (; j < op1->RowCount - 1; j++)
if (op1[1, j]->Value->ToString() == tmp) {
nlol = false;
break;
}
if (nlol) {
op1->Rows->Add();
lastRow = op1->RowCount - 2;
op1->Rows[lastRow]->Cells[0]->Value = op1->RowCount - 1;
op1->Rows[lastRow]->Cells[1]->Value = tmp;
op1->Rows[lastRow]->Cells[2]->Value = tmp;
}
richTextBox3->Text += "(20," + (j + 1).ToString() + ")";
richTextBox4->Text += tmp;
}
}
private: void o_peratr_sravn(int i, int pr) {
if (!err) {
//для возврата к символу-разделителю
String^ tmp = code->Substring(pr, i - pr);
nlol = true;
//проверка на повторяемость
int j = 0;
for (; j < ops1->RowCount - 1; j++)
if (ops1[1, j]->Value->ToString() == tmp) {
nlol = false;
break;
}
if (nlol) {
ops1->Rows->Add();
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) {
System::Windows::Forms::DialogResult result;
err = false;
/*result=MessageBox::Show(this, "puskai budet rad", "ошибка",
System::Windows::Forms::MessageBoxButtons::YesNo);
if (result == System::Windows::Forms::DialogResult::No) {
richTextBox3->Text = "niiiit";
}*/
try {
programm();
richTextBox2->Text = code2;
}
catch (String ^ ex) {
char ef = ex[0];
int i = 1,prov = 0,pr=i;
while (digit(ex[i]))
{
i++;
}
String^ st = ex->Substring(1, i - pr);
ex = ex->Substring(i, ex->Length - i);
for (int i = 0; i < code->Length; i++) {
if (code2[i] == '\n')
prov++;
if (prov.ToString() == st)
break;
richTextBox2->Text += code2[i];
}
switch (ef) {
case '1':
MessageBox::Show(st + "-строка\n" + "неопознанный символ: " + ex, "ошибка");
break;
case '2':
MessageBox::Show(st + "-строка\n" + "ошибка чтения константы: " + ex, "ошибка");
break;
case '3':
MessageBox::Show(st + "-строка\n" + "ошибка чтения оператора: " + ex, "ошибка");
break;
case '4':
MessageBox::Show(st + "-строка\n" + "переполнение символов в идентификаторе: " + ex, "ошибка");
break;
}
}
catch (...)
{
richTextBox1->Text = "неопознанная ошибка";
}
}
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
err = true;
programm();
richTextBox2->Text = code2;
}
private: System::Void richTextBox1_TextChanged(System::Object^ sender, System::EventArgs^ e) {
}
private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e) {
setlocale(LC_ALL, "rus");
}
private: System::Void keyWord1_CellContentClick(System::Object^ sender, System::Windows::Forms::DataGridViewCellEventArgs^ e) {
}
private: System::Void constant1_CellContentClick(System::Object^ sender, System::Windows::Forms::DataGridViewCellEventArgs^ e) {
}
private: System::Void richTextBox2_TextChanged(System::Object^ sender, System::EventArgs^ e) {
}
private: System::Void textBox1_TextChanged(System::Object^ sender, System::EventArgs^ e) {
}
private: System::Void textBox1_TextChanged_1(System::Object^ sender, System::EventArgs^ e) {
}
private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {
//
ident1->Rows->Clear();
//
keyWord1->Rows->Clear();
//
op1->Rows->Clear();
//
ops1->Rows->Clear();
//
punctuation1->Rows->Clear();
//
constant1->Rows->Clear();
richTextBox2->Text = "";
richTextBox3->Text = "";
richTextBox4->Text = "";
textBox1->Text = "";
}
};
}
Размещено на Allbest.ru
Подобные документы
Разработка учебного транслятора на языке программирования C# в среде объектно-ориентированного программирования Visual Studio 2012. Выделение лексем и построение цепочки символов на этапе синтаксического анализа. Функциональное тестирование программы.
курсовая работа [406,8 K], добавлен 07.08.2013Содержательная часть языка программирования С++. Правила автоматной грамматики, классификация Хомского. Принцип построения графов, разработка проекта средствами среды программирования Builder C++. Алгоритм синтаксического анализа оператора вывода.
контрольная работа [228,4 K], добавлен 22.05.2012Описание синтаксиса и семантики входного языка. Описание типов лексем, определение их синтаксиса. Построение диаграммы лексического анализатора, а также его таблицы, тестирование. Построение КС-грамматики входного языка. Описание промежуточного языка.
курсовая работа [83,0 K], добавлен 23.01.2014Написание программы, которая выполняет лексический и синтаксический анализ входного языка программирования, порождает таблицу лексем с указанием их типов и значений, а также строит синтаксическое дерево; текст входного языка вводится с клавиатуры.
курсовая работа [761,5 K], добавлен 23.02.2012Понятие синтаксического анализа. Программный продукт для обработки данных строкового типа. Построение сканера текстов с использованием утилиты flex, синтаксического анализатора с помощью утилиты bison. Грамматика языка программирования обработки строк.
курсовая работа [261,7 K], добавлен 29.10.2012Морфологические анализаторы (морфологизаторы) на различных языках программирования. Анализ методов и технологий автоматической обработки ЕЯ-текстов. Разработка модуля графематического анализа и создания таблицы лексем. Программная реализация классов.
дипломная работа [3,0 M], добавлен 06.03.2012Общая характеристика и оценка возможностей языка программирования си-шарп, его сходные и отличительные черты от С++ и Java. Разработка с помощью данного языка программирования лексического и синтаксического анализатора. Составление таблиц разбора.
курсовая работа [111,6 K], добавлен 11.06.2010Входная грамматика в структурированной форме. Функции переходов символьного преобразователя. Работа лексического анализатора. Структуры данных, символы действия. Описание семантики перевода. Построение и программная реализация атрибутного преобразователя.
курсовая работа [128,9 K], добавлен 03.07.2013Розробка операційного автомату. Розробка машинного алгоритму: граф-схема алгоритму; приклад реалізації. Синтез керуючого автомату: основи теорії керуючих автоматів; опис керуючого автомату Мілі. Кодування граф-схеми автомату. Синтез керуючого автомату.
курсовая работа [121,0 K], добавлен 26.12.2009Описание проектного решения стратегической системы, этапы объектно-ориентированного анализа и проектирования. Описание связей между объектами. Программная реализация, построение модели состояний объекта. Руководство пользователя и описание программы.
курсовая работа [388,8 K], добавлен 17.11.2011