📄 parser.c
字号:
/**** parser.c *****/
#include "global.h"
int compute(int lval,int rval,int op)
{
switch(op){
case '+':return lval+rval;
case '-':return lval-rval;
case '*':return lval*rval;
case '/':return lval/rval;
case DIV:return lval/rval;
case MOD:return lval%rval;
default:printf("unknown operator.\n");anserror=1;exit(1);
}
}
int lookahead;
void expr();
void match(int t)
{
if(lookahead==t)
lookahead=lexan();
else error("syntax error");
}
void factor()
{
int tt,ttv;
switch(lookahead){
case '(':
match('(');expr();match(')');break;
case NUM:
emit(NUM,tokenval);match(NUM);break;
/*case ID:
emit(ID,tokenval);match(ID);break;*/
case ID:
{tt=lookahead;ttv=tokenval;match(ID);
if(lookahead=='='){//id=expr();
if(functype==0) {printf("lvalue ");fprintf(fpw,"lvalue ");}
if(functype==1) {
printf("%s ",symtable[ttv].lexptr);fprintf(fpw,"%s ",symtable[ttv].lexptr);
match('=');expr();
if(anserror!=1){printf("= ");fprintf(fpw,"= ");}
break;
}
emit(tt,ttv);
match('=');
expr();
printf("=\n");fprintf(fpw,"=\n");
break;
}
else{//id;
if(functype==0) {printf("rvalue ");fprintf(fpw,"rvalue ");}
if(functype==1) {
anserror=1;
}
emit(tt,ttv);
break;
}
}
default:
error("syntax error");
}
}
void term()
{
int t;
factor();
while(1)
switch(lookahead){
case '*':
case '/':
case DIV:
case MOD: t=lookahead;match(lookahead);factor();emit(t,NONE);continue;
default:return;
}
}
void expr()
{
int t;
term();
while(1)
switch(lookahead){
case '+':
case '-': t=lookahead;match(lookahead);term();emit(t,NONE);continue;
default :return;
}
}
void parse()
{
int tval,op,t;
Elemtype *s,*n;
lookahead=lexan();
while(lookahead!=DONE){
anserror=0;
expr();
match(';');
if(functype==1) {//若是进行翻译
if(anserror==0){//可以计算,输出结果
while(O.top!=O.base){
Pop(&O,&t);
switch(t){
case '+':case '-':case '*':case '/':op=t;Pop(&N,&t);Pop(&N,&rval);Pop(&N,&t);Pop(&N,&lval);ans=compute(lval,rval,op);Push(&N,ans);break;
case MOD:op=t;Pop(&N,&t);Pop(&N,&rval);Pop(&N,&t);Pop(&N,&lval);ans=compute(lval,rval,op);Push(&N,ans);break;
case DIV:op=t;Pop(&N,&t);Pop(&N,&rval);Pop(&N,&t);Pop(&N,&lval);ans=compute(lval,rval,op);Push(&N,ans);break;
}
}
Pop(&N,&ans);
printf("\n%d\n",ans);
fprintf(fpw,"\n%d\n",ans);
}
else{//不能计算,输出后缀表达式后换行
s=S.base+1;
while(S.top!=s){
t=*s;
switch(t){
case NUM:tval=*(s-1);printf("%d ",tval);fprintf(fpw,"%d ",tval);s=s+2;break;
case ID:tval=*(s-1);printf("%s ",symtable[tval].lexptr);fprintf(fpw,"%s ",symtable[tval].lexptr);s=s+2;break;
case '+':case '-':case '*':case '/':
tval=*s;printf("%c ",tval);fprintf(fpw,"%c ",tval);s=s+1;break;
case DIV:
printf("DIV ");fprintf(fpw,"DIV ");s=s+1;break;
case MOD:
printf("MOD ");fprintf(fpw,"MOD ");s=s+1;break;
}
}
printf("\n");
fprintf(fpw,"\n");
}
}
if(functype==0){//堆栈机代码显示后换一行
printf("\n");
fprintf(fpw,"\n");
}
DestroyStack(&N);
DestroyStack(&O);
DestroyStack(&S);
}
fclose(fpo);//关闭输入文件
fclose(fpw);//关闭输出文件
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -