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) {