Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Построение управляющих таблиц

Определим выражение в виде БНФ для языка С\С++ и 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)-грамматики являются грамматиками Грейбаха, то по ним можно построить управляющие таблицы.

Управляющая таблица для выражения на языке С\С++

|-     37     53       59   60
%=     52                  
/=     6                  
-=     5                  
+=     4                  
*=     3                  
=     2                  
,     37     53       58    
:         36              
?     35     51            
&&     33     49            
||     34     50            
==     31     47            
!=     32     48            
<=     29     46            
>=     30     45            
>     27     43            
<     28     44            
-     26     42            
+     25     41            
/     24     40            
*     23     39            
%     22     38            
-- 56 20 7 15                
++ 57 21 8 17                
K       18                
I 54 1   12       16        
)     37     53 13   19 59 10  
( 55 11 9 14                
  S B B1 B2 B3 B’ C C1 C2 S’ S1 #

 

Управляющая таблица для выражения на языке Turbo Pascal 7.0

|-     11   32   23     19 38 39
Or         32   23     18    
<=     10   32   23     19    
>=     9   32   23     19    
>     7   32   23     19    
<     6   32   23     19    
<>     8   32   23     19    
=     5   32   23     19    
And         31   23          
Mod         30   23          
Div         29   23          
/         28   23          
*         27   23          
- 34 2     32   23   13 17    
+ 33 1     32   23   12 16    
,     11   32   23     19 37  
I 35 3   25   20     14      
)     11   32   23 24   19 38  
( 36 4   26   21 22   15      
  S B B’ C C’ M M’ M1 П П’ S’ #

 

Пример работы программы

Ввели выражение на языке СИ:

КУРСОВАЯ РАБОТА ПО ЯПМТ

Выберете язык: 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...