编译原理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();//语句1
	
	stringstream 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;
}
/*

*/

 

展开阅读全文

Git 实用技巧

11-24
这几年越来越多的开发团队使用了Git,掌握Git的使用已经越来越重要,已经是一个开发者必备的一项技能;但很多人在刚开始学习Git的时候会遇到很多疑问,比如之前使用过SVN的开发者想不通Git提交代码为什么需要先commit然后再去push,而不是一条命令一次性搞定; 更多的开发者对Git已经入门,不过在遇到一些代码冲突、需要恢复Git代码时候就不知所措,这个时候哪些对 Git掌握得比较好的少数人,就像团队中的神一样,在队友遇到 Git 相关的问题的时候用各种流利的操作来帮助队友于水火。 我去年刚加入新团队,发现一些同事对Git的常规操作没太大问题,但对Git的理解还是比较生疏,比如说分支和分支之间的关联关系、合并代码时候的冲突解决、提交代码前未拉取新代码导致冲突问题的处理等,我在协助处理这些问题的时候也记录各种问题的解决办法,希望整理后通过教程帮助到更多对Git操作进阶的开发者。 本期教程学习方法分为“掌握基础——稳步进阶——熟悉协作”三个层次。从掌握基础的 Git的推送和拉取开始,以案例进行演示,分析每一个步骤的操作方式和原理,从理解Git 工具的操作到学会代码存储结构、演示不同场景下Git遇到问题的不同处理方案。循序渐进让同学们掌握Git工具在团队协作中的整体协作流程。 在教程中会通过大量案例进行分析,案例会模拟在工作中遇到的问题,从最基础的代码提交和拉取、代码冲突解决、代码仓库的数据维护、Git服务端搭建等。为了让同学们容易理解,对Git简单易懂,文章中详细记录了详细的操作步骤,提供大量演示截图和解析。在教程的最后部分,会从提升团队整体效率的角度对Git工具进行讲解,包括规范操作、Gitlab的搭建、钩子事件的应用等。 为了让同学们可以利用碎片化时间来灵活学习,在教程文章中大程度降低了上下文的依赖,让大家可以在工作之余进行学习与实战,并同时掌握里面涉及的Git不常见操作的相关知识,理解Git工具在工作遇到的问题解决思路和方法,相信一定会对大家的前端技能进阶大有帮助。
©️2020 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值