?? testparse.c
字號:
5. @BR↑label1:輸出 BR label1,
6. @SETlabel↓label3:設置標號label3
7. @BR↑label4:輸出 BR label4,
8. @SETlabel↓label2:設置標號label2
*/
int for_stat()
{
int es=0,label1,label2,label3,label4;
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
if (strcmp(token,"(")) return(es=5); //少左括號
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
es=expression();
if (es>0) return(es);
if (strcmp(token,";")) return(es=4); //少分號
label1=labelp++;
fprintf(fout,"LABEL%d:\n",label1);//設置label1標號
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
es=expression();
if (es>0) return(es);
label2=labelp++;
fprintf(fout," BRF LABEL%d\n",label2);//輸出假條件轉移指令
label3=labelp++;
fprintf(fout," BR LABEL%d\n",label3);//輸出無條件轉移指令
if (strcmp(token,";")) return(es=4); //少分號
label4=labelp++;
fprintf(fout,"LABEL%d:\n",label4);//設置label4標號
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
es=expression();
if (es>0) return(es);
fprintf(fout," BR LABEL%d\n",label1);//輸出無條件轉移指令
if (strcmp(token,")")) return(es=6); //少右括號
fprintf(fout,"LABEL%d:\n",label3);//設置label3標號
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
es=statement();
if (es>0) return(es);
fprintf(fout," BR LABEL%d\n",label4);//輸出無條件轉移指令
fprintf(fout,"LABEL%d:\n",label2);//設置label2標號
return(es);
}
//<write_stat>::=write <expression>;
//<write_stat>::=write <expression>@OUT;
//動作解釋:
//@ OUT:輸出 OUT
int write_stat()
{
int es=0;
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
es=expression();
if (es>0)return(es);
if (strcmp(token,";")) return(es=4); //少分號
fprintf(fout," OUT\n");//輸出指令
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
return(es);
}
//<read_stat>::=read ID;
//<read_stat>::=read ID↑n LOOK↓n↑d @IN@STI↓d;
//動作解釋:
//@LOOK↓n↑d:查符號表n,給出變量地址d; 沒有,變量沒定義
//@IN:輸出IN
//@STI↓d:輸出指令代碼STI d
int read_stat()
{
int es=0,address;
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
if (strcmp(token,"ID")) return(es=3); //少標識符
es=lookup(token1,&address);
if (es>0) return(es);
fprintf(fout," IN \n");//輸入指令
fprintf(fout," STI %d\n",address);//指令
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
if (strcmp(token,";")) return(es=4); //少分號
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
return(es);
}
//<compound_stat>::={<statement_list>}
int compound_stat(){ //復合語句函數
int es=0;
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
es=statement_list();
return(es);
}
//<expression_stat>::=<expression>;|;
int expression_stat()
{
int es=0;
if (strcmp(token,";")==0)
{
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
return(es);
}
es=expression();
if (es>0) return(es);
if (strcmp(token,";")==0)
{
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
return(es);
} else
{
es=4;
return(es);//少分號
}
}
//<expression>::=ID↑n@LOOK↓n↑d@ASSIGN=<bool_expr>@STO↓d |<bool_expr>
int expression()
{
int es=0,fileadd;
char token2[20],token3[40];
if (strcmp(token,"ID")==0)
{
fileadd=ftell(fp); //@ASSIGN記住當前文件位置
fscanf(fp,"%s %s\n", &token2,&token3);
printf("%s %s\n",token2,token3);
if (strcmp(token2,"=")==0) //'='
{
int address;
es=lookup(token1,&address);
if (es>0) return(es);
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
es=bool_expr();
if (es>0) return(es);
fprintf(fout," STO %d\n",address);
} else
{
fseek(fp,fileadd,0); //若非'='則文件指針回到'='前的標識符
printf("%s %s\n",token,token1);
es=bool_expr();
if (es>0) return(es);
}
}
return(es);
}
//<bool_expr>::=<additive_expr>
// |< additive_expr >(>|<|>=|<=|==|!=)< additive_expr >
/*
<bool_expr>::=<additive_expr>
|< additive_expr >><additive_expr>@GT
|< additive_expr ><<additive_expr>@LES
|< additive_expr >>=<additive_expr >@GE
|< additive_expr ><=< additive_expr >@LE
|< additive_expr >==< additive_expr >@EQ
|< additive_expr >!=< additive_expr >@NOTEQ
*/
int bool_expr()
{
int es=0;
es=additive_expr();
if(es>0) return(es);
if ( strcmp(token,">")==0 || strcmp(token,">=")==0
||strcmp(token,"<")==0 || strcmp(token,"<=")==0
||strcmp(token,"==")==0|| strcmp(token,"!=")==0)
{
char token2[20];
strcpy(token2,token);//保存運算符
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
es=additive_expr();
if(es>0) return(es);
if ( strcmp(token2,">")==0 ) fprintf(fout," GT\n");
if ( strcmp(token2,">=")==0 ) fprintf(fout," GE\n");
if ( strcmp(token2,"<")==0 ) fprintf(fout," LES\n");
if ( strcmp(token2,"<=")==0 ) fprintf(fout," LE\n");
if ( strcmp(token2,"==")==0 ) fprintf(fout," EQ\n");
if ( strcmp(token2,"!=")==0 ) fprintf(fout," NOTEQ\n");
}
return(es);
}
//<additive_expr>::=<term>{(+|-)< term >}
//< additive_expr>::=<term>{(+< term >@ADD |-<項>@SUB)}
int additive_expr()
{
int es=0;
es=term();
if(es>0) return(es);
while (strcmp(token,"+")==0 || strcmp(token,"-")==0)
{
char token2[20];
strcpy(token2,token);
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
es=term();
if(es>0) return(es);
if ( strcmp(token2,"+")==0 ) fprintf(fout," ADD\n");
if ( strcmp(token2,"-")==0 ) fprintf(fout," SUB\n");
}
return(es);
}
//< term >::=<factor>{(*| /)< factor >}
//< term >::=<factor>{(*< factor >@MULT | /< factor >@DIV)}
int term()
{
int es=0;
es=factor();
if(es>0) return(es);
while (strcmp(token,"*")==0 || strcmp(token,"/")==0)
{
char token2[20];
strcpy(token2,token);
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
es=factor();
if(es>0) return(es);
if ( strcmp(token2,"*")==0 ) fprintf(fout," MULT\n");
if ( strcmp(token2,"/")==0 ) fprintf(fout," DIV\n");
}
return(es);
}
//< factor >::=(<additive_expr>)| ID|NUM
//< factor >::=(< expression >)| ID↑n@LOOK↓n↑d@LOAD↓d |NUM↑i@LOADI↓i
int factor()
{
int es=0;
if (strcmp(token,"(")==0)
{
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
es=expression();
if (es>0) return(es);
if (strcmp(token,")")) return(es=6); //少右括號
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
} else
{
if (strcmp(token,"ID")==0)
{
int address;
es=lookup(token1,&address);//查符號表,獲取變量地址
if (es>0) return(es);//變量沒聲明
fprintf(fout," LOAD %d\n",address);
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
return(es);
}
if (strcmp(token,"NUM")==0)
{
fprintf(fout," LOADI %s\n",token1);
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
return(es);
}else
{
es=7;//缺少操作數
return(es);
}
}
return(es);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -