📄 testparse.c
字号:
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",label1);//输出无条件转移指令
fprintf(fout,"LABEL%d:\n",label2);//设置label2标号
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
return(es);
}
//<for_stat>::= for(<expr>,<expr>,<expr>)<statement>
/*
<for_stat>::=for (<expression>;
@SETlabel↑label1< expression >@BRF↑label2@BR↑label3;
@SETlabel↑label4 < expression >@BR↓label1)
@SETlabel↓label3 <语句 >@BR↓label4@SETlabel↓label2
动作解释:
1. @SETlabel↓label1:设置标号label1
2. @BRF↑label2 :输出 BRF label2,
3. @BR↑label3:输出 BR label3,
4. @SETlabel↓label4:设置标号label4
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 + -