亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gj.cpp

?? 該編譯器對表達式可實現詞法分析,語法分析,語義分析
?? CPP
字號:
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <stack>
using namespace std;

const short WORDLEN=20;
void cifa_main();
void yufa_main();
void yuyi_main();

int is(const char c);
int os(const char c);
int Translate_Four(string s);

int key = 0 ;                   //存儲標識
int key1 = 0 ;                  //存儲標識
int step = 0;                   //語義分析的過程編號
int temp_step = 1;    

void S(void);void X(void);void X1(void);void Y(void);void Y1(void);void Z(void);void S1(void);//函數原型
struct code_val{char code;char val[WORDLEN];} t; //定義臨時結構變量,存放單詞二元式。
ifstream cinf("lex_r.txt",ios::in); //從文件lex_r.txt輸入數據
ofstream coutf("par_r.txt",ios::out);//結果輸出至文件screen.txt

//預處理函數原型
void pro_process(char *);
//掃描函數原型
code_val scanner(char *);
//拼接函數原型
void concat(char [],char);
//查保留字表函數
char reserve(char []);
//主函數
int main()
{
    cout<<"        歡迎使用,此編譯器包括詞法分析,語法分析,最后進行的是語義分析!"<<endl;
	cout<<"         源測試碼在 source.txt 中 ,它能完成簡單賦值語句的分析過程  !"<<endl;
    system("pause");		
	cout<<"詞法分析部分:"<<endl;
	cout<<"**************************************"<<endl;
	cifa_main();
	cout<<"**************************************"<<endl;
	system("pause");


	cout<<"語法分析部分:"<<endl;
	cout<<"**************************************"<<endl;
	yufa_main();
	cout<<"**************************************"<<endl;
	system("pause");


	cout<<"語義分析部分:"<<endl;
	cout<<"**************************************"<<endl;
	yuyi_main();
	cout<<"**************************************"<<endl;
	return 0;
}
//詞法主函數
void cifa_main()
{
	char buf[4048]={'\0'};//掃描緩沖區


//預處理
	pro_process(buf);
//顯示buf
	cout<<buf<<endl;
//單詞識別
	ofstream coutf("Lex_r.txt",ios::out);
	code_val t;//臨時變量
	do{
		t=scanner(buf);//調用一次掃描器獲得一個單詞二元式
		cout<<t.code<<'\t'<<t.val<<endl;//屏幕顯示單詞二元式
 		coutf<<t.code<<'\t'<<t.val<<endl;//單詞二元式輸出至文件
	} while(t.code!='#');
	cout<<"End of lexical analysis!"<<endl;
	/*getch();*/
}
//掃描函數,每調用一次,返回一個單詞的二元式。
struct code_val scanner(char *buf)
{
	static int i=0;//buf指針
	struct code_val t={'\0',"NUL"};//臨時變量
	char token[WORDLEN]="";//用于拼接單詞
//去除前導空格
	while(buf[i]==' ')i++;
//開始識別單詞
	//標識符或基本字
	if(buf[i]>='a' && buf[i]<='z'){
		while(buf[i]>='a' && buf[i]<='z'||buf[i]>='0' && buf[i]<='9')
			concat(token,buf[i++]);
		t.code=reserve(token);//查保留字表
		if(t.code=='i')strcpy(t.val,token);//是標識符
		return t;//返回標識符或基本字的二元式
	}
	//整常數或實常數
	if(buf[i]>='0' && buf[i]<='9'){
		while(buf[i]>='0' && buf[i]<='9')
			concat(token,buf[i++]);
		if(buf[i]=='.'){//實常數123.
			concat(token,buf[i++]);
			while(buf[i]>='0' && buf[i]<='9')//123.4
				concat(token,buf[i++]);
			t.code='y';
		}
		else//整常數
			t.code='x';
		strcpy(t.val,token);
		return t;//返回當前單詞整常數(123)或實常數(123.或123.4)的二元式
	}
	//實常數
	if(buf[i]=='.'){
		concat(token,buf[i++]);
		if(buf[i]>='0' && buf[i]<='9'){
			while(buf[i]>='0' && buf[i]<='9')
				concat(token,buf[i++]);
			t.code='y';
			strcpy(t.val,token);
			return t;//返回當前單詞實常數(.123)的二元式
		}
		else{//單個.錯誤詞形
			cout<<"Error word>"<<token<<endl;
			exit(0);
		}
	}
	//其余單詞
	switch(buf[i]){
		case ',':
			t.code=',';
			break;
		case ';':
			t.code=';';
			break;
		case '(':
			t.code='(';
			break;
		case ')':
			t.code=')';
			break;
		case '=':
			t.code='=';
			break;
		case '+':
			if(buf[++i]=='+')	
				t.code='$';
			else{
				t.code='+';
				i--;
			}
			break;
		case '*':
			t.code='*';
			break;
		case '#':
			t.code='#';
			break;
		default://錯誤字符
			cout<<"Error char>"<<buf[i]<<endl;
			exit(0);
	}//end of switch
	i++;//指向下個單詞
	return t;//返回當前單詞的二元式
}
//拼接函數,原token="BEG", buf[i++]='I', 調用后token="BEGI"。
void concat(char token[],char c)
{
	for(int i=0;token[i];i++);
	token[i]=c;
	token[++i]='\0';
}
char reserve(char token[])
{
	const char *table[]={"begin","end","integer","real"};
	const char code[]={"{}ac"};
	for(int i=0;i<(int)strlen(code);i++)
		if(strcmp(token,table[i])==0) return code[i];
	return 'i';	//標識符的單詞種別為'i'
}
//預處理函數
void pro_process(char *buf)
{
	ifstream cinf("source.txt",ios::in);
	int i=0;char old_c='\0',cur_c;//計數器,前一個字符,當前字符。
	bool in_comment=false;//狀態標志,false表示當前字符未處于注釋中。
	while(cinf.read(&cur_c,sizeof(char))){//從文件讀一個字符
		switch(in_comment){
		case false:
			if(old_c=='/' && cur_c=='*'){//進入注釋
				i--;//去除已存入掃描緩沖區的字符'/'
				in_comment=true;
			}
			else {
				if(old_c=='\\' && cur_c=='\n') //去除續行符'\',包括后續換行符。
					i--;//去除已存入掃描緩沖區的字符'\'
				else {
					if(cur_c>='A' && cur_c<='Z') cur_c+=32;//大寫變小寫
					if(cur_c=='\t' || cur_c=='\n') cur_c=' ';//空格
					buf[i++]=cur_c ;
				}
			}
			break;
		case true:
			if(old_c=='*' && cur_c=='/')//離開注釋
				in_comment=false;
		}//end of switch
		old_c= cur_c;//保留前一個字符
	}//end of while
	buf[i]='#';
}
//語法主函數
string m;
void yufa_main(void)
{
	cinf>>t.code>>t.val;cout<<t.code<<"  "<<t.val <<endl;coutf<<t.code; m=t.code;//讀一個單詞的二元式并輸出單詞種別
	S( );
	if(t.code=='#')
	{
		cout<<m<<endl;
		cout<<endl<<"語法分析結束,語法正確。"<<endl;
		coutf<<endl<<"ok"<<endl;
	}
	else
	{
		cout<<"語法分析結束,語法錯誤。"<<endl;
		coutf<<endl<<"語法分析結束,語法錯誤。"<<endl;
		exit(0);
		
	}
}
void S(void){//S -> i = X ; | S1 
	if(t.code=='i'){
			cinf>>t.code>>t.val;cout<<t.code<<"  "<<t.val <<endl;coutf<<t.code;m=m+t.code;//讀一個單詞的二元式并輸出單詞種別
			if(t.code=='=')
			{
				cinf>>t.code>>t.val;cout<<t.code<<"  "<<t.val <<endl;coutf<<t.code;m=m+t.code;//讀一個單詞的二元式并輸出單詞種別

				 X( ); 	
				 	if(t.code==';')
					{
						cinf>>t.code>>t.val;cout<<t.code<<"  "<<t.val <<endl;coutf<<t.code;m=m+t.code;//讀一個單詞的二元式并輸出單詞種別
						S1();

					}
			}
	}

	else{
		cout<<"Err in S()>"<<endl;
		coutf<<endl<<"Err in S()>"<<t.code<<endl;exit(0);
	}
}
void S1(void)//S1 -> ; S1 | 空
{
	if(t.code=='i')
	{

	 S();
	}

	else if(!(t.code=='i'||t.code=='#'))
	{
		cout<<"Err in S1()>"<<endl;
		coutf<<endl<<"Err in S1()>"<<t.code<<endl;exit(0);

	}

}

void X(void)//X -> Y X1
{
	if(t.code=='-'||t.code=='i'||t.code=='x'||t.code=='y'||t.code=='('){//Y 的 first 集
	
		Y( ); X1( );
	}
	else 
	{
		cout<<"Err in X()>"<<endl;
		coutf<<endl<<"Err in X()>"<<endl<<t.code;
	}
}
void X1(void)//X1 -> + Y X1 | 空
{
	if(t.code=='+'){
		cinf>>t.code>>t.val;cout<<t.code<<"  "<<t.val <<endl;coutf<<t.code;m=m+t.code;//讀一個單詞的二元式并輸出單詞種別 

		Y( );X1( );
	}
	else if(!(t.code==')'||t.code=='#'||t.code==';')){//if(!t.code∈follow(X1))
		cout<<"Err in X1()>"<<endl;
		coutf<<endl<<"Err in X1()>"<<t.code<<endl;exit(0);
	}
}
void Y(void)//Y -> Z Y1
{
	if(t.code=='-'||t.code=='i'||t.code=='x'||t.code=='y'||t.code=='('){//Z的frist集
		Z( );Y1( );
	}
	else {
		cout<<"Err in Y()>"<<endl;
		coutf<<endl<<"Err in Y()>"<<t.code<<endl;exit(0);
	}
}
void Y1(void)//Y1 -> * Z Y1 | 空
{
	if(t.code=='*'){ 
		cinf>>t.code>>t.val;cout<<t.code<<"  "<<t.val <<endl;coutf<<t.code;m=m+t.code; //讀一個單詞的二元式并輸出單詞種別
		Z(); Y1();
	}
	else if(!(t.code=='+'||t.code==')'||t.code=='#'||t.code==';')){//if(!t.code∈follow(Y1))
		cout<<"Err in Y1>"<<endl;
		coutf<<endl<<"Err in Y1>"<<t.code<<endl;exit(0);
	}
}
void Z(void)//Z -> (X) | -Z | i | x | y 
{
	if(t.code=='i'||t.code=='x'||t.code=='y'){ 
		cinf>>t.code>>t.val;cout<<t.code<<"  "<<t.val <<endl;coutf<<t.code;m=m+t.code; //讀一個單詞的二元式并輸出單詞種別
	
	}
	else if(t.code=='(')
	{
		cinf>>t.code>>t.val;cout<<t.code<<"  "<<t.val <<endl;coutf<<t.code;m=m+t.code; //讀一個單詞的二元式并輸出單詞種別
		X();
		if(t.code==')')
		{
			cinf>>t.code>>t.val;cout<<t.code<<"  "<<t.val <<endl;coutf<<t.code; //讀一個單詞的二元式并輸出單詞種別
		}
	}
	else if(t.code=='-')
	{
		cinf>>t.code>>t.val;cout<<t.code<<"  "<<t.val <<endl;coutf<<t.code;m=m+t.code; //讀一個單詞的二元式并輸出單詞種別
		Z();

	}
	else{
		cout<<"Err in Z>"<<endl;
		coutf<<endl<<"Err in Z>"<<t.code<<endl;exit(0);
	}


}
//語義主函數
int is(const char c)        //棧內符號優先級
{
	switch(c)
	{
		case '(': return 0;
		case '+': return 2;
		case '-': return 2;
		case '*': return 4;
		case '/': return 4;
		case ')': return 5;
		default: return -1;
	}
}

int os(const char c)         //棧外符號優先級
{
      switch(c)
	  {
		case '(': return 6;
		case '+': return 1;
		case '-': return 1;
		case '*': return 3;
		case '/': return 3;
		case ')': return 0;
		default: return -1;
	  }
}
void yuyi_main()
{
	string s;//構建s串,把2元式拼接
	ifstream cin("Lex_r.txt");//重新定義cin
	char cur_c[WORDLEN];
	int flag = 0;
	//cin >> t.code >> t.val;
	
	while( cin >> t.code >> t.val && t.code!='#')
	{
		//cout<<t.code<<endl;
		s = "";
		strcpy(cur_c , t.val);
	    cin >> t.code >> t.val ;
			
		s = s + cur_c; //構建 “i =”
		s = s + t.code;
			while( cin >> t.code >> t.val &&t.code !=';'&& t.code != '#' )
				{
					if(t.code=='i'||t.code == 'x'||t.code == 'y')   //變量
						s= s+t.val;
					else s=s+t.code;                              //符號
					flag = 1;
				}
				if(flag)
				{
					cout<<"分析表達式  : "<<s<<endl;
					Translate_Four(s);                              //分析表達式串
				}
	}

}			
int Translate_Four(string s)           //四元式翻譯
{
stack<string> OPND;
stack<char> OPER;
char op;
string left, right;
int i = 0;
char sChange[10];
string sTemp;
for ( i=0; i<(int)s.length(); i++)
{
   if ( (s[i]>='0' && s[i]<='9') || (s[i]>='a' && s[i]<='z') )
   {
    sTemp = "";
    sTemp += s[i];
	int y = i+1 ;
	while( (s[y]>='0' && s[y]<='9') || (s[y]>='a' && s[y]<='z') || ( s[y] == '.' ) || ( s[y] == '_') )
	{
		sTemp += s[y];                          
		y++;				                  
	}
	i = y-1 ;
    OPND.push(sTemp);                      
	OPND.push("@");                             //用'@'來分隔
   }
   else                            //判斷運算符
   {
    while (!OPER.empty() && os(s[i])<is(OPER.top()))   //站內優先級高,可以彈棧
    {
		left = right = "";
       if(OPND.top()=="@")
	   {	   
		   OPND.pop();
         right = right + OPND.top() ;      
         OPND.pop();
		}
	 if(OPND.top()=="@")
	{
		 OPND.pop(); 
		left = left + OPND.top();            
		 OPND.pop();
	 }
     op = OPER.top();
     OPER.pop();
     cout << "(" << step << ")   ";
     step++;
     sTemp = _itoa(temp_step, sChange, 10);        
     sTemp = "T" + sTemp;
  //   temp_num++;  
	 temp_step++;
     OPND.push(sTemp);
	 OPND.push("@");
   if(left[0]>='a'&&left[0]<='z') left = '&'+left;
   if(right[0]>='a'&&right[0]<='z' ) right = '&' + right;
     cout << op << "   " << left << "   " << right << "   " << sTemp << endl;
    }//end of while
    if(!OPER.empty() && os(s[i])==is(OPER.top()))   //遇到右“)”時,將 “(” 彈出
     OPER.pop();
    else
	{
		OPER.push(s[i]);         // 不滿足優先級關系 或 符號棧為空 將當前運算符加入符號棧
	}	
   }
}
while (!OPER.empty())                 //將符號棧剩余符號依次彈出
{
	left = right = "";
	if( OPER.top() != '=')
	{
		if(OPND.top()=="@")
		{
			OPND.pop();
		   right = right + OPND.top();      //右操作數    
		}
		else 
		{
		   right = right + OPND.top();      //右操作數    
		}
		OPND.pop();
		if(OPND.top()=="@")
		{
			OPND.pop();
		left = OPND.top();                 //左操作數
		} 
		else 
		{	
		left = OPND.top();                //左操作數
		}
		OPND.pop();
      op = OPER.top();
      OPER.pop();
   cout << "(" << step << ")   ";
   step ++;
   sTemp = _itoa(temp_step, sChange, 10);
   sTemp = "T" + sTemp;
//    temp_num++;                    //臨時變量加1
	temp_step++;                  //臨時變量標識加1                 
   OPND.push(sTemp);              //臨時變量壓棧
   if(left[0]>='a'&&left[0]<='z') left = '&'+left;
   if(right[0]>='a'&&right[0]<='z' ) right = '&' + right;
   cout << op << "   " << left << "   " << right << "   " << sTemp << endl;
	}
	else /////////////////////            "="            //最后的“=” 號 處理
	{
	right = "0";                                // 右操作數置0
	if(OPND.top()=="@")
	{
		OPND.pop();
		left =left + OPND.top();
	}
	else 
		left =left + OPND.top();
	OPND.pop();
    op = OPER.top();
   OPER.pop();
   cout << "(" << step << ")   ";
   step++;
   //if(OPND.top()=='@') OPND.pop();
    sTemp = "";
	OPND.pop();
   sTemp += OPND.top();
   if(left[0]>='a'&&left[0]<='z') left = '&'+left; 
   if(sTemp[0]>='a'&&sTemp[0]<='z') sTemp = '&'+sTemp;
   cout << "j" <<op << "   " << left << "   " << right << "   " << sTemp << endl;
	}
}
return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲与欧洲av电影| 欧美在线影院一区二区| 成人激情校园春色| 欧美无人高清视频在线观看| 亚洲男人的天堂在线观看| 久久99日本精品| 日韩区在线观看| 精品一区二区久久久| 91精品一区二区三区久久久久久| 亚洲国产精品久久不卡毛片| 色婷婷综合久久久中文字幕| 亚洲国产一二三| 欧美精品日日鲁夜夜添| wwwwxxxxx欧美| 91社区在线播放| 亚洲影院理伦片| 欧美专区日韩专区| 蜜臀va亚洲va欧美va天堂 | 亚洲国产精品一区二区久久| 欧美久久免费观看| 国产一区91精品张津瑜| 久久综合九色综合97婷婷女人 | 另类中文字幕网| 久久久久久久久99精品| 丁香天五香天堂综合| 日韩一区二区三区视频| 高清视频一区二区| 亚洲人成7777| 欧美老人xxxx18| 成人综合在线网站| 亚洲自拍偷拍综合| 日韩欧美第一区| 国产成人综合网站| 亚洲六月丁香色婷婷综合久久 | 精品99999| 成人动漫一区二区| 一区二区三区在线免费观看| 欧美色成人综合| 国产精品2024| 亚洲与欧洲av电影| 精品久久久久久久久久久久包黑料 | 欧美成人在线直播| 成人午夜在线播放| 午夜欧美在线一二页| 久久久久久久久一| 99久久精品一区二区| 美女任你摸久久| 亚洲欧美乱综合| 日韩精品一区二区三区三区免费 | 26uuu国产一区二区三区| 成人免费毛片a| 日日噜噜夜夜狠狠视频欧美人 | 日本不卡123| 国产精品情趣视频| 日韩一区二区影院| 国产精品99精品久久免费| 亚洲成人高清在线| 国产欧美日韩在线| 在线观看国产日韩| proumb性欧美在线观看| 日本成人在线看| 亚洲精品少妇30p| 精品福利一二区| 欧美欧美欧美欧美首页| av不卡免费在线观看| 韩国精品久久久| 日韩有码一区二区三区| 17c精品麻豆一区二区免费| 日韩欧美区一区二| 欧美伊人久久久久久久久影院 | 91麻豆精品91久久久久久清纯| 国产福利电影一区二区三区| 免费在线观看视频一区| 亚洲成人免费看| 亚洲香蕉伊在人在线观| 一卡二卡三卡日韩欧美| 亚洲乱码国产乱码精品精的特点| 国产精品久久久久久妇女6080| 欧美激情自拍偷拍| 国产色91在线| 中日韩免费视频中文字幕| 国产精品久久久久久久久果冻传媒 | a美女胸又www黄视频久久| 国产成人99久久亚洲综合精品| 国产精品主播直播| 成人精品小蝌蚪| 成人手机在线视频| 99在线精品免费| 色欧美片视频在线观看在线视频| 欧美撒尿777hd撒尿| 91.com视频| 久久亚洲二区三区| 欧美国产一区视频在线观看| 亚洲人成网站影音先锋播放| 亚洲国产综合色| 蜜桃91丨九色丨蝌蚪91桃色| 激情综合色播五月| 成人性生交大片免费看中文| 一本大道综合伊人精品热热| 欧美午夜电影网| 欧美精品一区二| 亚洲精选免费视频| 日韩精品视频网站| 国产乱码一区二区三区| 91毛片在线观看| 欧美高清性hdvideosex| 久久久亚洲精品石原莉奈| 日韩毛片在线免费观看| 亚洲精品第一国产综合野| 天堂av在线一区| 国产精品一区二区91| 色哟哟亚洲精品| 欧美精品一区二区精品网| 国产精品嫩草影院com| 亚洲午夜精品在线| 国产精品白丝jk白祙喷水网站| 91在线视频免费91| 日韩亚洲国产中文字幕欧美| 国产欧美日韩精品在线| 亚洲综合成人在线| 国产中文字幕一区| 日本久久电影网| 精品国产人成亚洲区| 中文字幕在线观看一区二区| 日本美女一区二区三区| 99精品视频在线免费观看| 日韩一区二区视频在线观看| 亚洲欧美aⅴ...| 国产麻豆欧美日韩一区| 欧美视频在线一区二区三区| 欧美激情在线观看视频免费| 99久久精品久久久久久清纯| 91麻豆精品国产91久久久资源速度| 中文字幕乱码亚洲精品一区| 青青草97国产精品免费观看无弹窗版| 91香蕉视频mp4| 久久女同互慰一区二区三区| 日本在线不卡一区| 色久优优欧美色久优优| 国产清纯白嫩初高生在线观看91 | av电影天堂一区二区在线观看| 日韩欧美专区在线| 亚洲综合清纯丝袜自拍| 成人一道本在线| 久久蜜桃一区二区| 美女脱光内衣内裤视频久久影院| 欧美日韩另类一区| 亚洲女同一区二区| 福利电影一区二区| 欧美精品一区二区在线观看| 蜜臀精品一区二区三区在线观看| 国产一区二区三区最好精华液| 欧美久久久久久久久中文字幕| 亚洲精品网站在线观看| 不卡的电影网站| 中文成人综合网| 福利一区在线观看| 久久久久久久久久久久久久久99 | 91国偷自产一区二区使用方法| 国产农村妇女毛片精品久久麻豆| 极品少妇一区二区三区精品视频| 在线不卡a资源高清| 丝袜脚交一区二区| 91.麻豆视频| 青青草视频一区| 日韩精品一区二区三区在线观看| 美国三级日本三级久久99| 欧美一区二区三区啪啪| 日韩极品在线观看| 日韩午夜电影av| 狠狠色综合播放一区二区| 亚洲天堂2016| 日本道精品一区二区三区| 一区二区三区蜜桃网| 欧美日韩视频第一区| 天天亚洲美女在线视频| 日韩一区二区在线观看视频| 精彩视频一区二区三区| 国产视频一区二区在线| www.视频一区| 亚洲综合无码一区二区| 欧美一区二区视频在线观看2020| 青青草国产成人99久久| 久久青草欧美一区二区三区| 成人激情动漫在线观看| 亚洲一区在线播放| 337p亚洲精品色噜噜| 国产乱人伦偷精品视频不卡| 国产精品丝袜在线| 色婷婷综合在线| 蜜臀av性久久久久蜜臀aⅴ| 久久精品夜色噜噜亚洲a∨| 不卡一区在线观看| 午夜日韩在线观看| 久久久久综合网| 色播五月激情综合网| 日本不卡123| **欧美大码日韩| 日韩精品一区二区三区四区| 成人免费看的视频|