For翻譯成堆棧機代碼

/* Power by Keamou@CS@CITS@NKU */

C語言的for語句設計翻譯模式如下:

  1. lines   :   lines stmt '/n' { printf("%s/n", $2); }
  2.         |   lines '/n'
  3.         |
  4.         ;
  5. stmt    :   'f''o''r''('expr';'{gettmp($$); printf("label %s/n",$$);}
  6.             term ';' {gettmp($$); printf("gofalse %sout/n",$$); printf("goture %sstmt/n",$$); printf("label %sexpr3/n",$$);}
  7.             expr ')' {gettmp($$); printf("goto %s/n",$$); printf("label %sstmt/n",$$);}
  8.             mystmt     {gettmp($$); printf("goto %sexpr3/n",$$);             printf("label %sout/n",$$);}
  9.         |   expr ';'
  10.         ;
  11. mystmt  :   { uptmp(); gettmp($$); } stmt {downtmp();}
  12.         ;
  13. expr    :   letter '=' letter '+' digit          {getcode2($1,$3,$5,"+");}
  14.         |   letter '=' letter '-' digit           {getcode2($1,$3,$5,"-");}
  15.         |   letter '=' letter '*' digit           {getcode2($1,$3,$5,"*");}
  16.         |   letter '=' letter '/' digit           {getcode2($1,$3,$5,"/");}
  17.         |   letter '=' digit                   {getcode1($1,$3);}
  18.         |   letter '+' '+'                     {getcode2($1,$1,"1","+");}
  19.         |   letter '-' '-'                     {getcode2($1,$1,"1","-");}
  20.         ;
  21. term    :   letter '<' digit                   {getcode3($1,$3);}
  22.         |   letter '>' digit                   {getcode3($1,$3);}
  23.         |   letter '!' '=' digit                 {getcode3($1,$4);}
  24.         ;
  25. digit   :       '0'             { strcpy($$, "0"); }
  26.         |   (中間的8個數字略)
  27.         |   '9'             { strcpy($$, "9"); }
  28.         ;
  29. letter    :   'a'               { strcpy($$, "a"); }
  30.         |  …(中間的24個字母略)
  31.         |   'z'             { strcpy($$, "z"); }
  32.         |   'A'             { strcpy($$, "A"); }
  33.         |  …(中間的24個字母省略)
  34.         |   'Z'             { strcpy($$, "Z"); }
  35.         ;
  36. void getcode1(char *e1, char *e2){
  37.     printf("lvalue %s/n", e1);
  38.     printf("push   %s/n", e2);
  39. printf(":=/n");
  40. }
  41. void getcode2(char *dst, char *e1, char *e2, char *op){
  42.     printf("lvalue %s/n", dst);
  43.     printf("rvalue %s/n", e1);
  44.     printf("push   %s/n", e2);
  45.     printf("%s/n", op);
  46.     printf(":=/n");
  47. }
  48. void getcode3(char *e1, char *e2){
  49.     printf("rvalue %s/n", e1);
  50.     printf("push   %s/n", e2);
  51.     printf("-/n");
  52. }
  53. void gettmp(char *s){
  54.     sprintf(s,"tmp%d",tmp);   //tmp是全局變量,寫在文件頭裏
  55. }
  56. void uptmp(){
  57.     tmp++;
  58. }
  59. void downtmp(){
  60.     tmp--;
  61. }

此翻譯模式能夠將形如for(i=0;i<3;i++)j=i+1;C語句翻譯成堆棧代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章