fork download
  1. <int.l>
  2. %{
  3. #include"y.tab.h"
  4. #include<stdio.h>
  5. #include<string.h>
  6. int LineNo=1;
  7. %}
  8. identifier [a-zA-Z][_a-zA-Z0-9]*
  9. number [0-9]+|([0-9]*\.[0-9]+)
  10. %%
  11. main\(\) return MAIN;
  12. if return IF;
  13. else return ELSE;
  14. while return WHILE;
  15. int |
  16. char |
  17. float return TYPE;
  18. {identifier} {strcpy(yylval.var,yytext);
  19. return VAR;}
  20. {number} {strcpy(yylval.var,yytext);
  21. return NUM;}
  22. < |> |>= |<= |== {strcpy(yylval.var,yytext);
  23. return RELOP;}
  24. [ \t] ;
  25. \n LineNo++;
  26. . return yytext[0];
  27. %%
  28. <int.y>
  29. %{
  30. #include<string.h>
  31. #include<stdio.h>
  32. struct quad{
  33. char op[5];
  34. char arg1[10];
  35. char arg2[10];
  36. charresult[10];
  37. }QUAD[30];
  38. struct stack{
  39. int items[100];
  40. int top;
  41. }stk;
  42. int Index=0,tIndex=0,StNo,Ind,tInd;
  43.  
  44. extern int LineNo;
  45. %}
  46. %union{
  47. char var[10];
  48. }
  49. %token <var> NUM VAR RELOP
  50. %token MAIN IF ELSE WHILE TYPE
  51. %type <var> EXPR ASSIGNMENT CONDITION IFST ELSEST WHILELOOP
  52. %left '-' '+'
  53. %left '*' '/'
  54. %%
  55. PROGRAM : MAIN BLOCK
  56. ;
  57. BLOCK: '{' CODE '}'
  58. ;
  59. CODE: BLOCK
  60. | STATEMENT CODE
  61. | STATEMENT
  62. ;
  63. STATEMENT: DESCT ';'
  64. | ASSIGNMENT ';'
  65. | CONDST
  66. | WHILEST
  67. ;
  68. DESCT: TYPE VARLIST
  69. ;
  70. VARLIST: VAR ',' VARLIST
  71. | VAR
  72. ;
  73. ASSIGNMENT: VAR '=' EXPR{
  74. strcpy(QUAD[Index].op,"=");
  75. strcpy(QUAD[Index].arg1,$3);
  76. strcpy(QUAD[Index].arg2,"");
  77. strcpy(QUAD[Index].result,$1);
  78. strcpy($$,QUAD[Index++].result);
  79. }
  80. ;
  81. EXPR: EXPR '+' EXPR {AddQuadruple("+",$1,$3,$$);}
  82. | EXPR '-' EXPR {AddQuadruple("-",$1,$3,$$);}
  83. | EXPR '*' EXPR {AddQuadruple("*",$1,$3,$$);}
  84. | EXPR '/' EXPR {AddQuadruple("/",$1,$3,$$);}
  85. | '-' EXPR {AddQuadruple("UMIN",$2,"",$$);}
  86. | '(' EXPR ')' {strcpy($$,$2);}
  87. | VAR
  88. | NUM
  89. ;
  90. CONDST: IFST{
  91. Ind=pop();
  92. sprintf(QUAD[Ind].result,"%d",Index);
  93. Ind=pop();
  94. sprintf(QUAD[Ind].result,"%d",Index);
  95. }
  96. | IFST ELSEST
  97. ;
  98. IFST: IF '(' CONDITION ')' {
  99. strcpy(QUAD[Index].op,"==");
  100. strcpy(QUAD[Index].arg1,$3);
  101. strcpy(QUAD[Index].arg2,"FALSE");
  102. strcpy(QUAD[Index].result,"-1");
  103. push(Index);
  104.  
  105. Index++;
  106. }
  107. BLOCK {
  108. strcpy(QUAD[Index].op,"GOTO");
  109. strcpy(QUAD[Index].arg1,"");
  110. strcpy(QUAD[Index].arg2,"");
  111. strcpy(QUAD[Index].result,"-1");
  112. push(Index);
  113. Index++;
  114. };
  115. ELSEST: ELSE{
  116. tInd=pop();
  117. Ind=pop();
  118. push(tInd);
  119. sprintf(QUAD[Ind].result,"%d",Index);
  120. }
  121. BLOCK{
  122. Ind=pop();
  123. sprintf(QUAD[Ind].result,"%d",Index);
  124. };
  125. CONDITION: VAR RELOP VAR {AddQuadruple($2,$1,$3,$$);
  126. StNo=Index-1;
  127. }
  128. | VAR
  129. | NUM
  130. ;
  131. WHILEST: WHILELOOP{
  132. Ind=pop();
  133. sprintf(QUAD[Ind].result,"%d",StNo);
  134. Ind=pop();
  135. sprintf(QUAD[Ind].result,"%d",Index);
  136. }
  137. ;
  138. WHILELOOP: WHILE '(' CONDITION ')' {
  139. strcpy(QUAD[Index].op,"==");
  140. strcpy(QUAD[Index].arg1,$3);
  141. strcpy(QUAD[Index].arg2,"FALSE");
  142. strcpy(QUAD[Index].result,"-1");
  143. push(Index);
  144. Index++;
  145. }
  146. BLOCK {
  147. strcpy(QUAD[Index].op,"GOTO");
  148. strcpy(QUAD[Index].arg1,"");
  149. strcpy(QUAD[Index].arg2,"");
  150. strcpy(QUAD[Index].result,"-1");
  151. push(Index);
  152. Index++;
  153. }
  154. ;
  155. %%
  156. extern FILE *yyin;
  157. int main(int argc,char *argv[]) {
  158. FILE *fp;
  159. int i;
  160. if(argc>1){
  161. fp=fopen(argv[1],"r");
  162. if(!fp) {
  163. printf("\n File not found");
  164. exit(0);
  165.  
  166. }
  167. yyin=fp;
  168. }
  169. yyparse();
  170. printf("\n\n\t\t---------------------------- ""\n\t\t Pos Operator Arg1 Arg2 Result" "\n\t\t
  171. ");
  172. for(i=0;i<Index;i++)
  173. {
  174. printf("\n\t\t %d\t %s\t %s\t %s\t
  175. %s",i,QUAD[i].op,QUAD[i].arg1,QUAD[i].arg2,QUAD[i].result);
  176. }
  177. printf("\n\t\t ");
  178. printf("\n\n");
  179. return 0;
  180. }
  181. void push(int data){
  182. stk.top++;
  183. if(stk.top==100)
  184. {
  185. printf("\n Stack overflow\n");
  186. exit(0);
  187. }
  188. stk.items[stk.top]=data;
  189. }
  190. int pop()
  191. {
  192. int data;
  193. if(stk.top==-1){
  194. printf("\n Stack underflow\n");
  195. exit(0);}
  196. data=stk.items[stk.top--];
  197. return data;
  198. }
  199. void AddQuadruple(char op[5],char arg1[10],char arg2[10],char result[10])
  200. {
  201. strcpy(QUAD[Index].op,op);
  202. strcpy(QUAD[Index].arg1,arg1);
  203. strcpy(QUAD[Index].arg2,arg2);
  204. sprintf(QUAD[Index].result,"t%d",tIndex++);
  205. strcpy(result,QUAD[Index++].result);
  206. }
  207. yyerror()
  208. {
  209. printf("\n Error on line no:%d",LineNo);
  210. }
Success #stdin #stdout #stderr 0.04s 6900KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
ERROR: /home/Y83vBe/prog:1:1: Syntax error: Operator expected
ERROR: /home/Y83vBe/prog:210:0: Syntax error: Unexpected end of file
ERROR: '$runtoplevel'/0: Undefined procedure: program/0
   Exception: (3) program ? EOF: exit