0.简介
变量声明需要有中间码来操作,这里设计成入栈的操作。
1.实现
struct operand
{
operand(){}
//类型,数值,数值类别(数值,地址)
operand(int t,int n,bool addr):vaild(true), address(addr),num(n),type(t){}
bool vaild = false;
bool address = true;
int num;
int type;
};
enum OP
{
ADD,
ASSIGN,
SUB,
PSH,
POP,
CALL,
RET,
};
//四元式
class Quaternion
{
public:
Quaternion(){}
//操作,操作数1,操作数2,结果
Quaternion(OP _op, operand a, operand b, operand r) :op(_op), operand1(a), operand2(b), result(r) {}
//操作
OP op;
operand operand1;
operand operand2;
operand result;
~Quaternion(){}
};
对于四元式和四元式中的数值结构设计好。
然后对声明语句生成的中间代码进行设计。
operand VariableDeclareStatement::evaluation(std::vector<Quaternion>& stms, Memory& memory, NameTable& table)
{
int typeSize = 0;
//判断变量类型
if (type == KW_INT)
typeSize = 4;
//申请栈空间
memory.malloc(typeSize);
//如果是赋值
operand value;
//计算表达式结果
if (typeid(*ident) == typeid(AssignExpression))
{
//获取值
auto rightValue = std::dynamic_pointer_cast<AssignExpression>(ident);
value = rightValue->right_value->evaluation(stms,memory,table);
}
else
{
//填写值
value = operand(type, 0, false);
}
stms.push_back(Quaternion(PSH, value, operand(), operand()));
return value;
}
这里先以实现一个int声明为例子,所以还要实现整形数字表达式的解析。
operand IntExpression::evaluation(std::vector<Quaternion>& stms, Memory& memory, NameTable& table)
{
return operand(KW_INT,exp_value,false);
}
3.效果
输入以下代码
int a;
int b = 99;
得到的结果如下