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

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

?? cck.cpp

?? 基于遞歸下降分析法的循環語句WHILE E DO S1的語法及語義分析程序
?? CPP
字號:
#include<iostream.h>
#include<fstream.h>
#include<string.h>
#include<iomanip.h>

#define $other 19
#define $mul   20
#define $div   21
#define $add   22
#define $sub   23
#define $fen   24
#define $equal 25
#define $WHILE 26              
#define $DO    27 
#define $big   29
#define $small 30
#define $ID    31       //字符
#define $num   32       //數字


/////////////////////////////////////////////////////////////
                                              
typedef struct Token
{
	int type;
	char ch;
}Token;                                   //定義輸入串的結構

typedef enum{JUMP,JG,JL,equal,END,add,mul,sub,div}OpKind;      //操作符
typedef struct
{
	int label;//標號
	OpKind op;//操作符
	char par1,par2; //操作數
	union{
		char result; //結果
		int address; // 地址
	};
}Quad;      

typedef struct{				//逆波蘭
	char nbl1[10];			//操作數數組
	char nbl2[20];			//操作符數組
}Nbl;



/////////////////////////////////////////////////////////////
#define MAX_TOKEN 256 //Token表大小  詞法分析
#define MAX_QUAD 256 //逆波蘭式數組大小

Token tokentable[MAX_TOKEN];    //建立詞法表
Quad quad[MAX_QUAD];            //建立逆波蘭式表
Nbl	nbl[10];
int nbln=0;					//第幾條逆波蘭式
int n=0;					//nbl1中當前包含幾個字符
int j=0;
int m=0;
int token_index;//token表索引
int total_len;//token表有效長度

int quad_len;//逆波蘭式表有效長度
int quad_index;//逆波蘭式索引
Token cur;
Token queue[10];
int label,k,one;      //標記接口
ifstream ins;
int trueadd,falseadd,end;

                                                //申明函數
bool init(char filename[255]);
bool cifa();                           //詞法分析函數
void print();                          //詞法輸出函數

void backpath(int,int);
void ERROR();
void S();
char M_addsub();
char F_addsub(char);
char P_muldiv(char);
char T_muldiv();
char B_number();
void E();
bool nexttoken();
int newlabel();
char newchar();
void push();
void nextone();
void yuyi();                        //語義分析函數
void printQuad();                   //輸出逆波蘭式表
void AD_ADDRESS(int nlabel,OpKind nop,char npar1,char npar2,int naddress);
void AD_RESULT(int nlabel,OpKind nop,char npar1,char npar2, char nresult);
///////////////////////////////////////////////////////////////

void main()
{   
	cout<<"文法結構:"<<endl;
	cout<<"------------------------------"<<endl;
	cout<<"S->M | WHILE E DO S "<<endl;
  	cout<<"E->id ^ id | id v id | ! id"<<endl;
    cout<<"M->TF|T"<<endl;
    cout<<"F-> +TF |-TF|ε"<<endl;
    cout<<"T->BP|B"<<endl;
    cout<<"P->*BP|/BP|ε"<<endl;
    cout<<"B->id|digit"<<endl;
	cout<<"------------------------------"<<endl;
	cout<<"請輸入文件名稱:";
	char fname[200];
	cin>>fname;
	if(!init(fname))               //打開文件
		return ;
	if(!cifa())                    //調用cifa()函數進行詞法分析
		return ;
	char ch;
	while(1)
	{
		if(ins.eof())
			break;
		ins>>ch;
	}
	cout<<"詞法分析結果:"<<endl;
	print();                    //輸出詞法分析結果
	cout<<endl;
	cout<<"詞法分析結束"<<endl;
	cout<<endl;
	
	yuyi();                   //調用語法語義分析函數
	printQuad();              //輸出逆波蘭式
	if(label==0)
		cout<<"語法語義分析成功!"<<endl;
	else
		cout<<"語法語義分析失敗!"<<endl;
}
char newchar()
{ char p;
    p=char(k);
	k++;
	return p;	 
}

//文件打開初始化
bool init(char filename[255])
{   
	one=0;
	token_index=0;
	total_len=0;
	quad_len=0;
	quad_index=0;
	label=0;
	end=0;
	k=48;
	ins.open(filename,ios::nocreate | ios::in);
	if(ins.fail())
	{
		cout<<"文件打開出錯!"<<endl;
		return false;
	}

	return true;
}
//////////////////////////////////////////////////////////
                                                   //詞法分析
bool cifa()
{
	int k=0;
	char buf[16];
	char ch;
	while(1)
	{
		ins>>ch;
		if(ins.fail())
			break;
		while(ch==' ')
		{	ins>>ch;}
		if(ch=='W')                                  //對輸入串進行掃描
		{
			ins>>buf;
			if(strcmp(buf,"HILE")==0)                //掃描到while
				tokentable[total_len++].type=$WHILE; //就將while關鍵字存入表中
		}
		else if(ch=='D')
		{
			ins>>buf;
			if(strcmp(buf,"O")==0)
				tokentable[total_len++].type=$DO;    //將do關鍵字存入表中
		}
		else if(ch=='>')                             //以下將其他字符或數字存入表中
		{
			tokentable[total_len++].type=$big;
		}
			else if(ch=='<')
		{
			tokentable[total_len++].type=$small;
		}
		else if(ch=='=')
		{
			tokentable[total_len++].type=$equal;
		}
		else if((ch>='A'&& ch<='Z' )|| (ch>='a' && ch<='z'))
		{
			tokentable[total_len].type=$ID;
			tokentable[total_len++].ch=ch;
		}
		else if(ch>='0' && ch<='9')
		{	tokentable[total_len].type=$num;
		    tokentable[total_len++].ch =ch;
		}
		else
		switch (ch)                            //將掃描到的操作符存入表中
		{case '+' :
			tokentable[total_len].type=$add;
		    tokentable[total_len++].ch =ch;
	     	break;
		   case '-' :
			tokentable[total_len].type=$sub;
		    tokentable[total_len++].ch =ch;
	    	break;
			 case '/' :  	
			tokentable[total_len].type=$div;
		    tokentable[total_len++].ch =ch;
	    	break;
			 case '*' :
			tokentable[total_len].type=$mul;
		    tokentable[total_len++].ch =ch;
			break;
			 case ';' :
			tokentable[total_len].type=$fen;
		    tokentable[total_len++].ch =ch;
	    	break;
			 default:cout<<"!"<<endl;
		  
		}
	}
	return true;
	
}
void AD_RESULT(int nlabel,OpKind nop,char npar1,char npar2, char nresult)
{quad[quad_len].label=nlabel;
 quad[quad_len].op=nop; 
 quad[quad_len].par1=npar1;
 quad[quad_len].par2=npar2; 
 quad[quad_len].result=nresult; 
 quad_len++; 
}
void AD_ADDRESS(int nlabel,OpKind nop,char npar1,char npar2,int naddress)
 {	quad[quad_len].label=nlabel; 
	quad[quad_len].op=nop;
	quad[quad_len].par1=npar1;
	quad[quad_len].par2=npar2; 
	quad[quad_len].address=naddress;
	quad_len++; 
}


//掃描下一個單詞函數
bool nexttoken()
{
	if(token_index>=total_len)
		return false;
	if(tokentable[token_index].type==$fen)
		token_index++;
	cur.type=tokentable[token_index].type;
	cur.ch=tokentable[token_index].ch;
	token_index++;
	return true;
}
//進隊列
void push()
{   
while(tokentable[token_index].type!=$fen)
{
	queue[one].type=tokentable[token_index].type;
	queue[one].ch=tokentable[token_index].ch;
	token_index++;
	one++;
}
}
//隊列下一個字符
void next()
{
 one--;
 cur.type=queue[one].type;
 cur.ch =queue[one].ch ;

}
//錯誤處理
void ERROR(char str[20])
{   label++;
	cout<<endl;
	cout<<"error!  "<<str<<endl;
}
          
void S()                 //處理S->id=M | while E do S語句
{   char rtn;
    char c;
	if(!nexttoken())
		ERROR("s(0)");
	if(cur.type==$ID)    
	{   	  
		c=cur.ch;
		if(!nexttoken())
		 ERROR("S(0)");
		if(cur.type!=$equal)
			ERROR("S(equal)");
		push();
		rtn=M_addsub();                             //調用M_addsub()函數分析加減法
		AD_RESULT(quad_len,equal,rtn,0,c);          //分析同時產生逆波蘭式
		nexttoken();                                //加入逆波蘭式表中
		while(cur.type==$ID)
		{
		c=cur.ch;
		if(!nexttoken())
		 ERROR("S(0)");
		if(cur.type!=$equal)
			ERROR("S(equal)");
		push();
		rtn=M_addsub();
		AD_RESULT(quad_len,equal,rtn,0,c);
		nexttoken();
		}
	}
	else if(cur.type==$WHILE)                         //當當前字符為while時
	{	    
			E();                                      //判斷表達式E真值,調用E()函數
	     	if(!nexttoken())
			ERROR("S(0)");
			if(cur.type==$DO)                         //
			{  
				backpath(trueadd,quad_len+1);				
				S();                                  //遞歸調用S()分析do 之后的表達式        
				end=quad_len;
                 AD_ADDRESS(quad_len,JUMP,0,0,end);               

			}
			else
			{
				ERROR("S(do)");
			}
	}	 
	else
				ERROR("S(while)");
		
}

void E()        // 處理E->id < id | id > id語句
{  
 	char a,b;
	int c;	
    if(!nexttoken())
	ERROR("E(0)");
	if(cur.type==$ID||cur.type==$num)
	{
		a=cur.ch;
		if(!nexttoken())
			ERROR("E(0)");
	if(cur.type==$big||cur.type==$small)
	{	
		  c=cur.type ;		
		if(!nexttoken())
		 ERROR("E(0)");
		if(cur.type==$ID||cur.type==$num)   
			b=cur.ch;
		else
		    ERROR("E(id/num)");
        if(c==$big)
		{
		trueadd=quad_len;
		 falseadd=quad_len+1;
		AD_ADDRESS(quad_len,JG,a,b,trueadd);        //語法分析同時產生逆波蘭式
		AD_ADDRESS(quad_len,JUMP,0,0,falseadd);     //并加入逆波蘭式表中
        }
		else
		{
		trueadd=quad_len;
		 falseadd=quad_len+1;
		AD_ADDRESS(quad_len,JL,a,b,trueadd);
		AD_ADDRESS(quad_len,JUMP,0,0,falseadd);
		}
	}
		else
             ERROR("E(id/num)");
	}
	else
		ERROR("E(big/small)");	
}
//處理M->TF|T  規則對應句子  
char M_addsub()
{
 char rtn,t;
 rtn=T_muldiv();                                       //調用T_muldiv()函數分析乘除法
 t=rtn;
 rtn=F_addsub(t);                                      //調用F_addsub(t)函數分析加減法
 return rtn;
}
                       //處理乘除法,處理P->*BP|/BP|ε  規則對應句子 
char P_muldiv(char a)
{
 char t,b;
 next();
 if(cur.type==$mul||cur.type==$div)
 {
  int op=cur.type;
  b=B_number();
  t=newchar();
  if(op==$mul)
   AD_RESULT(quad_len,mul,a,b,t);            //分析同時產生逆波蘭式
  else                                       //加入逆波蘭式表中
    AD_RESULT(quad_len,div,a,b,t);
   
 }
 else
	 t=a;
 return t;
}
//處理加減法,處理F-> +TF |-TF|ε 規則對應句子 
char F_addsub(char a)
{ char t,b;
 if(cur.type==$add||cur.type==$sub)
 {int op=cur.type ;
   b=T_muldiv();
   t=newchar();
  if(op==$add)
     AD_RESULT(quad_len,add,a,b,t);           //分析同時產生逆波蘭式
  else
     AD_RESULT(quad_len,sub,a,b,t);
 }
 else 
	 t=a;
  return t;	  
 
}
//處理T->BP|B   規則對應句子 
char T_muldiv()
{
 char t;
 char rtn;
 rtn=B_number();
 t=rtn;
 rtn=P_muldiv(t);
 return rtn;

}
//處理B->id|digit   規則對應句子 
char B_number()
{
 char rtn;
 next();
 if(cur.type==$num||cur.type==$ID)
	 rtn=cur.ch ;
 else
	 cout<<"error:B()"<<endl;
	 return rtn;
}
///////////////////////////////////////////////////////////
                                                //語義分析
void yuyi()
{
   	cout<<"語法語義分析,逆波蘭式如下:"<<endl; 
   	S();                                     //調用S()函數分析第一條規則
	AD_RESULT(quad_len,END,0,0,'-');
}
///////////////////////////////////////////////////////////
void backpath(int nlabel,int addr)
{
	quad[nlabel].address=addr;
}

//輸出詞法分析單詞表
void print()
{ 
	for(token_index=0;token_index<total_len;token_index++)
	{   
		if(tokentable[token_index].type==$WHILE)
			cout<<setw(10)<<"WHILE";
		if(tokentable[token_index].type==$DO)
			cout<<setw(10)<<"DO"<<endl;
		if(tokentable[token_index].type==$ID)
			cout<<setw(10)<<tokentable[token_index].ch;
		if(tokentable[token_index].type==$num)
			cout<<setw(10)<<tokentable[token_index].ch;
		if(tokentable[token_index].type==$equal)
			cout<<setw(10)<<'=';
		if(tokentable[token_index].type==$big)
			cout<<setw(10)<<'>';
		if(tokentable[token_index].type==$small)
			cout<<setw(10)<<'<';
        if(tokentable[token_index].type==$add)
			cout<<setw(10)<<'+';
		if(tokentable[token_index].type==$sub)
			cout<<setw(10)<<'-';
		if(tokentable[token_index].type==$mul)
			cout<<setw(10)<<'*';
		if(tokentable[token_index].type==$div)
			cout<<setw(10)<<'/';
		if(tokentable[token_index].type==$fen)
			cout<<setw(10)<<';'<<endl;
	}
	token_index=0;
}
//輸出逆波蘭式
void printQuad()
{
	for(int i=0;i<quad_len;i++)
	{
		if(quad[i].op==JG)
		{
		}
		else if(quad[i].op==JL)
		{
		}
		else if(quad[i].op==JUMP)
		{
		}
		else if(quad[i].op==equal)
		{   
			nbl[nbln].nbl1[n++]=quad[i].result;
			strcat(nbl[nbln].nbl2,"=");
			nbln++;
			n=0;
		}
		else if(quad[i].op==END)
		{
		}
		else if(quad[i].op==add)
		{  
   			
		   nbl[nbln].nbl1[n++]=quad[i].par1;
		   nbl[nbln].nbl1[n++]=quad[i].par2;
			strcat(nbl[nbln].nbl2,"+");
		}
		else if(quad[i].op==sub)
		{ 
		   nbl[nbln].nbl1[n++]=quad[i].par1;
		   nbl[nbln].nbl1[n++]=quad[i].par2;
			strcat(nbl[nbln].nbl2,"-");
		}
		else if(quad[i].op==div)
		{    
			
		   nbl[nbln].nbl1[n++]=quad[i].par1;
		   nbl[nbln].nbl1[n++]=quad[i].par2;
			strcat(nbl[nbln].nbl2,"/");
		}
		else if(quad[i].op==mul)
		{  
		   nbl[nbln].nbl1[n++]=quad[i].par1;
		   nbl[nbln].nbl1[n++]=quad[i].par2;
			strcat(nbl[nbln].nbl2,"*");
		}
	}
	for(j=0;j<nbln;j++)
	{
		cout<<"L"<<j+1<<":";
		for(m=strlen(nbl[j].nbl1);m>0;m--)
			cout<<nbl[j].nbl1[m-1];
		cout<<nbl[j].nbl2<<endl;
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91伊人久久大香线蕉| 黄网站免费久久| 在线视频中文字幕一区二区| 亚洲女女做受ⅹxx高潮| 久久久亚洲高清| 国产综合成人久久大片91| 欧美国产日韩一二三区| 成人av影院在线| 依依成人综合视频| 欧美伦理电影网| 精品一区二区三区的国产在线播放| 精品国一区二区三区| 国产黄色精品网站| 中文字幕一区不卡| 欧美日韩国产一级片| 美女一区二区三区在线观看| 久久精品一区二区三区四区| www.av精品| 亚洲高清三级视频| 精品欧美乱码久久久久久1区2区| 国产精品自产自拍| 一区二区三区日韩欧美| 欧美一区二区三区日韩视频| 国产一区二区三区在线看麻豆| 国产精品九色蝌蚪自拍| 欧美日韩成人综合| 国产乱码精品一区二区三区av| 亚洲欧美国产三级| 日韩写真欧美这视频| 粉嫩av一区二区三区| 亚洲高清免费视频| 国产色婷婷亚洲99精品小说| 色菇凉天天综合网| 激情亚洲综合在线| 亚洲黄色av一区| 久久蜜桃av一区二区天堂| 日本电影亚洲天堂一区| 国产在线精品一区二区三区不卡| 国产精品乱人伦| 日韩欧美黄色影院| 在线精品国精品国产尤物884a| 美女mm1313爽爽久久久蜜臀| 最新久久zyz资源站| 日韩天堂在线观看| 91国内精品野花午夜精品| 国产毛片一区二区| 亚洲大型综合色站| 亚洲欧美日韩综合aⅴ视频| 欧美精品一区视频| 777久久久精品| 在线看日韩精品电影| 波多野结衣91| 国产精品中文欧美| 久久精品国产999大香线蕉| 玉米视频成人免费看| 国产精品乱子久久久久| 国产丝袜欧美中文另类| 日韩视频在线观看一区二区| 色噜噜狠狠色综合欧洲selulu| 国产精品18久久久久久vr| 男人的天堂久久精品| 亚洲综合在线电影| 亚洲欧美一区二区三区极速播放| 久久综合九色综合欧美就去吻| 7777精品伊人久久久大香线蕉| 91视频免费看| www.综合网.com| 懂色中文一区二区在线播放| 国产中文字幕精品| 久久成人久久鬼色| 美女视频一区二区三区| 五月综合激情婷婷六月色窝| 一区二区三区日韩精品视频| 亚洲人成网站在线| 亚洲欧美国产高清| 亚洲精品videosex极品| 亚洲视频在线一区观看| 综合久久一区二区三区| 亚洲私人黄色宅男| 亚洲欧洲中文日韩久久av乱码| 国产精品久久综合| 亚洲色图一区二区三区| 亚洲色图一区二区| 亚洲黄色小说网站| 亚洲图片一区二区| 天天综合天天做天天综合| 午夜精品久久一牛影视| 日本亚洲一区二区| 青青草国产精品97视觉盛宴| 青青青伊人色综合久久| 韩国女主播一区| 成人一区二区三区在线观看| 97久久精品人人做人人爽50路| 色av一区二区| 91麻豆精品国产91久久久久久久久| 欧美日韩中文精品| 欧美一级电影网站| 久久婷婷一区二区三区| 国产精品毛片a∨一区二区三区| 亚洲三级在线播放| 亚洲综合在线视频| 另类小说视频一区二区| 国产福利91精品一区| 色悠悠亚洲一区二区| 欧美日韩国产乱码电影| 337p粉嫩大胆色噜噜噜噜亚洲| 国产日韩精品一区二区三区在线| 18成人在线观看| 亚洲成av人片在线| 国产美女主播视频一区| 91理论电影在线观看| 51午夜精品国产| 中文字幕乱码久久午夜不卡| 亚洲视频狠狠干| 麻豆精品一区二区| 91视频观看视频| 欧美大片在线观看一区| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 五月婷婷另类国产| 黑人巨大精品欧美一区| 99综合电影在线视频| 在线播放亚洲一区| 国产日产欧美一区二区三区| 亚洲综合一二三区| 国产一区二区三区免费播放 | 日韩制服丝袜av| 成人久久18免费网站麻豆| 欧美日韩在线播放一区| 久久理论电影网| 亚洲一区二区三区激情| 国产成人精品免费| 欧美蜜桃一区二区三区| 国产欧美日韩在线观看| 日韩国产高清影视| 日韩免费观看2025年上映的电影| 亚洲婷婷在线视频| 激情综合色播激情啊| 欧美日韩不卡一区| 综合av第一页| 国产91精品在线观看| 日韩一卡二卡三卡国产欧美| 亚洲免费观看在线观看| 国产酒店精品激情| 日韩免费看网站| 日韩国产欧美一区二区三区| 色乱码一区二区三区88| 国产女主播一区| 国内不卡的二区三区中文字幕| 欧美伊人久久大香线蕉综合69| 中日韩免费视频中文字幕| 黄页视频在线91| 欧美大白屁股肥臀xxxxxx| 亚洲福利一区二区| 日本道色综合久久| 亚洲人成伊人成综合网小说| 成人午夜碰碰视频| 国产色91在线| 国产精品综合一区二区三区| 精品国偷自产国产一区| 麻豆精品在线观看| 日韩三级视频中文字幕| 天堂在线一区二区| 欧美日本在线观看| 亚洲电影一区二区| 欧美日韩国产另类一区| 五月综合激情网| 欧美男男青年gay1069videost | 91麻豆高清视频| 日韩理论在线观看| 色视频成人在线观看免| 亚洲精品乱码久久久久| 在线免费不卡电影| 调教+趴+乳夹+国产+精品| 在线综合亚洲欧美在线视频| 香港成人在线视频| 日韩一区二区在线看| 欧美综合一区二区三区| 一区二区三区国产| 欧美视频一区二区三区在线观看| 亚洲一区二区精品视频| 欧美另类高清zo欧美| 免费观看日韩电影| 久久一夜天堂av一区二区三区| 国内精品久久久久影院色 | 激情久久久久久久久久久久久久久久| 日韩亚洲欧美中文三级| 久久精品国产一区二区三区免费看| 精品国产乱码久久久久久浪潮| 国产九九视频一区二区三区| 中文字幕亚洲视频| 欧美性色综合网| 免费精品视频最新在线| 久久久www免费人成精品| 99精品久久只有精品| 亚洲第一精品在线| 日韩精品一区二区三区在线| 国产aⅴ综合色| 亚洲一区二区三区免费视频| 日韩精品一区二区三区老鸭窝| 丁香桃色午夜亚洲一区二区三区|