📄 anaexpress.c
字号:
/***************************************
By BHU 35060122 Peng Hui;
2008.02
description:
A small compiler to translate a C program to 80X80 Assembly Code
***************************************/
#include"Global.h"
char *AnaExpress()
{
static char arg1[20];
char arg2[20],arg3[20];
char mm[20];
int sw;
if(strcmp(Symbol[1],"ADD_OP") == 0 || strcmp(Symbol[1],"SUB_OP") == 0)
{
if(strcmp(Symbol[1],"SUB_OP") == 0)
{
strcpy(mm,NextTemp());
genMCode(code[Neg],AnaItem(),code[nil],mm);
}
else
{
NextSym(temp);
strcpy(mm,AnaItem());
while(strcmp(Symbol[1],"ADD_OP") == 0 || strcmp(Symbol[1],"SUB_OP") == 0)
{
if(strcmp(Symbol[1],"ADD_OP") == 0)
sw = 1;
else
sw = 0;
NextSym(temp);
strcpy(arg2,AnaItem());
strcpy(arg3,NextTemp());
if(sw == 1)
genMCode(code[Add],mm,arg2,arg3);
else
genMCode(code[Sub],mm,arg2,arg3);
strcpy(mm,arg3);
}
}
}
else
{
strcpy(mm,AnaItem());
while(strcmp(Symbol[1],"ADD_OP") == 0 || strcmp(Symbol[1],"SUB_OP") == 0)
{
if(strcmp(Symbol[1],"ADD_OP") == 0)
sw = 1;
else
sw = 0;
NextSym(temp);
strcpy(arg2,AnaItem());
strcpy(arg3,NextTemp());
if(sw == 1)
genMCode(code[Add],mm,arg2,arg3);
else
genMCode(code[Sub],mm,arg2,arg3);
strcpy(mm,arg3);
}
}
strcpy(arg1,mm);
return arg1;
}
char *AnaItem()
{
static char arg1[20];
char arg2[20],arg3[20];
char mm[20];
int sw;
strcpy(mm,AnaFactor());
while(strcmp(Symbol[1],"MUL_OP") == 0 || strcmp(Symbol[1],"DIV_OP") == 0)
{
if(strcmp(Symbol[1],"MUL_OP") == 0)
sw = 1;
else
sw = 0;
NextSym(temp);
strcpy(arg2,AnaFactor());
strcpy(arg3,NextTemp());
if(sw == 1)
genMCode(code[Mul],mm,arg2,arg3);
else
genMCode(code[Div],mm,arg2,arg3);
strcpy(mm,arg3);
}
strcpy(arg1,mm);
return arg1;
}
char *AnaFactor()
{
Table *t;
static char id[20];
char mm[20];
/*
* 这里还有问题
*/
if(strcmp(Symbol[1],"ID") == 0)
{
strcpy(id,Symbol[2]);
t = CheckId(id,head2,level);
// if(t != NULL) // 在当前的函数范围里面查找
// {
// r如果能找到,则必定是变量或者是常量。
// }
if(t == NULL) // 如果当前函数里面没有,去全局范围里找
{
t = CheckId(id,head1,0);
if( t == NULL)
Error(25);
else
{
if(t->kind == FUNC)
{
vx = 0;
strcpy(mm,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);
strcpy(id,mm);
genMCode(code[Call],id,code[nil],code[nil]); // 这里还可以添加信息,如果需要的话
strcpy(mm,NextTemp());
genMCode(code[Assign],mm,id,code[nil]);
strcpy(id,mm);
//NextSym(temp);
//return mm;
}
}
}
/*
t = CheckId(id,head1,0);
if(t == NULL) // 既不是全局变量,也不是函数调用
{
t = CheckId(id,head2,level); // 看能不能查到符号
if(t == NULL)
Error(24);
// return id;
}
else // 有可能是全局变量或者常量或者函数调用
{
if(t->kind == FUNC) // 函数调用返回 一个什么样的形式????,就返回这个函数的名字
{
vx = 0;
strcpy(mm,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);
strcpy(id,mm);
genMCode(code[Call],id,code[nil],code[nil]); // 这里还可以添加信息,如果需要的话
//NextSym(temp); // 右括号
// return id;
}
// else
// return id;
}*/
}
else if(strcmp(Symbol[1],"INTEGER") == 0) // 整数
{
strcpy(id,Symbol[2]);
// NextSym(temp);
// return id;
}
else //表达式
{
NextSym(temp);
strcpy(id,AnaExpress());
//NextSym(temp);
// NextSym(temp);
// return id;
}
NextSym(temp);
return id;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -