📄 expression.cpp
字号:
//算术表达式分析
//算术表达式文法:
//E --> E+T | E-T| T
//T --> T*F | T/F| F
//F --> i |(E)
//修改为无左递归的文法为:
//E --> TE1
//E1 --> +TE1 | -TE1 | e
//T --> FT1
//T1 --> *FT1 |/FT1 |e
//F --> i | (E)
#include "Parser.h"
//开始分析表达式,用递归下降的分析方法
int Expression_Analysis()
{
Expression_Init();
return E_AddSub();
}
//分析E --> TE1
int E_AddSub()
{
cout << "E_AddSub()" << endl;
return E_AddSub(T_MulDiv());
}
//分析E1 --> +TE1 | -TE1 | e
int E_AddSub(int temp)
{
cout << "E_AddSub(int)" << endl;
int rtn = temp;
if(expr[pos].code == 35) //+
{
int op = expr[pos].code;
pos ++;
int temp_addr = T_MulDiv();
int t1 = New_Temp();
if(!expr_rtn_addr_control)
{
expr_rtn_addr_control = true;
expr_rtn_addr = EquPush(2, temp, temp_addr, t1);
}
else
EquPush(2, temp, temp_addr, t1);
rtn = E_AddSub(t1);
}
if(expr[pos].code == 36) // -
{
int op = expr[pos].code;
pos ++;
int temp_addr = T_MulDiv();
int t1 = New_Temp();
if(!expr_rtn_addr_control)
{
expr_rtn_addr_control = true;
expr_rtn_addr = EquPush(3, temp, temp_addr, t1);
}
else
EquPush(3, temp, temp_addr, t1);
rtn = E_AddSub(t1);
}
return rtn;
}
//T --> FT1
int T_MulDiv()
{
cout << "T_MulDiv()" <<endl;
return T_MulDiv(F_Number());
}
//分析T1 --> *FT1 |/FT1 |e
int T_MulDiv(int temp)
{
cout << "T_MulDiv(int)" << endl;
int rtn = temp;
if(expr[pos].code == 34) //*
{
int op = expr[pos].code;
pos ++;
int temp_addr = F_Number();
int t1 = New_Temp();
if(!expr_rtn_addr_control)
{
expr_rtn_addr_control = true;
expr_rtn_addr = EquPush(4, temp, temp_addr, t1);
}
else
EquPush(4, temp, temp_addr, t1);
rtn = T_MulDiv(t1);
}
if(expr[pos].code == 39) // /
{
int op = expr[pos].code;
pos ++;
int temp_addr = F_Number();
int t1 = New_Temp();
if(!expr_rtn_addr_control)
{
expr_rtn_addr_control = true;
expr_rtn_addr = EquPush(5, temp, temp_addr, t1);
}
else{
cout << "/" << endl;
EquPush(5, temp, temp_addr, t1);
}
rtn = T_MulDiv(t1);
}
return rtn;
}
//分析F --> i | (E)
int F_Number()
{
cout << "F_Number()" << endl;
int rtn = 0;
if(expr[pos].code == 32) // (
{
pos ++;
rtn = E_AddSub();
if(expr[pos].code != 33) //)
cout << "missing )" <<endl;
else
{
pos++;
cout << expr[pos].code << endl;
}
}
if(expr[pos].code == 27 || expr[pos].code == 28 || expr[pos].code == 29)
{
cout << expr[pos].code << endl;
rtn = expr[pos].addr;
pos ++;
}
return rtn;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -