/* Power by Keamou@CS@CITS@NKU */
为C语言的for语句设计翻译模式如下:
- lines : lines stmt '/n' { printf("%s/n", $2); }
- | lines '/n'
- |
- ;
- stmt : 'f''o''r''('expr';'{gettmp($$); printf("label %s/n",$$);}
- term ';' {gettmp($$); printf("gofalse %sout/n",$$); printf("goture %sstmt/n",$$); printf("label %sexpr3/n",$$);}
- expr ')' {gettmp($$); printf("goto %s/n",$$); printf("label %sstmt/n",$$);}
- mystmt {gettmp($$); printf("goto %sexpr3/n",$$); printf("label %sout/n",$$);}
- | expr ';'
- ;
- mystmt : { uptmp(); gettmp($$); } stmt {downtmp();}
- ;
- expr : letter '=' letter '+' digit {getcode2($1,$3,$5,"+");}
- | letter '=' letter '-' digit {getcode2($1,$3,$5,"-");}
- | letter '=' letter '*' digit {getcode2($1,$3,$5,"*");}
- | letter '=' letter '/' digit {getcode2($1,$3,$5,"/");}
- | letter '=' digit {getcode1($1,$3);}
- | letter '+' '+' {getcode2($1,$1,"1","+");}
- | letter '-' '-' {getcode2($1,$1,"1","-");}
- ;
- term : letter '<' digit {getcode3($1,$3);}
- | letter '>' digit {getcode3($1,$3);}
- | letter '!' '=' digit {getcode3($1,$4);}
- ;
- digit : '0' { strcpy($$, "0"); }
- | (中间的8个数字略)
- | '9' { strcpy($$, "9"); }
- ;
- letter : 'a' { strcpy($$, "a"); }
- | …(中间的24个字母略)
- | 'z' { strcpy($$, "z"); }
- | 'A' { strcpy($$, "A"); }
- | …(中间的24个字母省略)
- | 'Z' { strcpy($$, "Z"); }
- ;
- void getcode1(char *e1, char *e2){
- printf("lvalue %s/n", e1);
- printf("push %s/n", e2);
- printf(":=/n");
- }
- void getcode2(char *dst, char *e1, char *e2, char *op){
- printf("lvalue %s/n", dst);
- printf("rvalue %s/n", e1);
- printf("push %s/n", e2);
- printf("%s/n", op);
- printf(":=/n");
- }
- void getcode3(char *e1, char *e2){
- printf("rvalue %s/n", e1);
- printf("push %s/n", e2);
- printf("-/n");
- }
- void gettmp(char *s){
- sprintf(s,"tmp%d",tmp); //tmp是全局变量,写在文件头里
- }
- void uptmp(){
- tmp++;
- }
- void downtmp(){
- tmp--;
- }
此翻译模式能够将形如for(i=0;i<3;i++)j=i+1;的C语句翻译成堆栈代码。