Advertisement
Guest User

LR(0) or SLR Parsing

a guest
Oct 1st, 2014
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.36 KB | None | 0 0
  1. #include<iostream.h>
  2. #include<conio.h>
  3. #include<string.h>
  4.  
  5. char prod[20][20],listofvar[26]="ABCDEFGHIJKLMNOPQR";
  6. int novar=1,i=0,j=0,k=0,n=0,m=0,arr[30];
  7. int noitem=0;
  8. struct Grammar
  9. {
  10. char lhs;
  11. char rhs[8];
  12. }g[20],item[20],clos[20][10];
  13.  
  14. int isvariable(char variable)
  15. {
  16. for(int i=0;i<novar;i++)
  17. if(g[i].lhs==variable)
  18. return i+1;
  19. return 0;
  20. }
  21. void findclosure(int z, char a)
  22. {
  23. int n=0,i=0,j=0,k=0,l=0;
  24. for(i=0;i<arr[z];i++)
  25. {
  26. for(j=0;j<strlen(clos[z][i].rhs);j++)
  27. {
  28. if(clos[z][i].rhs[j]=='.' && clos[z][i].rhs[j+1]==a)
  29. {
  30. clos[noitem][n].lhs=clos[z][i].lhs;
  31. strcpy(clos[noitem][n].rhs,clos[z][i].rhs);
  32. char temp=clos[noitem][n].rhs[j];
  33. clos[noitem][n].rhs[j]=clos[noitem][n].rhs[j+1];
  34. clos[noitem][n].rhs[j+1]=temp;
  35. n=n+1;
  36. }
  37. }
  38. }
  39. for(i=0;i<n;i++)
  40. {
  41. for(j=0;j<strlen(clos[noitem][i].rhs);j++)
  42. {
  43. if(clos[noitem][i].rhs[j]=='.' && isvariable(clos[noitem][i].rhs[j+1])>0)
  44. {
  45. for(k=0;k<novar;k++)
  46. {
  47. if(clos[noitem][i].rhs[j+1]==clos[0][k].lhs)
  48. {
  49. for(l=0;l<n;l++)
  50. if(clos[noitem][l].lhs==clos[0][k].lhs && strcmp(clos[noitem][l].rhs,clos[0][k].rhs)==0)
  51. break;
  52. if(l==n)
  53. {
  54. clos[noitem][n].lhs=clos[0][k].lhs;
  55. strcpy(clos[noitem][n].rhs,clos[0][k].rhs);
  56. n=n+1;
  57. }
  58. }
  59. }
  60. }
  61. }
  62. }
  63. arr[noitem]=n;
  64. int flag=0;
  65. for(i=0;i<noitem;i++)
  66. {
  67. if(arr[i]==n)
  68. {
  69. for(j=0;j<arr[i];j++)
  70. {
  71. int c=0;
  72. for(k=0;k<arr[i];k++)
  73. if(clos[noitem][k].lhs==clos[i][k].lhs && strcmp(clos[noitem][k].rhs,clos[i][k].rhs)==0)
  74. c=c+1;
  75. if(c==arr[i])
  76. {
  77. flag=1;
  78. goto exit;
  79. }
  80. }
  81. }
  82. }
  83. exit:;
  84. if(flag==0)
  85. arr[noitem++]=n;
  86. }
  87.  
  88. void main()
  89. {
  90. clrscr();
  91. cout<<"ENTER THE PRODUCTIONS OF THE GRAMMAR(0 TO END) :\n";
  92. do
  93. {
  94. cin>>prod[i++];
  95. }while(strcmp(prod[i-1],"0")!=0);
  96. for(n=0;n<i-1;n++)
  97. {
  98. m=0;
  99. j=novar;
  100. g[novar++].lhs=prod[n][0];
  101. for(k=3;k<strlen(prod[n]);k++)
  102. {
  103. if(prod[n][k] != '|')
  104. g[j].rhs[m++]=prod[n][k];
  105. if(prod[n][k]=='|')
  106. {
  107. g[j].rhs[m]='\0';
  108. m=0;
  109. j=novar;
  110. g[novar++].lhs=prod[n][0];
  111. }
  112. }
  113. }
  114. for(i=0;i<26;i++)
  115. if(!isvariable(listofvar[i]))
  116. break;
  117. g[0].lhs=listofvar[i];
  118. char temp[2]={g[1].lhs,'\0'};
  119. strcat(g[0].rhs,temp);
  120. cout<<"\n\n augumented grammar \n";
  121. for(i=0;i<novar;i++)
  122. cout<<endl<<g[i].lhs<<"->"<<g[i].rhs<<" ";
  123. getch();
  124. for(i=0;i<novar;i++)
  125. {
  126. clos[noitem][i].lhs=g[i].lhs;
  127. strcpy(clos[noitem][i].rhs,g[i].rhs);
  128. if(strcmp(clos[noitem][i].rhs,"ε")==0)
  129. strcpy(clos[noitem][i].rhs,".");
  130. else
  131. {
  132. for(int j=strlen(clos[noitem][i].rhs)+1;j>=0;j--)
  133. clos[noitem][i].rhs[j]=clos[noitem][i].rhs[j-1];
  134. clos[noitem][i].rhs[0]='.';
  135. }
  136. }
  137. arr[noitem++]=novar;
  138. for(int z=0;z<noitem;z++)
  139. {
  140. char list[10];
  141. int l=0;
  142. for(j=0;j<arr[z];j++)
  143. {
  144. for(k=0;k<strlen(clos[z][j].rhs)-1;k++)
  145. {
  146. if(clos[z][j].rhs[k]=='.')
  147. {
  148. for(m=0;m<l;m++)
  149. if(list[m]==clos[z][j].rhs[k+1])
  150. break;
  151. if(m==l)
  152. list[l++]=clos[z][j].rhs[k+1];
  153. }
  154. }
  155. }
  156. for(int x=0;x<l;x++)
  157. findclosure(z,list[x]);
  158. }
  159. cout<<"\n THE SET OF ITEMS ARE \n\n";
  160. for(z=0;z<noitem;z++)
  161. {
  162. cout<<"\n I"<<z<<"\n\n";
  163. for(j=0;j<arr[z];j++)
  164. cout<<clos[z][j].lhs<<"->"<<clos[z][j].rhs<<"\n";
  165. getch();
  166. }
  167. getch();
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement