📄 sematics.c
字号:
/***************************************
By BHU 35060122 Peng Hui;
2008.02
description:
A small compiler to translate a C program to 80X80 Assembly Code
***************************************/
#include"Global.h"
void AnaProgram()
{
char id[20];
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,head1,level) != NULL)
Error(27);
Enter(CONST,INT,id,parseInt(Symbol[2]),level);
genMCode(code[Const],id,Symbol[2],code[nil]);
NextSym(temp); // ,
}
NextSym(temp); // ;
}
}
// 定义int型的变量 或者 函数
if(strcmp(Symbol[1],"int") == 0)
{
while(strcmp(Symbol[1],"int") == 0)
{
NextSym(temp);
strcpy(id,Symbol[2]);
NextSym(temp);
if(strcmp(Symbol[1],"LParen") == 0)
{
/*if(CheckId(id,head1,0) == NULL)
{
Enter(FUNC,INT,id,0,level);
level++; // 进入函数定义,层数加一
}
else
{
Error(24);
Enter(FUNC,INT,id,0);
level++; // 进入函数定义,层数加一
}*/
if(CheckId(id,head1,0) != NULL)
Error(24);
Enter(FUNC,INT,id,0,level);
genMCode(code[Func],id,code[Int],code[nil]);
level++; // 进入函数定义,层数加一
AnaParameter();
//level++; // 进入复合语句定义,层数加一
AnaCompStmt();
genMCode("end",id,code[nil],code[nil]);
level--; // 从复合语句中出来,层数减一
}
else
{
//VariDec();
if(CheckId(id,head1,level) != 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,head1,level) != NULL)
Error(24);
Enter(VAR,INT,id,0,level);
genMCode(code[Var],id,"0",code[nil]);
NextSym(temp);
}
NextSym(temp); // 最后还读入一个符号
}
}
}
// 定义int型or void型的函数
if(strcmp(Symbol[1],"int") == 0 || strcmp(Symbol[1],"void") == 0)
{
while(strcmp(Symbol[1],"int") == 0 || strcmp(Symbol[1],"void") == 0)
{
if(strcmp(Symbol[1],"int") == 0)
{
NextSym(temp);
strcpy(id,Symbol[2]);
if(CheckId(id,head1,level) != NULL)
Error(24);
Enter(FUNC,INT,id,0,level);
genMCode(code[Func],id,code[Int],code[nil]);
NextSym(temp);
level++; // 进入函数定义,层数加一
AnaParameter();
//level++; // 进入复合语句定义,层数加一
AnaCompStmt();
genMCode("end",id,code[nil],code[nil]);
level--; // 从复合语句中出来,层数减一
}
else
{
NextSym(temp);
if(strcmp(Symbol[1],"main") == 0)
{
NextSym(temp);
NextSym(temp);
NextSym(temp);
AnaMainFunc(); // 这里还要检查,缺少一点代码。
genMCode("end","main",code[nil],code[nil]);
flag = 1;
return;
}
else
{
//voidFunc();
if(CheckId(Symbol[2],head1,level) != NULL)
Error(24);
Enter(FUNC,VOID,Symbol[2],0,level);
genMCode(code[Func],Symbol[2],code[Void],code[nil]);
NextSym(temp);
AnaParameter();
AnaCompStmt();
genMCode("end",id,code[nil],code[nil]);
}
}
}
}
}
void AnaParameter() // 有BUG
{
vx = 0;
NextSym(temp); //
if(strcmp(Symbol[1],"RParen") != 0)
{
vx++;
NextSym(temp);
if(CheckId(Symbol[2],head2,level) != NULL)
Error(28);
Enter(VV,INT,Symbol[2],0,level);
genMCode(code[Vp],Symbol[2],code[Int],code[nil]);
NextSym(temp);
while(strcmp(Symbol[1],"RParen") != 0)
{
vx++;
NextSym(temp);
NextSym(temp);
if(CheckId(Symbol[2],head2,level) != NULL)
Error(28);
Enter(VV,INT,Symbol[2],0,level);
genMCode(code[Vp],Symbol[2],code[Int],code[nil]);
NextSym(temp);
}
}
NextSym(temp);
head2->value = vx;
}
void AnaCompStmt()
{
char id[20];
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->type == INT && rtn == 0)
{
Error(31);
}
rtn = 0;
NextSym(temp);
}
void AnaStmtList()
{
AnaStmt();
while(strcmp(Symbol[1],"RBrace") != 0)
{
AnaStmt();
}
}
void AnaStmt()
{
Table *t;
char id[20];
char arg[20];
//char labell[5];
// if(sw == 2)
// {
// genMCode(code[nil],code[nil],code[nil],code[nil]);
// strcpy(tc->label,label1);
// sw = 0;
// }
// else if(sw == 1)
// {
// genMCode(code[nil],code[nil],code[nil],code[nil]);
// strcpy(tc->label,label1);
// }
// else if(sw == 3)
// {
// 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 = 0;
// }
if(strcmp(Symbol[1],"if") == 0) // 条件语句
{
AnaCondStmt();
}
else if(strcmp(Symbol[1],"while") == 0) //循环语句
{
AnaLoopStmt();
}
else if(strcmp(Symbol[1],"LBrace") == 0)
{
NextSym(temp);
AnaStmtList();
NextSym(temp); // 分号
}
else if(strcmp(Symbol[1],"ID") == 0) // 子函数调用语句和变量赋值语句
{
/*t = CheckId(Symbol[2],head1,0); // 查找全局变量或者函数
if(t == NULL) // 应该是是变量的赋值语句
{
t = CheckId(Symbol[2],head2,level);
if(t == NULL) // 如果没有查到,就是没有定义
{
Error(25);
}
else
{
strcpy(id,Symbol[2]);
NextSym(temp); // =
NextSym(temp);
if(t->kind == CONST)
{
Error(32);
}
else
genMCode(code[Assign],id,AnaExpress(),code[nil]);
}
}
else // 是子函数调用语句 或者 全局变量
{
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]);
NextSym(temp); // =
NextSym(temp);
if(t->kind == CONST)
{
Error(32);
}
//else
genMCode(code[Assign],id,AnaExpress(),code[nil]);
}
}
NextSym(temp); // 分号
// NextSym(temp); // 多读一个*/
t = CheckId(Symbol[2],head2,level);
if(t != NULL) // 必定是变量
{
strcpy(id,Symbol[2]);
if(t->kind == CONST)
Error(32);
NextSym(temp); // =
NextSym(temp);
genMCode(code[Assign],id,AnaExpress(),code[nil]);
}
else // 全局变量/常量 函数调用
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -