Построение управляющих таблиц
Определим выражение в виде БНФ для языка С\С++ и Turbo Pascal 7.0. С\С++: В::= ++i | --i | i++ | i-- | B*B | B/B | B%B | B+B | B-B | B<B | B>B | B>=B | B<=B | B!=B | B==B | B&&B | B|| | (k)B | B?B:B | i=B | i*=B | i-=B | i+=B | i/=B | i%=B | i | i(S) | (B) S::=B | B, S Где В – выражение; S – список выражений; i - индификатор. Turbo Pascal 7.0. В::=П | П=П | П<П | П> П | П<> П | П>= П | П<= П П::=+C | -C | П+C | П-C | П or C C::=M | C*M | C/M | C div M | C mod M | C and M M::=i | i(S) | (B) S::=B | B, S Где В – выражение; S – список выражений; П – простое выражение; С – слагаемое; М – множитель: i - индификатор. N Теперь приведём данные БНФ к КС-грамматике: G=<N, T, P, S> С\С++ Turbo Pascal 7.0 Bà (k)B BàП Bà++i BàП=П Bà--i BàП<П Bài++ BàП>П BàB*B BàП<=П BàB/B BàП>=П BàB+B BàП<>П BàB-B ПàП+C BàB<B ПàП-C BàB>B ПàП or C BàB>=B Пà+C BàB<=B Пà-C BàB!=B CàM BàB==B CàC*M BàB&&B CàC/M BàB||B CàC div M BàB?B:B CàC mod M Bài=B CàC and M Bài*=B Mài Bài/=B Mài(S) Bài%=B Mà(B) Bài+=B SàB Bài-=B SàB, S Bài Bài(S) Bà(B) Sà B SàB, S N(C\C++)={B, П, S} T(C\C++)={i, ++, --, +, -, ==,!=, <, >, <=, >=, *=, -=, +=, /=, %=, =, *, /, %, (,),?,:,,, &&, ||} N(TP)={B, П, C, M, S} T(TP)={ i, +, -, =, <>, <, >, <=, >=, *, /, div, mod, and, or, (,),,} Устранив цепные правила, левую рекурсию, получим LL(1)-грамматику. C\C++ Bài B1 B1à= BB’ B1à*=BB’ B1à+=BB’ B1à-BB’ B1à/BB’ B1à--B’ B1à++B’ B1à(SS1 S1à)B’ Bà(B2 B2ài B1C Cà)B’ B2à(B2C B2à--C1 C C1ài B’ B2à++C1 C B2àk C2 C2à)BB’ Bà--C1 Bà++C1 B1à%BB’ B1à*BB’ B1à/BB’ B1à+BB’ B1à-BB’ B1à>BB’ B1à<BB’ B1à<=BB’ B1à>=BB’ B1à==BB’ B1à!=BB’ B1à&&BB’ B1à||BB’ B1à?BB3 B3à:BB’ B1à$ B’à%BB’ B’à*BB’ B’à/BB’ B’à+BB’ B’à-BB’
B’à>BB’ B’à<BB’ B’à>=BB’ B’à<=BB’ B’à==BB’ B’à!=BB’ B’à&&BB’ B’à||BB’ B’à?BB3 B1à%=BB’ B’à$ Sài B1 S’ Sà (B2S’ Sà--C1S’ Sà++C1S’ S’à, S S’à$ ДОПУСТИТЬ 0.Отвергнуть Turbo Pascal 7.0 Bà+CП’B’ Bà- CП’B’ Bài M’C’П’B’ Bà(BM1C’П’B’ B’à=П B’à<П B’à>П B’à<>П B’à>=П B’à<=П B’à$ Пà+CП’ Пà-CП’ Пà i M’C’П’ Пà(BM1C’П’ П’à+CП’ П’à-CП’ П’à or C’П’ П’à$ MàI M’ Mà(BM1 M’à(SM1 M’à$ M1à) Cài M’C’ Cà(BM’C’ C’à*MC’ C’à/MC’ C’àdiv MC’ C’àmod MC’ C’àand MC’ C’à$ Sà+CП’B’S’ Sà-CП’B’S’ Sài M’C’П’B’S’ Sà(B M1C’П’B’ S’à, S S’à$ ДОПУСТИТЬ Отвергнуть Так как данные LL(1)-грамматики являются грамматиками Грейбаха, то по ним можно построить управляющие таблицы. Управляющая таблица для выражения на языке С\С++
Управляющая таблица для выражения на языке Turbo Pascal 7.0
Пример работы программы Ввели выражение на языке СИ: КУРСОВАЯ РАБОТА ПО ЯПМТ Выберете язык: 1 - СИ\СИ++ 2 - Turbo Pascal 7.0 1 Напишите выражение на языке С: (e+e==7) Дескрипторный текст: 0 2 9 2 16 2 1 Заменить(S',В2) Сдвиг Заменить(C,В1) Сдвиг Заменить(В',В) Сдвиг Заменить(В1) Сдвиг Заменить(В',В) Сдвиг
Заменить(В1) Сдвиг Вытолкнуть Держать Вытолкнуть Держать Вытолкнуть Держать Заменить(В') Сдвиг Вытолкнуть Держать Вытолкнуть Держать ДОПУСТИТЬ Выходная лента: 55 12 25 1 31 1 37 53 53 13 53 59 60 Ввели не выражение: КУРСОВАЯ РАБОТА ПО ЯПМТ Выберете язык: 1 - СИ\СИ++ 2 - Turbo Pascal 7.0 1 Напишите выражение на языке С: t+ Дескрипторный текст: 2 9 Заменить(S',В1) Сдвиг Заменить(В',В) Сдвиг Отвергнуть Выходная лента: 54 25 0 Ввели выражение на Паскале: КУРСОВАЯ РАБОТА ПО ЯПМТ Выберете язык: 1 - СИ\СИ++ 2 - Turbo Pascal 7.0 2 Напишите выражение на языке TP: ww=s+1 Дескрипторный текст: 2 11 2 4 2 Заменить(В'П'C'M') Сдвиг Вытолкнуть Держать Вытолкнуть Держать Вытолкнуть Держать Заменить(П) Сдвиг Заменить(П'C'M') Сдвиг Вытолкнуть Держать Вытолкнуть Держать Заменить(П'C) Сдвиг Заменить(C'M') Сдвиг Вытолкнуть Держать Вытолкнуть Держать Вытолкнуть Держать ДОПУСТИТЬ Выходная лента: 3 23 32 19 5 14 23 32 16 25 23 32 19 39 Ввели не выражение КУРСОВАЯ РАБОТА ПО ЯПМТ Выберете язык: 1 - СИ\СИ++ 2 - Turbo Pascal 7.0 2 Напишите выражение на языке TP: f=s+ Дескрипторный текст: 2 11 2 4 Заменить(В'П'C'M') Сдвиг Вытолкнуть Держать Вытолкнуть Держать Вытолкнуть Держать Заменить(П) Сдвиг Заменить(П'C'M') Сдвиг Вытолкнуть Держать Вытолкнуть Держать Заменить(П'C) Сдвиг Отвергнуть Выходная лента: 3 23 32 19 5 14 23 32 16 0 Листинг программы: #include<stdio.h> #include<conio.h> #define n 100 #define t 17 #define m 53 #define g 11 char s1[n],s[n],a[n]; int j=0,h,vl[n],y=0; /*---------------------------ВВОД ВЫРАЖЕНИЯ------------------------------*/ int vvod() { int i; printf("\t\t\tКУРСОВАЯ РАБОТА ПО ЯПМТ\n"); printf("Выберете язык: 1 - СИ\\СИ++ 2 - Turbo Pascal 7.0\n"); scanf("%d",&y); if(y==1) printf("Напишите выражение на языке С:\n"); {for(i=0;i<=n-1;i++) { scanf("%c",&s1[i]); if (s1[i]=='\n'){j=i;break;} } } if(y==2) printf("Напишите выражение на языке TP:\n"); {for(i=0;i<=n-1;i++) { scanf("%c",&s1[i]); if (s1[i]=='\n'){j=i;break;} } } return y; }; /*-----------------------------------------------------------------------*/ /*--------------------------ИНДИФИКАТОР----------------------------------*/ int perem(int be,int l) { int i,j,k,d(0),i1,d1=0,z(0),chiclo(0),di(0); char b[m]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o', 'p','q','r','s','t','u','v','w','x','y','z','A','B','C','D', 'F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T',
'U','V','W','X','W','Z','E','_'}; char c[g]={'1','2','3','4','5','6','7','8','9','0','.'}; for(j=0;j<=m-1;j++) { if(s1[be]==b[j]) {d=1;break;} } if(d==1) { for(i=be+1;i<=l;i++) { d=0; for(j=0;j<=m-1;j++) { if(s1[i]==b[j]) {d=1;break;} } if (d==0) { d1=0; for(k=0;k<=g-1;k++) { if(s1[i]==c[k]) {d1=1;break;} } if(d1==0)break; } } } chiclo=0; for(i=be;i<=l;i++) for(j=0;j<=g-1;j++) { if(s1[i]==c[j]) {chiclo=chiclo++;break;} } if(d1==1||d==1||chiclo==l-be+1&&z==0) {z=1;/*printf("DA");*/} else {z=0;/*printf("NET");*/} return z; }; /*--------------------КОНЕЦ ИНДИФИКАТОРА---------------------------------*/ /*--------------------------LL(1) - АНАЛИЗАТОР-----------------------------*/ int analiz() { int z[6],v,z1,i(0),j,k; int tab[12][29]={{55,0,54,0,57,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {11,0,1,0,21,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {9,37,0,0,8,7,22,23,24,25,26,28,27,30,29,32,31,34,33,35,0,0,2,3,4,5,6,52,37}, {14,0,12,18,17,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0}, {0,53,0,0,0,0,38,39,40,41,42,44,43,45,46,48,47,50,49,51,0,53,0,0,0,0,0,0,53}, {0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,59,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,58,0,0,0,0,0,0,59}, {0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60}}; printf("\n"); z1=0; z[z1]=11;z1++;z[z1]=0; v=0;j=0; do { switch(tab[z[z1]][a[v]]) { case 1: z[z1]=2;v++; printf("\tЗаменить(В1)\tСдвиг\n");vl[j]=1;break; case 2: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=2;break; case 3: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=3;break; case 4: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=4;break; case 5: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=5;break; case 6: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=8;break; case 7: z[z1]=5;v++; printf("\tЗаменить(В')\tСдвиг\n");vl[j]=7;break; case 8: z[z1]=5;v++; printf("\tЗаменить(В')\tСдвиг\n");vl[j]=8;break; case 9: z[z1]=10;z1++;z[z1]=0;v++; printf("\tЗаменить(S1,S)\tСдвиг\n");vl[j]=9;break; case 10: z[z1]=5;v++; printf("\tЗаменить(В')\tСдвиг\n");vl[j]=10;break; case 11: z[z1]=3;v++; printf("\tЗаменить(В2)\tСдвиг\n");vl[j]=11;break; case 12: z[z1]=6;z1++;z[z1]=2;v++; printf("\tЗаменить(C,В1)\tСдвиг\n");vl[j]=12;break; case 13: z[z1]=5;v++; printf("\tЗаменить(В')\tСдвиг\n");vl[j]=13;break; case 14: z[z1]=6;z1++;z[z1]=3;v++; printf("\tЗаменить(C,В2)\tСдвиг\n");vl[j]=14;break; case 15: z[z1]=6;z1++;z[z1]=7;v++; printf("\tЗаменить(C,C1)\tСдвиг\n");vl[j]=15;break; case 16: z[z1]=5;v++; printf("\tЗаменить(В')\tСдвиг\n");vl[j]=16;break; case 17: z[z1]=6;z1++;z[z1]=7;v++; printf("\tЗаменить(C,C1)\tСдвиг\n");vl[j]=17;break; case 18: z[z1]=8;v++; printf("\tЗаменить(C2)\tСдвиг\n");vl[j]=18;break; case 19: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=19;break; case 20: z[z1]=7;v++; printf("\tЗаменить(C1)\tСдвиг\n");vl[j]=20;break; case 21: z[z1]=7;v++; printf("\tЗаменить(C1)\tСдвиг\n");vl[j]=21;break; case 22: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=22;break; case 23: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=23;break; case 24: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=24;break; case 25: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=25;break; case 26: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=26;break;
case 27: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=27;break; case 28: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=28;break; case 29: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=29;break; case 30: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=30;break; case 31: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=31;break; case 32: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=32;break; case 33: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=33;break; case 34: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=34;break; case 35: z[z1]=4;z1++;z[z1]=1;v++; printf("\tЗаменить(В3,В)\tСдвиг\n");vl[j]=35;break; case 36: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=36;break; case 37: z1--; printf("\tВытолкнуть\tДержать\n");vl[j]=37;break; case 38: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=38;break; case 39: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=39;break; case 40: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=40;break; case 41: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=41;break; case 42: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=42;break; case 43: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=43;break; case 44: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=44;break; case 45: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=45;break; case 46: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=46;break; case 47: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=47;break; case 48: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=48;break; case 49: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=49;break; case 50: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=50;break; case 51: z[z1]=4;z1++;z[z1]=1;v++; printf("\tЗаменить(В3,В)\tСдвиг\n");vl[j]=51;break; case 52: z[z1]=5;z1++;z[z1]=1;v++; printf("\tЗаменить(В',В)\tСдвиг\n");vl[j]=52;break; case 53: z1--; printf("\tВытолкнуть\tДержать\n");vl[j]=53;break; case 54: z[z1]=9;z1++;z[z1]=2;v++; printf("\tЗаменить(S',В1)\tСдвиг\n");vl[j]=54;break; case 55: z[z1]=9;z1++;z[z1]=3;v++; printf("\tЗаменить(S',В2)\tСдвиг\n");vl[j]=55;break; case 56: z[z1]=9;z1++;z[z1]=7;v++; printf("\tЗаменить(S',C1)\tСдвиг\n");vl[j]=56;break; case 57: z[z1]=9;z1++;z[z1]=7;v++; printf("\tЗаменить(S',C1)\tСдвиг\n");vl[j]=57;break; case 58: z[z1]=0;v++; printf("\tЗаменить(S)\tСдвиг\n");vl[j]=58;break; case 59: z1--; printf("\tВытолкнуть\tДержать\n");vl[j]=59;break; case 60: printf("ДОПУСТИТЬ\n");i=1;vl[j]=60;break; case 0: printf("Отвергнуть\n");i=2;vl[j]=0;break; } if(i==1|i==2)break;else j++; } while(tab[z[z1]][a[v]]!=0||tab[z[z1]][a[v]]!=60); printf("Выходная лента:\n"); for(k=0;k<=j;k++) { printf("%d ",vl[k]); } return i; }; /*-------------------------------------------------------------------------*/ /*--------------------------ТЕРМИНАЛЬНЫЕ СИМВОЛЫ---------------------------*/ int termin(char s) { char term[t]={'+','-','&','|','>','<','=','\n','!','/','*',':','?','%','(',')',','}; int k,di=0; for(k=0;k<=t-1;k++) { if(s==term[k]||s=='d'||s=='i'||s=='v'||s=='m'||s=='o'||s=='r'||s=='a'||s=='n') {di=1;break;} } return di; }; /*---------------------КОНЕЦ ТЕРМИНАЛЬНЫЕ СИМВОЛЫ--------------------------*/ /*-----------------------ДЕСКРИПТОРНЫЙ ТЕКСТ---------------------------------*/ int lexica() { int di(0),q(0),w(0),i1,i; i=0; printf("Дескрипторный текст:\n"); do { di=termin(s1[i]); if(di==1) { switch(s1[i]) { case '(': a[w]=0;break; case ')': a[w]=1;break; case '%': if(s1[i+1]=='='){a[w]=27;i++;}else a[w]=6;break; case '*': if(s1[i+1]=='='){a[w]=23;i++;}else a[w]=7;break; case '/': if(s1[i+1]=='='){a[w]=26;i++;}else a[w]=8;break; case '=': if(s1[i+1]=='='){a[w]=16;i++;}else a[w]=22;break; case '!': if(s1[i+1]=='=')a[w]=15;i++;break; case '>': if(s1[i+1]=='='){a[w]=13;i++;}else a[w]=12;break; case '<': if(s1[i+1]=='='){a[w]=14;i++;}else a[w]=11;break; case '+': if(s1[i+1]=='+'){a[w]=4;i++;}else if(s1[i+1]=='='){a[w]=24;i++;}else a[w]=9;break; case '-': if(s1[i+1]=='-'){a[w]=5;i++;}else if(s1[i+1]=='='){a[w]=25;i++;}else a[w]=10;break; case '&': if(s1[i+1]=='&')a[w]=18;i++;break; case '|': if(s1[i+1]=='|')a[w]=17;i++;break; case ',': a[w]=21;break; case '?': a[w]=19;break; case ':': a[w]=20;break; } i++; } else { i1=i; while(di!=1) { i++; di=termin(s1[i]); } q=perem(i1,i-1); if(q==1)a[w]=2;else {printf("ERROR.\nЛЕКСИЧЕСКАЯ ОШИБКА");break;} } printf("%d ",a[w]); w++; } while(s1[i]!='\n'); a[w]=28; }; /*---------------------КОНЕЦ ДЕСКРИПТОРНОГО ТЕКСТА--------------------------*/ int lexica1() { int di(0),q(0),w(0),i1,i; i=0; printf("Дескрипторный текст:\n"); do { di=termin(s1[i]); if(di==1) { switch(s1[i]) { case '(': a[w]=0;break; case ')': a[w]=1;break; case '*': a[w]=6;break; case '/': a[w]=7;break; case '=': a[w]=11;break; case '>': if(s1[i+1]=='='){a[w]=15;i++;}else a[w]=14;break; case '<': if(s1[i+1]=='='){a[w]=16;i++;}else a[w]=13;break; case '+': a[w]=4;break; case '-': a[w]=5;break; case ',': a[w]=3;break; case 'd': if(s1[i+1]=='i'&&s1[i+2]=='v')a[w]=8;i++;i++;break; case 'm': if(s1[i+1]=='o'&&s1[i+2]=='d')a[w]=9;i++;i++;break; case 'a': if(s1[i+1]=='n'&&s1[i+2]=='d')a[w]=10;i++;i++;break; case 'o': if(s1[i+1]=='r')a[w]=17;i++;break; } i++; } else { i1=i; while(di!=1) { i++; di=termin(s1[i]); } q=perem(i1,i-1); if(q==1)a[w]=2;else {printf("ERROR.\nЛЕКСИЧЕСКАЯ ОШИБКА");break;} } printf("%d ",a[w]); w++; } while(s1[i]!='\n'); a[w]=18; }; int analiz1() { int z[10],v,z1,i(0),j,k; int tab[12][19]={{36,0,35,0,33,34,0,0,0,0,0,0,0,0,0,0,0,0,0}, {4,0,3,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,11,0,11,0,0,0,0,0,0,0,5,8,6,7,9,10,0,11}, {26,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,32,0,32,32,32,27,28,29,30,31,32,32,32,32,32,32,32,32}, {21,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {22,23,0,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23}, {0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {15,0,14,0,12,13,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,19,0,19,16,17,0,0,0,0,0,19,19,19,19,19,19,18,19}, {0,38,0,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39}}; printf("\n"); z1=0; z[z1]=11;z1++;z[z1]=1; v=0;j=0; do { switch(tab[z[z1]][a[v]]) { case 1: z[z1]=2;z1++;z[z1]=9;z1++;z[z1]=3;v++; printf("\tЗаменить(В'П'C)\tСдвиг\n");vl[j]=1;break; case 2: z[z1]=2;z1++;z[z1]=9;z1++;z[z1]=3;v++; printf("\tЗаменить(В'П'C)\tСдвиг\n");vl[j]=2;break; case 3: z[z1]=2;z1++;z[z1]=9;z1++;z[z1]=4;z1++;z[z1]=6;v++; printf("\tЗаменить(В'П'C'M')\tСдвиг\n");vl[j]=3;break; case 4: z[z1]=2;z1++;z[z1]=9;z1++;z[z1]=4;z1++;z[z1]=7;z1++;z[z1]=1;v++; printf("\tЗаменить(В'П'C'M1,B)\tСдвиг\n");vl[j]=4;break; case 5: z[z1]=8;v++; printf("\tЗаменить(П)\tСдвиг\n");vl[j]=5;break; case 6: z[z1]=8;v++; printf("\tЗаменить(П)\tСдвиг\n");vl[j]=6;break; case 7: z[z1]=8;v++; printf("\tЗаменить(П)\tСдвиг\n");vl[j]=7;break; case 8: z[z1]=8;v++; printf("\tЗаменить(П)\tСдвиг\n");vl[j]=8;break; case 9: z[z1]=8;v++; printf("\tЗаменить(П)\tСдвиг\n");vl[j]=9;break; case 10:z[z1]=8;v++; printf("\tЗаменить(П)\tСдвиг\n");vl[j]=10;break; case 11:z1--; printf("\tВытолкнуть\tДержать\n");vl[j]=11;break; case 12:z[z1]=9;z1++;z[z1]=3;v++; printf("\tЗаменить(П'C)\tСдвиг\n");vl[j]=12;break; case 13:z[z1]=9;z1++;z[z1]=3;v++; printf("\tЗаменить(П'C)\tСдвиг\n");vl[j]=13;break; case 14:z[z1]=9;z1++;z[z1]=4;z1++;z[z1]=6;v++; printf("\tЗаменить(П'C'M')\tСдвиг\n");vl[j]=14;break; case 15:z[z1]=9;z1++;z[z1]=4;z1++;z[z1]=7;v++; printf("\tЗаменить(П'C'M1,B)\tСдвиг\n");vl[j]=15;break; case 16:z[z1]=9;z1++;z[z1]=3;v++; printf("\tЗаменить(П'C)\tСдвиг\n");vl[j]=16;break; case 17:z[z1]=9;z1++;z[z1]=3;v++; printf("\tЗаменить(П'C)\tСдвиг\n");vl[j]=17;break; case 18:z[z1]=9;z1++;z[z1]=3;v++; printf("\tЗаменить(П'C)\tСдвиг\n");vl[j]=18;break; case 19:z1--; printf("\tВытолкнуть\tДержать\n");vl[j]=19;break; case 20:z[z1]=6;v++; printf("\tЗаменить(M')\tСдвиг\n");vl[j]=20;break; case 21:z[z1]=7;z1++;z[z1]=1;v++; printf("\tЗаменить(M1,B)\tСдвиг\n");vl[j]=21;break; case 22:z[z1]=7;z1++;z[z1]=0;v++; printf("\tЗаменить(M1,S)\tСдвиг\n");vl[j]=22;break; case 23:z1--; printf("\tВытолкнуть\tДержать\n");vl[j]=23;break; case 24:z1--;v++; printf("\tВытолкнуть\tСдвиг\n");vl[j]=24;break; case 25:z[z1]=4;z1++;z[z1]=6;v++; printf("\tЗаменить(C'M')\tСдвиг\n");vl[j]=25;break; case 26:z[z1]=4;z1++;z[z1]=6;z1++;z[z1]=1;v++; printf("\tЗаменить(C'M'B)\tСдвиг\n");vl[j]=26;break; case 27:z[z1]=4;z1++;z[z1]=6;v++; printf("\tЗаменить(C'M')\tСдвиг\n");vl[j]=27;break; case 28:z[z1]=4;z1++;z[z1]=6;v++; printf("\tЗаменить(C'M')\tСдвиг\n");vl[j]=28;break; case 29:z[z1]=4;z1++;z[z1]=5;v++; printf("\tЗаменить(C'M)\tСдвиг\n");vl[j]=29;break; case 30:z[z1]=4;z1++;z[z1]=5;v++; printf("\tЗаменить(C'M)\tСдвиг\n");vl[j]=30;break; case 31:z[z1]=4;z1++;z[z1]=5;v++; printf("\tЗаменить(C'M)\tСдвиг\n");vl[j]=31;break; case 32:z1--; printf("\tВытолкнуть\tДержать\n");vl[j]=32;break; case 33:z[z1]=10;z1++;z[z1]=2;z1++;z[z1]=9;z1++;z[z1]=3;v++; printf("\tЗаменить(S'B'П'С)\tСдвиг\n");vl[j]=33;break; case 34:z[z1]=10;z1++;z[z1]=2;z1++;z[z1]=9;z1++;z[z1]=3;v++; printf("\tЗаменить(S'B'П'С)\tСдвиг\n");vl[j]=34;break; case 35:z[z1]=10;z1++;z[z1]=2;z1++;z[z1]=9;z1++;z[z1]=4;z1++;z[z1]=6;v++; printf("\tЗаменить(S'B'П'С'M')\tСдвиг\n");vl[j]=35;break; case 36:z[z1]=2;z1++;z[z1]=9;z1++;z[z1]=4;z1++;z[z1]=7;z1++;z[z1]=1;v++; printf("\tЗаменить(B'П'С'M1,B)\tСдвиг\n");vl[j]=36;break; case 37:z[z1]=0;v++; printf("\tЗаменить(S)\tСдвиг\n");vl[j]=37;break; case 38:z1--; printf("\tВытолкнуть\tДержать\n");vl[j]=38;break; case 39: printf("ДОПУСТИТЬ\n");i=1;vl[j]=39;break; case 0: printf("Отвергнуть\n");i=2;vl[j]=0;break; } if(i==1|i==2)break;else j++; } while(tab[z[z1]][a[v]]!=0||tab[z[z1]][a[v]]!=39); printf("Выходная лента:\n"); for(k=0;k<=j;k++) { printf("%d ",vl[k]); } return i; }; /*--------------------------УДАЛЕНИЕ ПРОБЕЛОВ---------------------------------------*/ /*int probel() { int i(0),k(0); for(i=0;i<=j-1;i++) { if(s[i]!=' '){s1[k]=s[i];k++;} } j=k; };*/ /*-------------------------------------------------------------------------*/ int main() { int w,i; clrscr(); //probel(); y=vvod(); w=0; a[w]=0; if(y==1) {lexica(); i=analiz();} if(y==2) { lexica1(); i=analiz1(); } getch(); return 0; }
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|