Конвертер программы с подмножества языка Си в Паскаль с использованием LL(1) метода синтаксического анализа (выражения)

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

++, --, +, -, ==, !=, =, *=, -=, +=, /=, %=, =, *, /, %, (, ), ?, :, ,, &&, ||}

N(TP)={B, П, C, M, S}

T(TP)={ i, +, -, =, =, *, /, div, mod, and, or, (, ), ,}

 

Устранив цепные правила, левую рекурсию, получим LL(1)-грамматику.

C\C++

  1. Bi B1
  2. B1= BB
  3. B1*=BB
  4. B1+=BB
  5. B1-BB
  6. B1/BB
  7. B1--B
  8. B1++B
  9. B1(SS1
  10. S1)B
  11. B(B2
  12. B2i B1C
  13. C)B
  14. B2(B2C
  15. B2--C1 C
  16. C1i B
  17. B2++C1 C
  18. B2k C2
  19. C2)BB
  20. B--C1
  21. B++C1
  22. B1
  23. B1*BB
  24. B1/BB
  25. B1+BB
  26. B1-BB
  27. B1>BB
  28. B1<BB
  29. B1<=BB
  30. B1>=BB
  31. B1==BB
  32. B1!=BB
  33. B1&&BB
  34. B1||BB
  35. B1?BB3
  36. B3:BB
  37. B1$
  38. B
  39. B*BB
  40. B/BB
  41. B+BB
  42. B-BB
  43. B>BB
  44. B<BB
  45. B>=BB
  46. B<=BB
  47. B==BB
  48. B!=BB
  49. B&&BB
  50. B||BB
  51. B?BB3
  52. B1%=BB
  53. B$
  54. Si B1 S
  55. S (B2S
  56. S--C1S
  57. S++C1S
  58. S, S
  59. S$
  60. ДОПУСТИТЬ
  61. 0.Отвергнуть

 

Turbo Pascal 7.0

  1. B+CПB
  2. B- CПB
  3. Bi MCПB
  4. B(BM1CПB
  5. B=П
  6. B<П
  7. B>П
  8. B<>П
  9. B>=П
  10. B<=П
  11. B$
  12. П+CП
  13. П-CП
  14. П i MCП
  15. П(BM1CП
  16. П+CП
  17. П-CП
  18. П or CП
  19. П$
  20. MI M
  21. M(BM1
  22. M(SM1
  23. M$
  24. M1)
  25. Ci MC
  26. C(BMC
  27. C*MC
  28. C/MC
  29. Cdiv MC
  30. Cmod MC
  31. Cand MC
  32. C$
  33. S+CПBS
  34. S-CПBS
  35. Si MCПBS
  36. S(B M1CПB
  37. S, S
  38. S$
  39. ДОПУСТИТЬ
  40. Отвергнуть

 

 

Так как данные LL(1)-грамматики являются грамматиками Грейбаха, то по ним можно построить управляющие таблицы.

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

|-37535960%=52/=6-=5+=4*=3=2,375358:36?3551&&3349||3450==3147!=32482743<2844-2642+2541/2440*233938--5620715++5721817K18I5411216)375313195910(5511914SBB1B2B3BCC1C2SS1#

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

|-113223193839Or3223188322319=5322319And3123Mod3023Div2923/2823*2723-34232231317+33132231216,1132231937I353252014)113223241938(36426212215SBBCCMMM1ПП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

Заменить(ВПCM) Сдвиг

Вытолкнуть Держать

Вытолкнуть Держать

Вытолкнуть Держать

Заменить(П) Сдвиг

Заменить(ПCM) Сдвиг

Вытолкнуть Держать

Вытолкнуть Держать

Заменить(ПC) Сдвиг

Заменить(CM) Сдвиг

Вытолкнуть Держать

Вытолкнуть Держать

Вытолкнуть Держать

ДОПУСТИТЬ

Выходная лента:

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

Заменить(ВПCM) Сдвиг

Вытолкнуть Держать

Вытолкнуть Держать

Вытолкнуть Держать

Заменить(П) Сдвиг

Заменить(ПCM) Сдвиг

Вытолкнуть Держать

Вытолкнуть Держать

Заменить(ПC) Сдвиг

Отвергнуть

Выходная лента:

3 23 32 19 5 14 23 32 16 0

 

 

 

Листинг программы:

 

#include

#include

#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,