#include<iostream>
#include<string>
#include<vector>
#include<iomanip>
#include <stack>
#include <map>
using namespace std;
//*********************词法分析器******************************//
char SEPARATER[2] = { '(', ')' }; //分隔符
char OPERATOR[5] = { '+', '-', '*', '/', '=' }; //运算符
char FILTER[4] = { ' ', '\t', '\r', '\n' }; //过滤符
/**判断是否为分隔符**/
bool IsSeparater(char ch){
for (int i = 0; i<2; i++){
if (SEPARATER[i] == ch){
return true;
}
}
return false;
}
/**判断是否为运算符**/
bool IsOperator(char ch){
for (int i = 0; i<5; i++){
if (OPERATOR[i] == ch){
return true;
}
}
return false;
}
/**判断是否为过滤符**/
bool IsFilter(char ch){
for (int i = 0; i<4; i++){
if (FILTER[i] == ch){
return true;
}
}
return false;
}
/**判断是否为数字**/
bool IsDigit(char ch){
if (ch >= '0' && ch <= '9') return true;
return false;
}
/**词法分析**/
vector<string> analyse(string expression){
vector<string> vec;
char ch = ' ';
for (int i = 0; i < expression.length(); i++)
{
string arr = "";
ch = expression[i];
if (IsFilter(ch)){} //判断是否为过滤符
else if (IsDigit(ch)){ //判断是否为数字
while (IsDigit(ch) || IsFilter(ch)){
if (IsDigit(ch))
arr += ch;
i++;
ch = expression[i];
}
i--;
//printf("%3d ", CONSTANT);
cout << "\t\t\t< 整形数 , " << arr <<">"<< endl;
vec.push_back(arr);
}
else if (IsOperator(ch))
{
arr += ch;
//printf("%3d ", value(OPERATOR, 8, *arr.data()));
cout << "\t\t\t< 运算符 , " << arr << ">" << endl;
vec.push_back(arr);
}
else if (IsSeparater(ch))
{
arr += ch;
//printf("%3d ", value(SEPARATER, 8, *arr.data()));
cout << "\t\t\t< 分隔符 , " << arr << ">" << endl;
vec.push_back(arr);
}
else
{
cout << "\t\t\t\"" << ch << "\":无法识别的字符!" << endl;
vec.clear();
return vec;
}
}
return vec;
}
//*********************中间代码生成器******************************//
string InversePolish(string s_mid)
{
string s_beh = "";
stack<char> stk;
map<char, int> op;//利用map来实现运算符对应其优先级
op['('] = 0;
op[')'] = 0;
op['+'] = 1;
op['-'] = 1;
op['*'] = 2;
op['/'] = 2;
string::iterator it = s_mid.begin();;
while (it != s_mid.end())
{
if (op.count(*it))//判断该元素是否为运算符
{
if (*it == ')')//若为’)‘,把栈中的运算符依次加入后缀表达式,直到出现'(',’(‘出栈,退出该次循环
{
while (stk.top() != '(')
{
s_beh += stk.top();
s_beh += " ";
stk.pop();
}
stk.pop();
}
else if (stk.empty() || *it == '(' || op[*it]>op[stk.top()])//若为‘(’,入栈 ; 要入栈的运算符优先级大于等于栈顶的运算符的优先级,直接入栈
{
stk.push(*it);
}
else if (op[*it] <= op[stk.top()])// 入栈的运算符优先级小于等于栈顶的运算符的优先级,栈顶运算符出栈,再次比较,直到出现优先级低的运算符,或者栈为空,退出
{
while (op[*it] <= op[stk.top()] && (!stk.empty()))
{
s_beh += stk.top();
s_beh += " ";
stk.pop();
if (stk.empty()) break;
}
stk.push(*it);
}
}
else
{
s_beh += *it;
it++;
if (it != s_mid.end() && op.count(*it))
s_beh += " ";
it--;
}
it++;
if (it == s_mid.end())//当中缀表达式输出完成,所有元素出栈
{
while (!stk.empty())
{
s_beh += " ";
s_beh += stk.top();
stk.pop();
}
break;
}
}
cout <<"逆波兰表达式:"<< s_beh << endl;
return s_beh;
}
//*********************后缀表达式计算******************************//
int Op(int a, char op, int b)
{
switch (op)
{
case '+':return a + b; break;
case '-':return a - b; break;
case '*':return a*b; break;
case '/':return a / b; break;
}
}
int calculate(char *str)
{
stack<int> s;//暂存操作数
int i = 0;
int offset = 0;
int flag = 0;
int Length = strlen(str);
int Result;
while (i < Length)
{
string One = "";
for (i; i < Length; i++)
{
One += str[i];
if (((str[i] == ' ')&&(str[i+1]!=' ')) || (i == Length - 1))
{
char* OneNumber = (char*)One.data();
int Number = atoi(One.c_str());
if (IsOperator(*OneNumber))
{
Number = 0;
}
s.push(Number);
if (IsOperator(*OneNumber))
{
s.pop();
int x = s.top();
s.pop();
int y = s.top();
s.pop();
Result = Op(y, *OneNumber, x);
s.push(Result);
}
offset = i + 1;
break;
}
}
i = offset;
}
return s.top();
}
//*********************语法分析器******************************//
//Action表
int action[16][8] = { { 0, 0, 0, 0, 4, 0, 5, 0 },//0
{ 6, 7, 0, 0, 0, 0, 0, 100 },//1
{ -3, -3, 8, 9, 0, -3, 0, -3 },//2
{ -6, -6, -6, -6, 0, -6, 0, -6 },//3
{ 0, 0, 0, 0, 4, 0, 5, 0 },//4
{ -8, -8, -8, -8, 0, -8, 0, -8 },//5
{ 0, 0, 0, 0, 4, 0, 5, 0 },//6
{ 0, 0, 0, 0, 4, 0, 5, 0 },//7
{ 0, 0, 0, 0, 4, 0, 5, 0 },//8
{ 0, 0, 0, 0, 4, 0, 5, 0 },//9
{ 6, 7, 0, 0, 0, 15, 0, 0 },//10
{ -1, -1, 8, 9, 0, -1, 0, -1 },//11
{ -2, -2, 8, 9, 0, -2, 0, -2 },//12
{ -4, -4, -4, -4, 0, -4, 0, -4 },//13
{ -5, -5, -5, -5, 0, -5, 0, -5 },//14
{ -7, -7, -7, -7, 0, -7, 0, -7 }//15
};//17
//Goto表
int gotol[16][3] = { { 1, 2, 3 },//0
{ 0, 0, 0 },//1
{ 0, 0, 0 },//2
{ 0, 0, 0 },//3
{ 10, 2, 3 },//4
{ 0, 0, 0 },//5
{ 0, 11, 3 },//6
{ 0, 12, 3 },//7
{ 0, 0, 13 },//8
{ 0, 0,14 },//9
{ 0, 0, 0 },//10
{ 0, 0, 0 },//11
{ 0, 0, 0 },//12
{ 0, 0, 0 },//13
{ 0, 0, 0 },//14
{ 0, 0, 0 } };//17
//终结符集合
string endls[9] = { "+", "-", "*", "/", "(", ")", "=","id","#" };
//非终结符集合
string noends[3] = { "E", "T", "F" };
//产生式集合
string products[9] = { "E", "E+T", "E-T", "T", "T*F", "T/F", "F", "(E)", "id" };
/*
E=> T+F | T-F |T
T=> F*T | F/T |F
F=> (E) | id
*/
//状态栈
class statestack
{
private:
int *base;//栈底指针
int *top;//栈顶指针
int size;//栈内元素个数
int stacksize;//栈的大小
public:
statestack()
{
size = 0;
stacksize = 20;
base = new int[stacksize];
top = base;
}
int getTop()//获取栈顶的元素。
{
if (base == top)
{
return -1;
}
else
{
return *(top - 1);
}
}
bool statePush(int elem)//元素入栈
{
++size;
(*top) = elem;
++top;
return true;
}
void statePop(int time)//元素出栈
{
for (int i = 0; i<time; i++)
{
--top;
--size;
}
}
void printState()//输出栈内的所有元素
{
string str = " ";
int *pre;
for (pre = base; pre<top; pre++)
{
if (*pre>9) // 栈中保存的10转换成1、0
{
char ch1 = (*pre / 10) + 48;
char ch2 = (*pre % 10) + 48;
str += ch1;
str += ch2;
}
else
{
char ch = *pre + 48;
str += ch;
}
}
cout << setw(15) << setiosflags(ios_base::left) << str;
}
};
//符号栈
class symbolstack
{
private:
string *base;
string *top;
int size;
int stacksize;
public:
symbolstack()
{
size = 0;
stacksize = 20;
base = new string[stacksize];
top = base;
}
string getTop()//获取栈顶的元素。
{
if (base == top)
{
return "";
}
else
{
return *(top - 1);
}
}
//元素入栈
bool symbolPush(string elem)
{
++size;
*top = elem;
++top;
return true;
}
//元素出栈
void symbolPop(int time)
{
for (int i = 0; i<time; i++)
{
--top;
--size;
}
}
//输出栈内的所有元素
void printSymbol()
{
string str = "";
string *pre;
for (pre = base; pre<top; pre++)
{
str += *pre;
}
cout << setw(15) << setiosflags(ios_base::left) << str;
}
};
class analyseLR
{
private:
int step;
string inputstr;//布尔表达式
statestack state;//状态栈
symbolstack symbol;//符号栈
statestack data;//数据栈
//vector<string> fors;//四元式
public:
//构造函数
analyseLR()
{
step = 0;
inputstr = "";
state = statestack();
symbol = symbolstack();
编译原理——简单计算器的编译器的设计与实现 Calculator(终).rar
需积分: 44 78 浏览量
2019-09-20
11:34:23
上传
评论 10
收藏 2.24MB RAR 举报
喜马拉雅山的小松鼠
- 粉丝: 19
- 资源: 8
最新资源
- 冯璐阳 42105650—祝福.docx
- 基于多种算法及改进算法实现的移动机器人路径规划matlab源码(含A星算法+PRM+RRT的改进等).zip
- 布里斯托尔纸细分市场、总体规模、先进性、市占率行业分析报告2024年.docx
- Obi绳子插件,好用的很 6.5.4版本
- openjfx-22.0.1-windows-x64-bin-sdk.zip
- 基于ros和stm32f1的小车代码(含串口通信)+项目说明.zip
- 人体姿态估计-基于Tensorflow实现的人体姿态估计算法-附项目源码-优质项目分享.zip
- java实现所有算法大全
- JDBC DAO模式 (复习)
- Proteus仿真AT89C51电子密码锁
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈