📄 sematics.c
字号:
t = CheckId(Symbol[2],head1,0);
if(t == NULL)
Error(25);
if(t->kind == FUNC)
{
vx = 0;
strcpy(id,Symbol[2]);
NextSym(temp); // (
NextSym(temp);
while(strcmp(Symbol[1],"RParen") != 0)
{
genMCode(code[8],AnaExpress(),code[nil],code[nil]);
vx++;
}
if(vx > t->value)
Error(29);
else if(vx < t->value)
Error(26);
genMCode(code[Call],id,code[nil],code[nil]);
NextSym(temp);
}
else
{
strcpy(id,Symbol[2]);
if(t->kind == CONST)
Error(32);
NextSym(temp); // =
NextSym(temp);
genMCode(code[Assign],id,AnaExpress(),code[nil]);
}
}
NextSym(temp);
}
// 返回语句
else if(strcmp(Symbol[1],"return") == 0)
{
rtn = 1;
NextSym(temp);
if(strcmp(Symbol[1],"SEMIC") == 0) // return;
{
if(head2->type != VOID)
Error(30);
else
{
genMCode(code[Ret],code[nil],code[nil],code[nil]);
}
}
else // 否则必须是return (x);
{
NextSym(temp);
genMCode(code[Ret],AnaExpress(),code[nil],code[nil]); //
}
NextSym(temp); // (
NextSym(temp); // 分号
}
// 读语句
else if(strcmp(Symbol[1],"scanf") == 0)
{
NextSym(temp);
NextSym(temp);
if(CheckId(Symbol[2],head1,0) == NULL && CheckId(Symbol[2],head2,level) == NULL)
Error(24);
//else
genMCode(code[R],Symbol[2],code[nil],code[nil]);
NextSym(temp);
NextSym(temp);
NextSym(temp);
}
// 这是比较复杂的一个了
else if(strcmp(Symbol[1],"printf") == 0)
{
NextSym(temp); // (
NextSym(temp);
if(strcmp(Symbol[1],"STRING") == 0)
{
strcpy(arg,Symbol[2]);
NextSym(temp);
if(strcmp(Symbol[1],"COLOM") == 0) // printf("here",x);的情况
{
NextSym(temp);
genMCode(code[W],arg,"string","follow");
genMCode(code[W],AnaExpress(),"express",code[nil]);
// NextSym(temp);
}
else // printf("Hello!");
{
genMCode(code[W],arg,"string",code[nil]);
// NextSym(temp);
}
}
else // 直接打出表达式的情况
{
genMCode(code[W],AnaExpress(),"express",code[nil]);
}
NextSym(temp);
NextSym(temp);
}
else if(strcmp(Symbol[1],"SEMIC") == 0) // 空语句
NextSym(temp);
/* if(sw == 1)
{
genMCode(code[Goto],label1,code[nil],code[nil]);
genMCode(code[nil],code[nil],code[nil],code[nil]);
strcpy(tc->label,label2);
sw = 0;
}
else if(sw == 3)
{
genMCode(code[Goto],label3,code[nil],code[nil]);
sw = 0;
}*/
}
/************************
if(x > 5) if(x)
{
x = x + 5;
}
*****************************/
void AnaCondStmt()
{
char arg1[20],arg2[20];
char op[20];
// int save;
char ll1[5],ll2[5],ll3[5];
strcpy(ll1,label1); // 保护现场
strcpy(label1,NextLabel());
strcpy(ll2,label2);
strcpy(label2,NextLabel());
NextSym(temp); // (
NextSym(temp);
strcpy(arg1,Symbol[2]);
NextSym(temp);
if(strcmp(Symbol[1],"RParen") != 0) // if(x > 5)的情况
{
strcpy(op,Symbol[2]);
NextSym(temp);
strcpy(arg2,AnaExpress());
if(strcmp(op,"==") == 0)
{
strcpy(op,"jequ");
}
else if(strcmp(op,"<=") == 0)
{
strcpy(op,"jle");
}
else if(strcmp(op,">=") == 0)
{
strcpy(op,"jge");
}
else if(strcmp(op,"<") == 0)
{
strcpy(op,"jlt");
}
else if(strcmp(op,">=") == 0)
{
strcpy(op,"jgt");
}
else if(strcmp(op,"!=") == 0)
{
strcpy(op,"jne");
}
NextSym(temp);
genMCode(code[Comp],arg1,arg2,code[nil]);
genMCode(op,label1,label2,code[nil]);
}
else // if(x) 的情况
{
NextSym(temp);
genMCode(code[Comp],arg1,"0",code[nil]);
genMCode("jne",label1,label2,code[nil]);
}
// save = sw;
// sw = 2;
genMCode(code[nil],code[nil],code[nil],code[nil]);
strcpy(tc->label,label1);
AnaStmt();
strcpy(ll3,label3);
strcpy(label3,NextLabel());
genMCode(code[Goto],label3,code[nil],code[nil]);
genMCode(code[nil],code[nil],code[nil],code[nil]);
strcpy(tc->label,label2);
//sw = save;
strcpy(label1,ll1);
strcpy(label2,ll2);
if(strcmp(Symbol[1],"else") == 0)
{
// save = sw;
// sw = 3;
// genMCode(code[nil],code[nil],code[nil],code[nil]);
// strcpy(tc->label,"st");
NextSym(temp);
AnaStmt();
// sw = save;
// genMCode(code[nil],code[nil],code[nil],code[nil]);
// strcpy(tc->label,"end");
}
genMCode(code[nil],code[nil],code[nil],code[nil]); // 产生第三个标号
strcpy(tc->label,label3);
strcpy(label3,ll3);
}
void AnaLoopStmt()
{
char arg1[20],arg2[20];
char ll1[20],ll2[20];
//int save;
char op[20];
strcpy(ll1,label1);
strcpy(label1,NextLabel());
strcpy(ll2,label2);
strcpy(label2,NextLabel());
NextSym(temp);
NextSym(temp);
strcpy(arg1,AnaExpress());
// strc
if(strcmp(Symbol[1],"RParen") != 0)
{
strcpy(op,Symbol[2]);
NextSym(temp);
strcpy(arg2,AnaExpress());
if(strcmp(op,"==") == 0)
{
strcpy(op,"jnequ");
}
else if(strcmp(op,"<=") == 0)
{
strcpy(op,"jnle");
}
else if(strcmp(op,">=") == 0)
{
strcpy(op,"jnge");
}
else if(strcmp(op,"<") == 0)
{
strcpy(op,"jnlt");
}
else if(strcmp(op,">=") == 0)
{
strcpy(op,"jngt");
}
else if(strcmp(op,"!=") == 0)
{
strcpy(op,"jnne");
}
genMCode(code[nil],code[nil],code[nil],code[nil]);
strcpy(tc->label,label1);
genMCode(code[Comp],arg1,arg2,code[nil]);
//strcpy(tc->label,label1);
genMCode(op,label2,code[nil],code[nil]);
}
else
{
genMCode(code[Comp],arg1,"0",code[nil]);
strcpy(tc->label,label1);
genMCode("jnne",label2,code[nil],code[nil]);
}
NextSym(temp);
//save = sw
//sw = 1;
AnaStmt();
genMCode(code[Goto],label1,code[nil],code[nil]);
genMCode(code[nil],code[nil],code[nil],code[nil]);
strcpy(tc->label,label2);
// sw = save;
strcpy(label1,ll1);
strcpy(label2,ll2);
}
void AnaMainFunc()
{
char id[20];
//NextSym(temp);
//NextSym(temp);
Enter(FUNC,VOID,"main",0,0);
genMCode(code[nil],code[nil],code[nil],code[nil]);
strcpy(tc->label,"start");
genMCode(code[Func],"main",code[nil],code[nil]);
// strcpy(tc->label, "start");
level++;
//AnaCompStmt();
NextSym(temp); // {
if(strcmp(Symbol[1],"const") == 0)
{
while(strcmp(Symbol[1],"const") == 0)
{
NextSym(temp);
strcpy(id,Symbol[2]);
NextSym(temp);
NextSym(temp);
if(CheckId(id,head1,level) != NULL)
Error(27);
Enter(CONST,INT,id,parseInt(Symbol[2]),level);
genMCode(code[Const],id,Symbol[2],code[nil]);
NextSym(temp); // ,
while(strcmp(Symbol[1],"COLOM") == 0)
{
NextSym(temp);
strcpy(id,Symbol[2]);
NextSym(temp);
NextSym(temp);
if(CheckId(id,head2,level) != NULL && CheckId(id,head1,0) != NULL)
Error(27);
Enter(CONST,INT,id,parseInt(Symbol[2]),level);
genMCode(code[Const],id,Symbol[2],code[nil]);
NextSym(temp);
}
NextSym(temp);
}
}
if(strcmp(Symbol[1],"int") == 0)
{
while(strcmp(Symbol[1],"int") == 0)
{
NextSym(temp);
strcpy(id,Symbol[2]);
if(CheckId(id,head2,level) != NULL || CheckId(id,head1,0) != NULL)
Error(24);
Enter(VAR,INT,id,0,level);
genMCode(code[Var],id,"0",code[nil]);
NextSym(temp);
while(strcmp(Symbol[1],"COLOM") == 0)
{
NextSym(temp);
strcpy(id,Symbol[2]);
if(CheckId(id,head2,level) != NULL)
Error(24);
Enter(VAR,INT,id,0,level);
genMCode(code[Var],id,"0",code[nil]);
NextSym(temp);
}
NextSym(temp);
}
}
AnaStmtList();
if(head2->kind == INT && rtn == 0)
{
Error(31);
}
else
rtn = 0;
//NextSym(temp);
level--;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -