Advertisement
Guest User

Untitled

a guest
Jul 9th, 2017
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
BNF 2.27 KB | None | 0 0
  1. %{
  2. #include <stdio.h>
  3. #include <string.h>
  4. void yyerror(char*);
  5. int yylex();
  6.  
  7. int p;
  8. int C[64][64];
  9. int S[64];
  10. int T[64];
  11. char info[64][16];
  12. %}
  13.  
  14. %union{
  15.   int id;
  16.   char nm[16];
  17. }
  18.  
  19. %token<nm> SYM
  20. %token<nm> NUM
  21. %token  INT
  22. %token  MAIN
  23. %token FOR
  24. %token OUTPUT
  25. %token INPUT
  26.  
  27. %token LP RP
  28. %token LB RB
  29. %token LSB RSB
  30. %token CO
  31. %token ADD LE SUB  ASS
  32. %token SEMI
  33.  
  34. %type<id> stmt_list
  35. %type<id> stmt
  36. %type<id> ass
  37. %type<id> term
  38. %type<id> lval
  39. %type<id> pred
  40. %type<id> decl
  41. %type<id> expr
  42.  
  43. %%
  44.  
  45. program:
  46. program MAIN LP RP LB stmt_list RB
  47. {int i,t;
  48.   printf("\tsection .bss\n");
  49.   for(i=0;i<S[$6];++i){
  50.     t=C[$6][i];
  51.     if(T[t]==0) printf("%s\tresw\t2\n",info[t]);
  52.     else if(T[t]==1) printf("%s\tresw\t2*%s\n",info[t],info[C[t][0]]);
  53.   }
  54.   printf("\tsection .text\n\tglobal main\nmain:\n");
  55.   printf("\tpush ebp\n\tmov ebp, esp\n");
  56.  
  57. }
  58. |
  59. ;
  60.  
  61. stmt_list:
  62. stmt_list stmt SEMI
  63. {$$=$1;
  64.   C[$$][S[$$]++]=$2;
  65. }
  66. | {$$=p++;}
  67. ;
  68.  
  69. stmt:
  70. ass
  71. {$$=$1;}
  72. |decl
  73. {$$=$1;}
  74. |FOR LP ass SEMI pred SEMI ass RP stmt  {}
  75. |INPUT LP term RP  {}
  76. |OUTPUT LP term RP  {}
  77. ;
  78.  
  79. pred:
  80. SYM LE SYM {}
  81. ;
  82.  
  83. decl:
  84. INT SYM
  85. {$$=p++;
  86.   memset(info[$$],0,sizeof(info[$$]));
  87.   memcpy(info[$$],$2,strlen($2));
  88.   T[$$]=0;
  89. }
  90. |INT SYM LSB NUM RSB
  91. {int t;
  92.   $$=p++;
  93.   memset(info[$$],0,sizeof(info[$$]));
  94.   memcpy(info[$$],$2,strlen($2));
  95.   t=C[$$][0]=p++;S[$$]=1;
  96.   T[$$]=1;
  97.   memset(info[t],0,sizeof(info[t]));
  98.   memcpy(info[t],$4,strlen($4));
  99. }
  100. ;
  101.  
  102. ass:
  103. lval ASS expr
  104. {$$=p++;
  105.   T[$$]=2;
  106.   S[$$]=2;
  107.   C[$$][0]=$1;C[$$][1]=$3;
  108. }
  109. ;
  110.  
  111. expr:
  112. term {$$=$1;T[$$]=3;}
  113. |expr ADD term
  114. {$$=$1;T[$$]=3;
  115. }
  116. |expr SUB term
  117. {$$=$1;T[$$]=3;
  118. }
  119. ;
  120.  
  121. term:
  122. NUM
  123. {$$=p++;
  124.   memset(info[$$],0,sizeof(info[$$]));
  125.   memcpy(info[$$],$1,strlen($1));
  126. }
  127. |lval
  128. {$$=$1;
  129. }
  130. ;
  131.  
  132. lval:
  133. SYM
  134. {$$=p++;
  135.   memset(info[$$],0,sizeof(info[$$]));
  136.   memcpy(info[$$],$1,strlen($1));
  137. }
  138. |SYM LSB expr RSB
  139. {$$=p++;
  140.   memset(info[$$],0,sizeof(info[$$]));
  141.   memcpy(info[$$],$1,strlen($1));
  142. }
  143. ;
  144.  
  145. %%
  146.  
  147. void yyerror(char* s){
  148.   fprintf(stderr,"%s\n",s);
  149. }
  150.  
  151. int main(){
  152.   //header
  153.   printf("\
  154.        extern scanf\n\
  155.        extern printf\n\
  156. \
  157.     section .data\n\
  158. ifmt    db  \"%%d\",0\n\
  159. ofmt    db  \"%%d\",10,0\n");
  160.  
  161.  
  162.   p=0;
  163.   memset(S,0,sizeof(S));
  164.  
  165.   yyparse();
  166.   return 0;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement