Advertisement
Guest User

HEJ SOKOŁY

a guest
Dec 17th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.54 KB | None | 0 0
  1. // Lab7 Parser Zstepujacy
  2.  
  3. #include<stdio.h>
  4. #include<string.h>
  5. #include<stdlib.h>
  6.  
  7. #define max_il_synow 3
  8. #define max_szer_druku 100
  9. #define max_wys_druku 40
  10.  
  11. typedef enum { FALSE = 0, TRUE = 1 } Boolean;
  12.  
  13. typedef enum {
  14. Xx = 0,
  15. } nieterminal;
  16.  
  17. typedef struct dr {
  18. Boolean czyterm;
  19. int ile;
  20. char lk; // o ile czyterm = TRUE
  21. nieterminal ntm; // o ile czyterm = FALSE
  22. int il_syn; // o ile czyterm = FALSE
  23. struct dr* syn[max_il_synow]; // o ile czyterm = FALSE
  24. } drzewo;
  25.  
  26. //------------------------------------------------------
  27. // POMOCNICZE:
  28.  
  29. char leks;
  30.  
  31. Boolean nowyleks(char c, char* nleks) {
  32. // jesli na wejsciu stoi znak c , to go sczytuje,
  33. // zapamietuje w nleks i oddaje TRUE;
  34. // jesli tam stoi inny znak, to nic nie wczytuje i oddaje FALSE
  35. if (leks == c) {
  36. *nleks = c;
  37. do { scanf("%c", &leks); }
  38. while ((leks < '!' || leks > '~') && leks != '\n');
  39. return TRUE;
  40. }
  41. else return FALSE;
  42. }
  43.  
  44. Boolean blad (char s[]) {
  45. // sygnalizacja bledu:
  46. // drukuje napis s a nastepnie przerywa wykonanie programu
  47. printf ("\n BLAD: %s\n\n", s); exit(1);
  48. return FALSE;
  49. }
  50.  
  51. //------------------------------------------------------
  52. // Serce parsera:
  53. // PO JEDNEJ PROCEDURZE REKURSYWNEJ NA KAZDY NIETERMINAL
  54.  
  55. //x(drzewo* drz);
  56.  
  57. Boolean xniet(drzewo* drz){
  58. drzewo drz1; char nleks;
  59. if(nowyleks('a', &nleks)){
  60. // Jesli po a nie ma nic to terminal a jest ok
  61. // Jesli jest b to może ono wystapic dowolna n liczbe razy, potem terminal a,
  62. // nastepnie terminal c n liczbe razy i ok
  63. drz-> czyterm = TRUE;
  64. drz->syn[0]->lk = nleks;
  65. if(nowyleks(' ',&nleks)){
  66. return TRUE;
  67. }
  68. while(nowyleks('b', &nleks)){
  69. drz->czyterm = TRUE;
  70. drz->ile++;
  71. drz->syn[0]->lk = nleks;
  72. }
  73. if(!nowyleks('a',&nleks)){
  74. return FALSE;
  75. }
  76. while(nowyleks('b', &nleks)){
  77. drz1 = *drz;
  78. drz->czyterm = TRUE;
  79. drz->ile++;
  80. drz->syn[0]->lk = nleks;
  81. }
  82. //if(drz.ile!=drz1.ile) return FALSE;
  83. return TRUE;
  84. }
  85. return FALSE;
  86. }
  87. Boolean XX(drzewo* drz){
  88. drzewo drz1,drz2;
  89. char nleks;
  90. if(nowyleks('a',&nleks)){
  91. drz->czyterm=FALSE;
  92. drz->ntm=Xx;
  93. drz->il_syn=1;
  94. drz->syn[0]=(drzewo*)malloc(sizeof(drzewo));
  95. drz->syn[0]->czyterm=TRUE;
  96. drz->syn[0]->lk='a';
  97. while(nowyleks('b',&nleks)){
  98. if(XX(&drz1)){
  99. if(nowyleks('c',&nleks)){
  100. drz2=*drz;
  101. drz->czyterm=FALSE;
  102. drz->ntm=Xx;
  103. drz->il_syn=4;
  104. drz->syn[0] = (drzewo*)malloc(sizeof(drzewo));
  105. *(drz->syn[0])=drz2;
  106. }
  107. else blad("zle");}
  108. else blad("zle2");
  109. }
  110. return TRUE;
  111. }
  112. else return FALSE;
  113. }
  114.  
  115.  
  116.  
  117. //------------------------------------------------------
  118. // Pomocnicze: DRUKOWANIE DRZEWA
  119.  
  120. char druk [max_szer_druku][max_wys_druku];
  121.  
  122.  
  123. void dr_drz (drzewo drz, int* szer, int* wys) {
  124. int szer_syna[max_il_synow], wys_syna[max_il_synow], i,j;
  125. if (drz.czyterm) {
  126. *szer=*szer+3; *wys=1; druk[*szer-1][*wys-1] = drz.lk;
  127. }
  128. else { // Drzewo nieterminalowe:
  129. *wys = 0;
  130. for (i=0; i<drz.il_syn; i++) {
  131. dr_drz (*drz.syn[i], szer, &wys_syna[i]);
  132. szer_syna[i] = *szer;
  133. if (*wys < wys_syna[i]) *wys = wys_syna[i];
  134. }
  135. switch (drz.ntm) {
  136. case Xx : druk[*szer-1][*wys+1] = 'Xx'; break;
  137. }
  138. if (drz.il_syn > 0) {
  139. for (i=0; i<drz.il_syn; i++)
  140. for (j=wys_syna[i]; j<*wys+1; j++)
  141. druk[szer_syna[i]-1][j] = '|';
  142. for (i=szer_syna[0]; i<*szer-1; i++) druk[i][*wys+1] = '-';
  143. for (i=0; i<drz.il_syn-1; i++)
  144. druk[szer_syna[i]-1][*wys+1] = ',';
  145. }
  146. *wys = *wys+2;
  147. }
  148. }
  149.  
  150.  
  151. void drukuj_drzewo (drzewo drz) {
  152. int szer,wys,i,j;
  153. for (i=0; i<max_szer_druku; i++)
  154. for (j=0; j<max_wys_druku; j++) druk[i][j] = ' ';
  155. szer=0; dr_drz (drz, &szer, &wys);
  156. for (j=wys-1; j>=0; j--) {
  157. for (i=0; i<szer; i++) printf("%c",druk[i][j]);
  158. printf("\n");
  159. }
  160. printf("\n");
  161. }
  162.  
  163. //------------------------------------------------------
  164. // Program glowny:
  165.  
  166. int main() {
  167. drzewo drz; Boolean ok;
  168.  
  169. // Wczytanie pierwszego znaku (z pominieciem niewidocznych:
  170. do { scanf("%c", &leks); }
  171. while ((leks < '!' || leks > '~') && leks != '\n');
  172.  
  173. ok = XX(&drz); printf ("\n");
  174. if (ok && leks == '\n') drukuj_drzewo (drz);
  175. else
  176. if (ok && leks != '\n') {
  177. drukuj_drzewo (drz);
  178. printf (" SMIECI NA KONCU: %c\n\n", leks);
  179. }
  180. else printf (" WYRAZENIE BLEDNE\n\n");
  181.  
  182. return 0;
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement