编译原理end

#include<bits/stdc++.h>
using namespace std;const int max_word = 505;
//关键字 
const char keyWord[13][20] = {"main","if","else","do","while","for","switch",
"case","int","double","float","long","void"};//单词表 
struct Word{char value[20];//单词值 int type;//单词种类int line;//行号 
}w[max_word]; //四元式
struct si_Yuan{string op;//运算符string s1;string s2;string res;//结果 
}sy[105];
//文件流 
FILE *fin,*fout;
int line = 1;
char token[12];//存放单词 
int flag = 0;//判断是否获取字符 
int flag1 = 0,flag2;//flag1判断是否项已经产生miss错误; 
int e = 0;//错误个数 
int sy_num = 0;//四元式的个数
string op,s1,ss1,s2,res,res1,res2,op2,op1; 
int op_num = 0,op_num1 = 0;//运算符的个数
int sy_id;//四元式的序号 string var[300];//已经声明的变量 
int var_num = 0;//声明变量的个数 int sent_id;//判断if,while语句 
string equ[300];//= 
int a,b,c; 
int equ_num = 1; //=个数 
int cnt = 0,token_num = 0;//当前字符 
int row = 1;//当前行数 
char ch;
char ch1; int word_num = 0;//单词的总个数 
int word_cnt = 0;
string temp;
char str_int[20];
stack<string>word_stack;//保存 
stack<string>op_stack;
//程序 
void S();
void P();//(){分程序} 
void P1();//分程序 
void A();//变量说明部分
void B();//语句部分
void B1();
int C();//变量说明
void D();//标识符表
void D1();
void E();//标识符
void F();//字母 
void G();//数字 
void H();//语句 
void I();//赋值语句 
void J();//条件语句 
void K();//循环语句 
int L();//关系运算符 
void M();//表达式 
void M1();
void N();//项 
void N1();
int O();//加法运算符 
int Q();//乘法运算符 
void R();//常量 
void S();//无符号整数 
void T();//数字序列 
void W();//复合语句 
void X();//条件 
void Y();//语句1 
void Z();//因子//构造四元式 
void siYuan(string op,string s1,string s2,string res)
{	sy[sy_num].op =op;sy[sy_num].s1=s1;sy[sy_num].s2=s2;sy[sy_num].res=res;sy_num++;
}void printFour()//输出四元式 
{ofstream out("sy.txt");int i;for(i=0;i<sy_num;i++){cout<<i<<":\t("<<sy[i].op<<",\t"<<sy[i].s1<<",\t"<<sy[i].s2<<",\t"<<sy[i].res<<")"<<endl;out<<i<<":\t("<<sy[i].op<<",\t"<<sy[i].s1<<",\t"<<sy[i].s2<<",\t"<<sy[i].res<<")"<<endl;}
}
void error(string err)//报错,定位到错误行 
{cout<<"第"<<w[word_cnt].line<<"行出错!\t";cout<<err<<"\n";e++;
}//检查变量是否被声明
void is_say(string a)
{int i;for(i=1;i<=var_num;i++){if(a.compare(var[i])==0){break;}}if(i>var_num)  {cout<<"第 "<<w[word_cnt].line<<" 行出错!\t";cout<<w[word_cnt].value<<" 没有被声明 !"<<endl;e++;}
}void init_token(){int i;for(i = 0;i < 12;i++){token[i] = NULL;}
}int judge_token(){init_token();if(flag == 0){ch = getc(fin);}flag = 1;while(ch == ' ' || ch == '\t' || ch == '\n'){if(ch == '\n'){row++;}ch=getc(fin);}token_num = 0;if((ch>='a' && ch <= 'z') || (ch >= 'A' &&ch <= 'Z')){//可能为标识符或者变量名 while((ch>='a' && ch <= 'z') || (ch >= 'A' &&ch <= 'Z') || (ch >= '0' && ch <= '9')){token[token_num++] = ch;ch = getc(fin);}token[token_num++] = '\0';for(int i = 0;i <13;i++){if(strcmp(token,keyWord[i]) == 0){//3为关键词 return 3;}}//2为标识符 return 2;}//是数字 else if(ch >= '0' && ch <= '9'){while((ch >= '0'&& ch <= '9') || ch == '.'){token[token_num++] = ch;ch = getc(fin);}return 1;}else{token[token_num++] = ch;switch(ch){case '(': ch = getc(fin); return 16;case ')': ch = getc(fin); return 17;case '{': ch = getc(fin); return 33;case '}': ch = getc(fin); return 34;case '+':ch = getc(fin);if(ch == '+'){token[token_num++] = ch;ch = getc(fin); return 29;}else{return 18;}case '-':ch = getc(fin);if(ch == '-'){token[token_num++] = ch;ch = getc(fin); return 30;}else{return 19;}case '*':ch = getc(fin);if(ch == '/'){token[token_num++] = ch;ch = getc(fin); return 32;}else{return 20;}case '/':ch = getc(fin);if(ch == '*'){token[token_num++] = ch;ch = getc(fin); return 31;}else{ return 21;}//这里要重新编码 case '=':ch = getc(fin);if(ch == '='){token[token_num++] = ch;ch = getc(fin); return 23;}else{return 22;}case '>':ch = getc(fin);if(ch == '='){token[token_num++] = ch;ch = getc(fin); return 24;}else{return 23;}case '<':ch = getc(fin);if(ch == '='){token[token_num++] = ch;ch = getc(fin); return 26;}else{return 25;}case ';': ch = getc(fin); return 27;case '"': ch = getc(fin); return 28;case '!':ch = getc(fin);if(ch == '='){token[token_num++] = ch;ch = getc(fin); return 37;}else{return 36;}case '#': ch = getc(fin); return -2;case ',': ch = getc(fin); return 35;case EOF: return -1;default: ch = getc(fin); return -10;}}
}void getWord(){int temp;while(1){temp = judge_token();if(temp==-1){break;}switch(temp){case -10://cout<<"第 "<<row<<" 行出现错误."<<endl;error("word has a mistake");w[word_num].type = -1;strcat(w[word_num].value," ");word_num++;break;case -1:return;default:w[word_num].type  = temp;w[word_num].line = row;strcpy(w[word_num].value,token);word_num++;//cout<<"<"<<temp<<","<<token<<">"<<endl;break;}}
}
//程序 
void S(){if(strcmp("main",w[word_cnt].value)){error("miss main");word_cnt--;}word_cnt++;if(strcmp("(",w[word_cnt].value)){error("miss (");word_cnt--;}word_cnt++;if(strcmp(")",w[word_cnt].value)){error("miss )");word_cnt--;}word_cnt++;if(strcmp("{",w[word_cnt].value)){error("miss {");word_cnt--;}word_cnt++;P();if(strcmp("}",w[word_cnt].value)){error("miss }");word_cnt--;}op = "#";s1 = "";s2 = "";res = "";siYuan(op,s1,s2,res);cout<<"There are "<<e<<" mistakes in total."<<endl;
}
//分程序 
void P(){A();//变量说明部分if(strcmp(";",w[word_cnt].value)){error("miss ;");word_cnt--;}word_cnt++;B();//语句部分 
}
//变量说明部分 
void A(){if(C()){var[++var_num] = w[word_cnt].value;D();}else{D();}
}
//变量说明 
int C(){if(strcmp(w[word_cnt].value,"int")){error("miss int");return 0;}word_cnt++;return 1;
}
//标识符表
void D(){if(w[word_cnt].type != 2){error("denoter has a error");}word_cnt++;D1();
}
//子标识符表 
void D1(){if(strcmp(w[word_cnt].value,";") == 0){return;}if(strcmp(w[word_cnt].value,",")){error("miss ,");word_cnt--;}word_cnt++;var[++var_num] = w[word_cnt].value;if(w[word_cnt].type!=2){error("denoter has a error");}word_cnt++;D1();
}
//语句部分 
void B(){H();B1();
}
//子语句部分 
void B1(){if(strcmp(w[word_cnt].value,";") == 0){word_cnt++;H();B1();}else if(strcmp(w[word_cnt].value,"}") == 0){return;}else{error("miss ;");}
}
//语句 
void H(){cout<<"H()"<<endl;cout<<w[word_cnt].value<<endl;if(w[word_cnt].type == 2){op_num = 0;is_say(w[word_cnt].value);word_stack.push(w[word_cnt].value);word_cnt++;I();}else if(strcmp(w[word_cnt].value,"if") == 0){op_num = 0;J();}else if(strcmp(w[word_cnt].value,"while") == 0){op_num = 0;a = sy_num;K();op = "go";s1 = "";s2 = "";stringstream sss;//int 转 string sss<<a;sss>>res;siYuan(op,s1,s2,res);//修改while跳转的序号stringstream sss2;sss2<<sy_num;sss2>>sy[sent_id].res;}else{error("extra fuhao"); }
}//赋值语句
void I(){if(strcmp(w[word_cnt].value,"=") == 0){word_cnt++;//word_stack.push(w[word_cnt].value); M();if(e > 0){return;}if(op_stack.size() > 0){op = op_stack.top();op_stack.pop();s2 = word_stack.top();word_stack.pop();s1 = word_stack.top();word_stack.pop();res = word_stack.top();word_stack.pop();siYuan(op,s1,s2,res);}else{s1 = word_stack.top();word_stack.pop();res = word_stack.top();word_stack.pop();siYuan("=",s1,"",res);}}else{error("miss = ");word_cnt--; }
} 
//if语句 
void J(){cout<<"J()"<<endl;if(strcmp(w[word_cnt].value,"if")){error("miss if");word_cnt--;		}word_cnt++;if(strcmp(w[word_cnt].value,"(")){error("miss (");word_cnt--;}word_cnt++; //word_stack.push(w[word_cnt].value);X();//条件 sent_id = sy_num;if(op_stack.size() > 0 && e == 0){op = op_stack.top();op_stack.pop();s2 = word_stack.top();word_stack.pop();s1 = word_stack.top();word_stack.pop();siYuan(op,s1,s2,res);}if(strcmp(w[word_cnt].value,")")){error("miss )");word_cnt--;}word_cnt++;//四元式置为空op = "";s1 = "";s2 = "";res = "";Y();//语句1stringstream ss;ss<<sy_num+1;ss>>sy[sent_id].res;sent_id = sy_num;op = "go";s1 = "";s2 = "";res = "";siYuan(op,s1,s2,res);if(strcmp(w[word_cnt].value,"else")){error("miss else");word_cnt--;}word_cnt++;Y();stringstream ss2;ss2<<sy_num;ss2>>sy[sent_id].res;
}//while语句
void K(){cout<<"K()"<<endl;if(strcmp(w[word_cnt].value,"while")){error("miss while");word_cnt--;}word_cnt++;if(strcmp(w[word_cnt].value,"(")){error("miss (");word_cnt--;}word_cnt++;//word_stack.push(w[word_cnt].value);X();sent_id = sy_num;if(op_stack.size()>0 && e == 0){op = op_stack.top();op_stack.pop();s2 = word_stack.top();word_stack.pop();s1 = word_stack.top();word_stack.pop();siYuan(op,s1,s2,res);}//cout<<w[word_cnt].value<<endl;if(strcmp(w[word_cnt].value,")")){error("miss )");word_cnt--;}word_cnt++;if(strcmp(w[word_cnt].value,"do")){error("miss do");word_cnt--;}word_cnt++;Y();	
}void X(){cout<<"X()"<<endl;M();if(op_stack.size() > 0 && e == 0){op = op_stack.top();op_stack.pop(); s2 = word_stack.top();word_stack.pop(); s1 = word_stack.top();word_stack.pop();stringstream ss;ss << op_num;res = "t"+ss.str();word_stack.push(res);siYuan(op,s1,s2,res);}if(strcmp(w[word_cnt].value,">") == 0){op = "<=";}else if(strcmp(w[word_cnt].value,">=") == 0){op = "<";}else if(strcmp(w[word_cnt].value,"<") == 0){op = ">=";}else if(strcmp(w[word_cnt].value,"<=") == 0){op = ">";}else if(strcmp(w[word_cnt].value,"==") == 0){op = "!=";}else if(strcmp(w[word_cnt].value,"!=") == 0){op = "==";}//cout<<w.value<<"  "<<w.type<<endl;if(!L()){error("miss relation operator");word_cnt--;}op_stack.push(op);word_cnt++;//word_stack.push(w[word_cnt].value);//sent_id = sy_num;M();
}
//表达式 
void M(){cout<<"M()"<<endl;N();M1();
}
//子表达式 
void M1(){cout<<"M1()"<<endl;cout<<w[word_cnt].value<<endl;if(strcmp(w[word_cnt].value,";") == 0 || strcmp(w[word_cnt].value,")") == 0 || L() || strcmp(w[word_cnt].value,"}") == 0 || strcmp(w[word_cnt].value,"else") == 0){return;}else if(!O()){error("miss + or -");//word_cnt--;}else{op_stack.push(w[word_cnt].value);word_cnt++;//word_stack.push(w[word_cnt].value);op_num++; //getWord();//strcpy(b[b_num++].bds,new_w.value);N();M1();if(op_stack.size() > 1 && e == 0){op = op_stack.top();op_stack.pop();s2 = word_stack.top();word_stack.pop(); s1 = word_stack.top();word_stack.pop();stringstream ss;ss << op_num;res = "t"+ss.str();word_stack.push(res);siYuan(op,s1,s2,res);}}
}//项 ,消除左递归 
void N(){cout<<"N()"<<endl;Z();N1();
}
void N1(){cout<<"N1()"<<endl;cout<<w[word_cnt].value<<endl;//后根符号集,关系运算符  ;  ) if(strcmp(w[word_cnt].value,";") == 0 || strcmp(w[word_cnt].value,")") == 0 || strcmp(w[word_cnt].value,"}") == 0 || strcmp(w[word_cnt].value,"else") == 0 || L() || O()){return;}else if(!Q()){error("miss * or /");//分号出错转到语句 //word_cnt--;}//word_cnt++;else{op_num++;op_stack.push(w[word_cnt].value);word_cnt++;//word_stack.push(w[word_cnt].value);Z();N1();if(op_stack.size() > 1 && e == 0){op = op_stack.top();op_stack.pop();s2 = word_stack.top();word_stack.pop(); s1 = word_stack.top();word_stack.pop();stringstream ss;ss << op_num;res = "t"+ss.str();word_stack.push(res);siYuan(op,s1,s2,res);}}
}
//因子
void Z(){//cout<<w.value<<"  "<<w.type<<endl;//非数字或标识符 cout<<"Z()"<<endl;if(w[word_cnt].type!=1 && w[word_cnt].type!=2 &&strcmp(w[word_cnt].value,"(")){error("expression has a error");return;}//标识符if(w[word_cnt].type == 1||w[word_cnt].type == 2){if(w[word_cnt].type == 2){is_say(w[word_cnt].value);}word_stack.push(w[word_cnt].value);word_cnt++;//equ[equ_num++] = w.value;return;}else if(strcmp(w[word_cnt].value,"(") == 0){word_cnt++;//word_stack.push(w[word_cnt].value);M();if(e == 0){op = op_stack.top();op_stack.pop();s2 = word_stack.top();word_stack.pop(); s1 = word_stack.top();word_stack.pop();stringstream ss;ss << op_num;res = "t"+ss.str();word_stack.push(res);siYuan(op,s1,s2,res);}if(strcmp(w[word_cnt].value,")") == 0){word_cnt++;return;}else{error("miss )");}}return;
}//语句1 
void Y(){cout<<"Y()"<<endl; if(strcmp(w[word_cnt].value,"{") == 0){word_cnt++;B();//cout<<w.value<<endl;if(strcmp(w[word_cnt].value,"}")){error("miss }");}word_cnt++;return; }else{H();//语句return; }
}//关系运算符
int L(){if(((w[word_cnt].type > 22 && w[word_cnt].type <= 26) || w[word_cnt].type == 37)){return 1;}return 0;
} //加法运算符 
int O(){if(w[word_cnt].type == 18 || w[word_cnt].type == 19){return 1;}return 0;
}
//乘法运算符 
int Q(){if(w[word_cnt].type == 20 || w[word_cnt].type == 21){return 1;}return 0;
}int main(){fin = fopen("compiler.txt","r");getWord();S();if(e==0){printFour();}else{cout<<"\nSorry,can not generate siYuan."<<endl;}return 0;
}
/**/

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做了nginx反向代理之后常见问题汇总

1.客户端无缘无故的主动断开和服务器的连接&#xff0c;如图&#xff1a; 服务器端收到了FIN包&#xff0c;查看了nginx 的配置有个选项&#xff1a;proxy_timeout选项 设置为30s。 注意&#xff1a;“proxy_timeout”这个参数可以写在stream节点下&#xff0c;所有server都生效…

在GoogPlay上发布的包Facebook登录失败提示签名问题

在googplay提审的包发布后,发现Facebook登录功能异常,提示如下: 意识到可能是hashkey出问题了,但是之前测试都是好的,原来是上传包到googlePlay后有个二次签名,会修改hashkey的,所以需要在Facebook后台添加下重新签名的hashkey。 基本签名信息在Google Play 上都能查看…

JDK和Spring中的设计模式

JDK中的设计模式&#xff08;17&#xff09; 创建型 1&#xff09;工厂方法 Collection.iterator() 由具体的聚集类来确定使用哪一个Iterator 2&#xff09;单例模式 Runtime.getRuntime() 3&#xff09;建造者模式 StringBuilder 4&#xff09;原型模式 Java中的Clon…

解决苹果发布正式环境后支付拉不起来或获取商品列表为空问题

最近在海外苹果商店发布新游戏,经历了一个操蛋的两天: 产品在提交testflight沙盒环境下是可以获取到苹果商品列表,并且测试支付可以拉起并到账,等到我通过TF转发布到正式环境后,游戏点击游戏内商店获取商品列表就为空,更别提拉起支付了。 最开始先检查了苹果开发者后台的…

根据当前docker容器生成镜像提交到远端服务器

docker commit 4d6883e5fa21 gaoke/koa_ios docker push gaoke/koa_ios 然后在远端可看到

2019我做成的事情

1、ccpc河北金 这个省赛可能是退役赛了&#xff0c;因为下半年写项目&#xff0c;明年实习&#xff0c;没机会参加省赛、区预赛了。 2019.5大二的时候参加的&#xff0c;记得敲了个区间dp&#xff0c;大模拟&#xff0c;队友数学没搞出来&#xff0c;有一个搜索也是胆子不够大…

TCP: request_sock_TCP: Possible SYN flooding on port 80. Sending cookies. Check SNMP counters

最近老发现服务器丢包严重,想通过ssh登录查看原因,但是仍然失败,后来重启云服务器后通过单用户模式进入查看系统日志: TCP: request_sock_TCP: Possible SYN flooding on port 80. Sending cookies. Check SNMP counters 系统的内存,CPU资源是没问题的,足够当前的业务量…

记一次北美游戏服务器冬令时夏令时切换引发的时间问题

由于在运行的某SLG游戏在国内苹果商店多次拿到推荐,我们打算把它做到海外,部署按照全球唯一服的架构来部署,运维同事将集群中的各个模块选择部署在美国芝加哥的机房。上线一段时间后客服反馈平时凌晨3点重置玩家每日数据的时间变成了4点,往后推迟了1小时,当时怀疑是不是出…

Redis你不得不探索的11个问题

1. 说说Redis基本数据类型有哪些吧 字符串&#xff1a;redis没有直接使用C语言传统的字符串表示&#xff0c;而是自己实现的叫做简单动态字符串SDS的抽象类型。C语言的字符串不记录自身的长度信息&#xff0c;而SDS则保存了长度信息&#xff0c;这样将获取字符串长度的时间由O(…

(一)深入浅出TCPIP之理解TCP报文格式和交互流程

目录 1.引入TCP: 1.1 TCP用户代码 2. TCP数据报文格式 3 TCP栈及socket的初始化

leetcode85. 最大矩形

给定一个仅包含 0 和 1 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 示例: 输入: [ ["1","0","1","0","0"], ["1","0","1","1","…

(二)深入浅出TCPIP之再识TCP,理解TCP三次握手(上)

目录 1.三次握手 1.1 三次握手过程 1.2 TCP连接状态 1.3 TCP状态迁移路线分析 1.4 查看TCP状态命令

(三)深入浅出TCPIP之再识TCP,理解TCP四次挥手(上)

目录 1.TCP四次挥手过程 2.挥手连环发问 专栏其他文章: 理论篇: (一)深入浅出TCPIP之理解TCP报文格式和交互流程 (二)深入浅出TCPIP之再识TCP,理解TCP三次握手(上) (三)深入浅出TCPIP之再识TCP,理解TCP四次挥手(上) (四)深入浅出TCPIP之TCP三次握手和四次挥手…

(四)深入浅出TCPIP之TCP三次握手和四次挥手(下)的抓包分析

目录 1. 通过netstat来分析服务器和客户端的TCP状态 2.通过tcpdump抓包分析服务器和客户端的TCP状态 2.1 语法

(六)深入浅出TCPIP之TCP拥塞控制

目录 什么是网络拥塞 如何避免拥塞 拥塞点 避免拥塞 慢启动算法 算法思想

(五)深入浅出TCPIP之TCP流量控制

目录 TCP流量控制 滑动窗口 固定窗口和滑动窗口 如何告知发送方窗口大小 滑动窗口细节

(八)深入浅出TCPIP之TCP长连接与短连接详解

目录 通信方式 连接方式 1.长连接 1.1服务器中的长连接 1.2 长连接的维护

(十)深入浅出TCPIP之网络阻塞和非阻塞

专栏其他文章: 理论篇: (一)深入浅出TCPIP之理解TCP报文格式和交互流程 (二)深入浅出TCPIP之再识TCP,理解TCP三次握手(上) (三)深入浅出TCPIP之再识TCP,理解TCP四次挥手(上) (四)深入浅出TCPIP之TCP三次握手和四次挥手(下)的抓包分析 (五)深入浅出TCPIP之TCP流…

(九)深入浅出TCPIP之网络同步异步

目录 专栏其他文章: 同步和异步 同步与异步的例子 使用场景 代码示例 专栏其他文章: </

(十二)深入浅出TCPIP之Nagle算法

未完待续 专栏其他文章: 理论篇: (一)深入浅出TCPIP之理解TCP报文格式和交互流程 (二)深入浅出TCPIP之再识TCP,理解TCP三次握手(上) (三)深入浅出TCPIP之再识TCP,理解TCP四次挥手(上) (四)深入浅出TCPIP之TCP三次握手和四次挥手(下)的抓包分析 (五)深入浅出T…