FZU_编译原理【作业一】

体验版,仅提供简单的思路,考虑的情况不多

#include<bits/stdc++.h>
using namespace std;
map<string,string> word;//应用map数据结构形成一个string->string的对应

std::map<string,string>::iterator it;//用来遍历整个对应关系的迭代器

void map_init(){//对应关系进行初始化
    word["begin"]="beginsym";
    word["call"]="callsym";
    word["const"]="constsym";
    word["do"]="dosym";
    word["end"]="endsym";
    word["if"]="ifsym";
    word["odd"]="oddsym";
    word["procedure"]="proceduresym";
    word["read"]="readsym";
    word["then"]="thensym";
    word["var"]="varsym";
    word["while"]="whilesym";
    word["write"]="writesym";
    word["+"]="plus";
    word["-"]="minus";
    word["*"]="times";
    word["/"]="slash";
    word["="]="eql";
    word["<>"]="neq";
    word["<"]="lss";
    word["<="]="leq";
    word[">"]="gtr";
    word[">="]="geq";
    word[":="]="becomes";
    word["("]="lparen";
    word[")"]="rparen";
    word["{"]="界符";
    word["}"]="界符";
    word[","]="comma";
    word[";"]="semicolon";
    word["."]="period";
    word["int"]="key";
    word["string"]="key";
}

int main(){
	map_init();//初始化
    char ch;
    string str;//string变量进行字符识别
    string wordtest;
    
	ifstream infile("E:\\桌面\\新建文本文档.txt");//文件输入流
    ostringstream buf;
    
    while(buf&&infile.get(ch)) buf.put(ch);//将文件中的字符读出来
    str= buf.str();//将得到的字符储存到string类型变量中
	int csize=str.length();
	int state;
	int p;
	
	int i = 0;
	
	int lockp;
	
	bool debug = false;
    while(i<csize){
    	while(str[i]==' '||str[i]=='\n') i++;
    	wordtest = "";
    	//自动机
		state = 0;
		if(debug)cout<<"view:1;i:"<<i<<";p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
		while(state != -1){
			p = i;
			if(debug)cout<<"view:2;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
	    	switch(state){
	    		//id判断 
	    		case (0):{
	    			if(debug)cout<<"view:3;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
	    			state = 1;
	    			p = i;
	    			while(state != 4 && state != -1){//跳转下一个自动机
		    			switch(state){
		    				case (1):{
		    					if(debug)cout<<"view:4;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
		    					if(isalpha(str[p])){
		    						wordtest=str[p];
		    						p++;
		    						state = 2;
								}
								else{
									state = 4;//跳转下一个自动机
								}
		    					break;
		    				}
		    				case (2):{
		    					if(debug)cout<<"view:5;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
		    					if(!isalpha(str[p]) && !isdigit(str[p])){
		    						state = 3;
		    						lockp = p;
								}
								else{
									wordtest+=str[p];
									p++;
								}
								break;
							}
		    				case (3):{
		    					if(debug)cout<<"view:6;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
		    					it=word.find(wordtest);
					            if(it!=word.end())//判断是不是基本字,若为基本字则进行输出
								{
					                cout<<"<"<<wordtest<<","<<word[wordtest]<<">"<<endl;
					            }
					            else//否则直接输出
								{
					                cout<<"<"<<wordtest<<","<<"ident"<<">"<<endl;//判断是不是变量名 
					            }
					            state = -1;//跳转下一个自动机 
					            i = lockp - 1;
					            if(debug)cout<<"view:7;i:"<<i<<";p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
					        	break;
							}
						}
					}
					break; 
				}
				//数字自动机 
				case (4):{
					if(debug)cout<<"view:8;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
					state = 5;
					p = i;
	    			while(state != 13 && state != -1){//跳转下一个自动机 
	    				switch(state){
							case (5):{
		    					if(debug)cout<<"view:9;str[p]:"<<str[p]<<";p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
		    					if(isdigit(str[p])){
		    						wordtest = str[p];
		    						p++;
		    						state = 6;
								}
								else{
									state = 13;//跳转下一个自动机 
								}
		    					break;
		    				}
		    				case (6):{//第一次非数字 
		    					if(debug)cout<<"view:10;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
		    					if(!isdigit(str[p])){
		    						if(str[p] == '.'){
		    							wordtest += str[p];
		    							p++;
		    							state = 7;
									}
									else if(str[p] == 'E'){
										wordtest += str[p];
										p++;
										state = 9;
									}
									else{
										state = 11;
										lockp = p;
									}
								}
								else{
									wordtest += str[p];
									p++;
								}
								break;
							}
							case (7):{//包含小数点的数 
								if(debug)cout<<"view:11;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
								if(!isdigit(str[p])){//小数点后不是数字 
		    						state = 12;//错误
								}
								else{
									wordtest += str[p];
									p++;
									state = 8; 
								}
								break;
							}
							case (8):{
								if(debug)cout<<"view:12;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
								if(!isdigit(str[p])){
		    						if(str[p] == '.'){
		    							state = 12;//错误
									}
									else if(str[p] == 'E'){
										wordtest += str[p];
										p++;
										state = 9;
									}
									else{
										lockp = p;
										state = 11;
									}
								}
								else{
									wordtest += str[p];
									p++;
								}
								break;
							}
							case (9):{
								if(debug)cout<<"view:13;str[p]:"<<str[p]<<";p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
								if(str[p] == '+' || str[p] == '-'){
									wordtest += str[p];
									p++;
									state = 10;
								}
								else{
									state = 12;//错误 
								}
								break;
							}
							case (10):{
								if(debug)cout<<"view:14;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
								if(!isdigit(str[p])){
									lockp = p;
									state = 11;
								}
								else{
									wordtest += str[p];
									p++;
								}
								break;
							}
							case(11):{
								if(debug)cout<<"view:15;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
								if(isalpha(str[p]) || str[p] == '.' || str[p] == ':'){
									state = 12;//出错 
									cout<<"error"; 
								}
								else{
									i = lockp - 1;
									state = -1;
									cout<<"<"<<wordtest<<","<<"num"<<">"<<endl;//判断是不是变量名
								}
								break;
							}
							case(12):{
								if(debug)cout<<"view:16;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
								state = -1;
								while(isalpha(str[p])||isdigit(str[p])||str[p]=='E'||str[p]=='+'||str[p]=='-')p++;
								i = p;
								break;
							}
						}
	    			}
					break;
				}
    			case (13):{
    				p = i;
    				state = 14;
    				while(state != 18 && state != -1){
    					switch(state){
    						case (14):{
    							if(!isalpha(str[p]) && !isdigit(str[p])){
    								state = 15;
    								wordtest = str[p];
    								p++;
								}
								break;
							}
							case (15):{
								it=word.find(wordtest);
								if(it == word.end()){
									state = 16;
    								lockp = p;
								}
								else{
									while(word.find(wordtest + str[p])!=word.end()){
										wordtest += str[p];
										p++;
									}
									state = 16;
    								lockp = p;
								}
								break;
							}
							case (16):{
								it=word.find(wordtest);
					            if(it!=word.end())//判断是不是基本字,若为基本字则进行输出
								{
					                cout<<"<"<<wordtest<<","<<word[wordtest]<<">"<<endl;
					            }
					            else//否则直接输出
								{
					                cout<<"error"<<endl;//判断是不是变量名 
					            }
					            state = -1;//跳转下一个自动机 
					            i = lockp - 1;
								break;
							}
						}
					}
    				if(debug)cout<<"view:17;p:"<<p<<";state:"<<state<<";wordtest:"<<wordtest<<endl;
					break;
				}
				default:
					state = -1;
					break;
			}
		}
		i++;
	}
	infile.close();
	return 0;
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值