资源简介
学生在学习《编译原理》课程设计中,结合各章节的构造编译程序的基本理论,总共用一周的时间完成课程设计。要求用C或C++语言描述及上机调试,实现五个题目中任意一个,是学生将理论与实际应用结合其,起来,受到软件设计等开发过程的全面训练,从而提高学生软件开发的能力。
能完成指定寄存器个数的情况下降一中间代码程序段翻译成会变语言目标代码(汇编指令应包括加、减、乘、除),要求指令条数最少的情况下,尽量使用寄存器,尽量少访问内存,这样才能做到运行效率高。
代码片段和文件信息
#include
#include
#include
char temp=‘a‘-1;//用于标志不同的寄存器
stack NumberStack;//堆栈
int stackPointer;
typedef struct{
int operationName;//操作码
char registerName;//使用的寄存器
char numberValue;//操作数
}OperationStruct;
OperationStruct operations[40];
int operationNowIndex=0;//表示当前是第几个操作
int registerFlag;//寄存器标志:0表示为空,非0,被占用
char inputString[40];
//判断是否为操作符,并将基转换成对应的数字表示
int isOperator(char ch){
switch(ch){
case ‘+‘:
return 3;
case ‘-‘:
return 4;
case ‘*‘:
return 5;
case ‘/‘:
return 6;
default:
return 0;
}
}
//判断是否为数字
int isNumber(char ch){
if(ch>=‘0‘&&ch<=‘9‘)
return 1;
return 0;
}
//根据运算符和当前寄存器的状态,转换成对应的操作
void GenerateOperations(char ch){ //如果是操作符就从栈中弹出两个操作数
char x1x2;
x2=NumberStack.top();
NumberStack.pop();
x1=NumberStack.top();
NumberStack.pop();
if(registerFlag==0){ // 如果寄存器没被占用,直接生成运算指令:X1装载到R,X2与之进行对应的运算
operations[operationNowIndex].operationName=1; //装载NumberStack[S-1]即x1 到寄存器R
operations[operationNowIndex].registerName=‘R‘;
operations[operationNowIndex].numberValue=x1;
operationNowIndex++;
operations[operationNowIndex].operationName=isOperator(ch); //将操作符变成数字代码
operations[operationNowIndex].registerName=‘R‘;
operations[operationNowIndex].numberValue=x2;
operationNowIndex++;
}else if(x1!=‘R‘&&x2!=‘R‘&®isterFlag!=0){//x1和x2都不是寄存器的值,且寄存器被占用
temp++; //用一个新的变量来保存数据,比如ab……
operations[operationNowIndex].operationName=2; //****** *******
operations[operationNowIndex].registerName=‘R‘; //****** 将寄存器中数据保存到临时变量 *******
operations[operationNowIndex].numberValue=temp; //****** *******
NumberStack.pop();
NumberStack.push(temp); //将临时变量压入堆栈
operationNowIndex++;
//以上已经将寄存器清空了,可以按上一个条件中的方法进行操作了
operations[operationNowIndex].operationName=1; //和上面一个条件中的方法一样
operations[operationNowIndex].registerName=‘R‘;
operations[operationNowIndex].numberValue=x1;
operationNowIndex++;
operations[operationNowIndex].operationName=isOperator(ch);
operations[operationNowIndex].registerName=‘R‘;
operations[operationNowIndex].numberValue=x2;
operationNowIndex++;
}else if(x1==‘R‘&&x2!=‘R‘&®isterFlag==(stackPointer-1)){//x1是寄存器,x2是操作数, 直接进行操作,因为已经有一个操作数了
operations[operationNowIndex].operationName=isOperator(ch);
operations[operationNowIndex].registerName=‘R‘;
operations[operationNowIndex].numberValue=x2;
评论
共有 条评论