📄 mycompiler.cpp
字号:
void MyCompiler::statement(MyCompiler::node *fsys) //fsys为语句结束符
{
int i,cx1,cx2,m,n;
char *tempset1[]={"semicolon",NULL}; //;
char *tempset4[]={"rparen",NULL}; //)
char *tempset6[]={"over",NULL};
node *temp1,*temp4,*temp6;
temp1=new node;
temp4=new node;
temp6=new node;
m=0;
n=0;
while(tempset1[m]!=NULL)
temp1->pa[n++]=tempset1[m++];
temp1->pa[n]=NULL;
m=0;
n=0;
while(tempset4[m]!=NULL)
temp4->pa[n++]=tempset4[m++];
temp4->pa[n]=NULL;
m=0;
n=0;
while(tempset6[m]!=NULL)
temp6->pa[n++]=tempset6[m++];
temp6->pa[n]=NULL;
m=0;
n=0;
if(strcmp(sym,"ident")==0)//语句首是标识符
{
i=position(id);
if(i==0)
{
error(11);
while(in(sym,fsys)==0&&strcmp(sym,"over")!=0)
getsym();
}
else//标识符已经申明
{
if(in(IdentTable[i].kind,declbegsys))//标识符的类型是int,long,char,array
{
if(strcmp(IdentTable[i].kind,"array")==0)
{
int i_elementno=1;
int i_arrayadr=IdentTable[i].val;
int i_elementcount=ArrayTable[IdentTable[i].val].count;
int i_arrayindex=ArrayTable[IdentTable[i].val].i_startadr;
int i_count=0;//元素相对于数组起始位置的位移
int i_longflag=0;//数组地址是否long
getsym();
if(strcmp(sym,"lsquarebrackets")!=0)
error(29);
gen("lit",0,0,line);
while(strcmp(sym,"lsquarebrackets")==0)//标识符的类型是array
{
i_elementno++;
i_count=1;
getsym(); //某一维大小num
int expression_typearray=expression(fsys);
for(int i=i_elementno;i<=i_elementcount;i++)
i_count=i_count*(ArrayTable[i_arrayadr].elementsize[i]);
//i_count=i_count*IdentTable[i].val;
int i_backkindsize=1;
if(IdentTable[i].kind=="long")
i_backkindsize=2;
i_count=i_count*i_backkindsize;
gen("lit",0,i_count,line);
if(expression_typearray==4&&i_longflag==0) //
{
//gen("opr",1,4,line); //int*long
//i_longflag=1;
error(41);
}
else
if(expression_typearray==4&&i_longflag==1) //long*long
//gen("opr",0,4,line);
error(41);
else
if(i_longflag==0) //int*int
gen("opr",0,4,line);
else
error(41);
gen("opr",0,2,line); //
//getsym();
if(strcmp(sym,"rsquarebrackets")!=0)
error(26);
}
i_arrayindex=i_arrayindex+i_count;
if(strcmp("long",IdentTable[i].BackKind)==0) //数组,long 类型
{
gen("lit",0,2,line); //2*index
gen("opr",0,4,line); //int*int
}
//将常量方到栈顶
gen("lit",IdentTable[i].level,IdentTable[i].adr,line);
gen("opr",0,2,line); //int+int
//ArrayTable[i_arrayadr].i_elementindex++;
//ArrayTable[i_arrayadr].arrayadr[ArrayTable[i_arrayadr].i_elementindex]=i_arrayindex;
//IdentTable[i].val=i_arrayindex;
i_isarray=3; //数组结束前的处理
// getsym();
// if(strcmp(sym,"rsquarebrackets")!=0)
// error(26);
}
getsym();
if(strcmp(sym,"becomes")!=0)
{
//此处为单操作数语句
error(93);
while(in(sym,fsys)==0&&strcmp(sym,"over")!=0)
getsym();
}
else //此处是赋值表达式语句翻译
{
getsym(); //变量名
if(strcmp(sym,"ident")==0)//=后是标识符
{
int i1=position(id);
if(i1==0)
{
error(11);
while(in(sym,fsys)==0&&strcmp(sym,"over")!=0)
getsym();
}
else //函数值赋与标示符
{
if(strcmp(IdentTable[i1].kind,"function")==0)
{ //函数返回值的数据类型 //等号前面的标志符的数据类型
if(IdentTable[i1].BackKind=="long"&&IdentTable[i].kind=="int"
||IdentTable[i1].BackKind=="long"&&IdentTable[i].BackKind=="int")//(strcmp(IdentTable[i1].BackKind,IdentTable[i].kind)!=0)
{
error(94);
while(in(sym,fsys)==0&&strcmp(sym,"over")!=0)
getsym();
}
else
{
verify(fsys);//验证函数的参数合法
getsym(); //
if(IdentTable[i1].adrtrue==0) //子函数入口地址没有确定
{
int k;
k=IdentTable[i1].adr;
IdentTable[i1].adr=cx; //纪录回填行地址
gen("gosub",0,k,line);
}
else
{
gen("gosub",0,IdentTable[i1].adr,line);
}
gen("substo",IdentTable[i].level,IdentTable[i].adr,line);
if(strcmp("long",IdentTable[i].kind)==0
||strcmp("long",IdentTable[i].BackKind)==0) //数组
gen("substo",IdentTable[i].level,IdentTable[i].adr-1,line);
}
} //不是函数
else//表达式值赋与标示符
{
int expression_type=expression(fsys);
if(IdentTable[i].kind=="array")
{
//gen("stoex",0,0,line);
if(strcmp("long",IdentTable[i].BackKind)==0) //数组
{
if(expression_type==4)//long
{
gen("stoex",0,2,line); //long store to long
}
else
{
//if(expression_type==0) //int store to long
//{
//gen("lit",0,0,line);
gen("stoex",0,1,line);
//}
}
}
else //int,char array
{
if(expression_type!=4)//int
{
gen("stoex",0,0,line); //int store to int
}
else
error(94);
}
}
else
{
gen("sto",IdentTable[i].level,IdentTable[i].adr,line);
if(strcmp("long",IdentTable[i].kind)==0)
{
if(expression_type==4)
{ //将栈顶内容送入某变量单元中
gen("sto",IdentTable[i].level,IdentTable[i].adr-1,line);
}
else
{
if(expression_type==0||expression_type==1)
{
gen("lit",0,0,line);
gen("sto",IdentTable[i].level,IdentTable[i].adr-1,line);
}
else
{
error(94);
}
}
}
if((strcmp("int",IdentTable[i].kind)==0)&&(expression_type==4))
error(94);
}
//if((strcmp("int",IdentTable[i].kind)==0)&&(expression_type==4))
// error(94);
}
}
}
else //=后不是标志符
{
int expression_type=expression(fsys);
gen("sto",IdentTable[i].level,IdentTable[i].adr,line);
if(strcmp("long",IdentTable[i].kind)==0
||strcmp("long",IdentTable[i].BackKind)==0)
{
if(expression_type==4)
{
gen("sto",IdentTable[i].level,IdentTable[i].adr-1,line);
}
else
{
if(expression_type==0||expression_type==1)
{
gen("lit",0,0,line);
gen("sto",IdentTable[i].level,IdentTable[i].adr-1,line);
}
else
{
error(94);
}
}
}
if((strcmp("int",IdentTable[i].kind)==0)&&(expression_type==4))
error(94);
}
}
}
else//标识符的类型不是int,long,char,array
if(strcmp(IdentTable[i].kind,"function")==0)//函数调用
{
verify(fsys);
getsym();
if(IdentTable[i].adrtrue==0)
{
int k;
k=IdentTable[i].adr;
IdentTable[i].adr=cx;
gen("gosub",0,k,line);
}
else
{
gen("gosub",0,IdentTable[i].adr,line);
}
}
}
}
else//语句首不是标识符
if(strcmp(sym,"lbigparen")==0)//复合语句
{
getsym();
while(in(sym,add(temp1,statbegsys))==1)
{
statement(fsys);
if(strcmp(sym,"semicolon")==0)
{
getsym();
}
else
{
error(10);
}
}
if(strcmp(sym,"rbigparen")==0)
{
//printf(" **}** \n");
strcpy(sym,"semicolon");
}
else
{
error(73);
while(in(sym,fsys)==0&&strcmp(sym,"over")!=0)
getsym();
}
}
else
if(strcmp(sym,"if")==0)//if语句编译
{
getsym();
if(strcmp(sym,"lparen")==0)
{
getsym();
condition(temp4);
if(strcmp(sym,"rparen")==0)
{
getsym();
}
else
{
error(162);
}
cx1=cx;
gen("jpc",0,0,line);
statement(fsys);
gen("goto",0,cx+1,line);
code[cx1].a=cx;
}
else
{
error(72);
while(in(sym,fsys)==0&&strcmp(sym,"over")!=0)
getsym();
}
}
else
if(strcmp(sym,"else")==0)
{
getsym();
if((strcmp(code[cx-1].operation,"goto")==0)&&(code[cx-1].a==cx))
{
cx1=cx;
statement(fsys);
code[cx1-1].a=cx;
}
else
{
error(21);
while(in(sym,fsys)==0&&strcmp(sym,"over")!=0)
getsym();
}
}
else
if(strcmp(sym,"while")==0)
{
cx1=cx;
getsym();
if(strcmp(sym,"lparen")==0)
{
getsym();
condition(temp4);
cx2=cx;
gen("jpc",0,0,line);
if(strcmp(sym,"rparen")==0)
getsym();
else
error(18);
statement(fsys);
gen("jmp",0,cx1,line);
code[cx2].a=cx;
}
else
{
error(164);
}
}
else
if(strcmp(sym,"return")==0)
{
getsym();
int return_type=expression(fsys);
gen("return",0,3,line);
if(return_type==4)
gen("return",0,2,line);
if(return_type==-1)
error(201);
}
else
if(strcmp(sym,"for")==0)
{
getsym();
if(strcmp(sym,"lparen")==0)
{
getsym();
if(strcmp(sym,"semicolon")!=0)
statement(fsys);
getsym();
cx1=cx;
condition(temp1);
getsym();
cx2=cx;
gen("jpc",0,0,line);
gen("jmp",0,0,line);
int line1=line;
if(strcmp(sym,"rparen")!=0)
statement(temp4);
if(strcmp(sym,"rparen")==0)
getsym();
else
error(18);
gen("jmp",0,cx1,line1);
code[cx2+1].a=cx;
statement(fsys);
gen("jmp",0,cx2+2,line);
code[cx2].a=cx;
}
else
{
error(165);
}
}
else
if(strcmp(sym,"do")==0)
{
cx1=cx;
getsym();
statement(fsys);
getsym();
if(strcmp(sym,"while")==0)
{
getsym();
if(strcmp(sym,"lparen")==0)
{
getsym();
condition(temp4);
getsym();
gen("jfc",0,cx1,line);
}
else
{
error(24);
}
}
else
{
error(23);
}
}
test(fsys,temp6,33);
delete temp1;
delete temp4;
delete temp6;
}
int MyCompiler::verify(MyCompiler::node *fsys)//验证函数的参数合法
{
int i=0,j;
struct param *param1;
while((strcmp(subparam[i].kind,id)!=0)&&(i<subcount))
i++;
getsym(); //(
if(subcount>i) //子函数有形式参数
{
param1=subparam[i].p;
getsym();
while((param1!=NULL)&&(strcmp(sym,"rparen")!=0))
{
if(strcmp(sym,"number")==0) //实参是立即值
{
if(strcmp(param1->kind,"long")==0)
{
gen("lit",0,0,line);
}
gen("lit",0,num,line);
}
else
{
j=position(id);
if(j==0)
{
error(11);
}
else
{
if(strcmp(IdentTable[i].kind,"array")==0)
{
int i_elementno=1;
int i_arrayadr=IdentTable[i].val;
int i_elementcount=ArrayTable[IdentTable[i].val].count;
int i_count=0;//元素相对于数组起始位置的位移
int i_longflag=0;//数组地址是否long
getsym();
if(strcmp(sym,"lsquarebrackets")!=0)
error(29);
gen("lit",0,0,line);
while(strcmp(sym,"lsquarebrackets")==0)//标识符的类型是array
{
i_elementno++;
i_count=1;
getsym(); //某一维大小num
//gen("lit",0,num,line);
int expression_typearray=expression(fsys);
for(int i=i_elementno;i<=i_elementcount;i++)
i_count=i_count*(ArrayTable[i_arrayadr].elementsize[i]);
gen("lit",0,i_count,line);
//i_count=i_count*IdentTable[i].val;
if(expression_typearray==4&&i_longflag==0) //
{
//gen("opr",1,4,line); //int*long
//i_longflag=1;
error(41);
}
else
if(expression_typearray==4&&i_longflag==1) //long*long
//gen("opr",0,4,line);
error(41);
else
if(i_longflag==0) //int*int
gen("opr",0,4,line);
else
error(41);
//gen("opr",0,4,line); //long *int
//getsym();
gen("opr",0,2,line); //
if(strcmp(sym,"rsquarebrackets")!=0)
error(26);
getsym();
}
//i_arrayindex=i_arrayindex+i_count;
if(strcmp("long",IdentTable[i].BackKind)==0) //数组,long 类型
{
gen("lit",0,2,line); //2*index
gen("opr",0,4,line); //int*int
}
//将常量方到栈顶
gen("lit",IdentTable[i].level,IdentTable[i].adr,line);
gen("opr",0,2,line);
//gen("stoex",IdentTable[i].level,0,line);
if(strcmp("long",IdentTable[i].BackKind)==0) //数组
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -