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

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

?? guyue30.cpp

?? while語句的LL1詞法語法和語義分析
?? CPP
字號:
#include<stdio.h>                //預處理(頭文件包含)
#include<string.h>
#include <conio.h>
#include<iostream.h>             
#define MaxiProgramNumber  888   //源程序最大字符的個數
#define MaxiWordLength     18    //標示符和關鍵字最長字符的個數
#define MaxiTokenNumer     118   //標識符能包含的最多的字符個數
/*………………………………………………………………………………………………*/
#define MaxiWordLength1     18 
#define MaxiTokenNumer1     118    
/*………………………………………………………………………………………………*/

char Ecode[MaxiTokenNumer1][MaxiWordLength1];
int Top=0;
int nID=1;                        //初始化
/*……………………………下面定義棧結構,棧中的元素是一個結構體………………*/
typedef struct
{
    int add;
	int next;
	char str[MaxiWordLength1];
}ADDL;                              //ADDL用于識別WHILE,DO

ADDL L[MaxiTokenNumer1];            //L為定義的結構體名
int nL=0;
int nadd=1;                         //初始化
/*………………………………輸入串棧,棧中元素為結構體……………………………*/
typedef struct
{
 int ID;
 char b[MaxiWordLength];
}link;

link Token[MaxiTokenNumer];
link Token2[MaxiTokenNumer];
int nTokenNumer=1;                  //標志位置
char a[MaxiProgramNumber];          //數組用于裝入源程序
int nLength=0;                      //用于指向數組中的元素 
/*……………………………函數聲明(詞法分析部分用到的函數)………………………*/

void GetProgram();                  //把源程序裝入數組a
char GetChr();                      //將數組a中的元素讀出
int Judge(char& chr);               //用于判斷'\0'            
int IsLetter(char c);               //用于判斷是否為字母
void Input(char* p,char c,int& nx); //標識符或關鍵字進入指針p指向的數組第nx+1個元素
void Save(char* word,int x);        //將關鍵字或標志符或算符裝入Token
void Getcode();

/*……………………………函數聲明(語法分析部分用到的函數)………………………*/
void Pop();                         //出棧
void InputS();
void InputE1();
void InputE2();
void InputE3();
void InputA();
int  firstset();                 
int  panduanSEA();                     //識別非終結符
int  EStrcmp();
/*…………………………………………詞法分析部分……………………………………*/
int Wordanalyze()
{
  int jieshu=0;                     //詞法分析沒有結束    
  char chr;
  cout<<"*********************請輸入一段源程序(以#為結束標志):************************"<<endl<<endl
	  <<"************************計算機0305班30號 張古月******************************"<<endl<<endl;
  GetProgram();                     //把源程序裝入數組a
  int x;
  char word[MaxiWordLength];        //聲明臨時數組
  while((chr=GetChr())!='\0')      
  {
	  if(!(Judge(chr)))
	  {
		  break;
	  }                             //跳過空格和回車取元素  
	  x=0;
	  word[x]='\0';                 //清空       

	  if(IsLetter(chr))            
	  { jieshu=1;
	     while(IsLetter(chr))
		 {
		   Input(word,chr,x);       //是字符就將其裝入數組word
           chr=GetChr();           
		    }
		 if(chr=='>' || chr=='='||chr=='<')
			 nLength=nLength-1;     //指向算符

		 word[x]='\0';
         Save(word,x);              //將關鍵字或標志符或算符裝入Token
	  }
	  else if(chr=='>')             //將'>'裝入Token
	  {
		  Input(word,chr,x);

		  word[x]='\0';
		  
		  Save(word,x);
	  }
      else if(chr=='=')             //將'='裝入Token
	  {
			  Input(word,chr,x);

			  word[x]='\0';

			  Save(word,x);
	  }
     else if(chr=='<')              //將'<'裝入Token
	 {
			  Input(word,chr,x);

			  word[x]='\0';

			  Save(word,x);
	 }  
	 else
	 {
	     printf("輸入出錯!\n");       //出錯處理

		jieshu=0;                       

		 return 0;
	 }
  }                                    //這個函數的作用是將輸入符號放入Token
  if(jieshu==1)                         //詞法分析結束
  {
      Getcode();

      printf("單詞符號表為[<種別編碼,單詞屬性>]:\n");

      for(int i=1;i<nTokenNumer;i++)   //輸出詞法分析結果
	  {
          printf("<");
    
		  printf("%d",Token[i].ID);
	
		  printf(",");
	
		  printf("%s",Token[i].b);

		  printf(">\n");

		  strcpy(Token2[i].b,Token[i].b);//將輸入的符號拷貝在Token2中 
	  }
     for(int d=1;d<nTokenNumer;d++)      //將標識符號替換成id
	  {
		  if(Token[d].ID==6)
		  {
			  strcpy(Token[d].b,"id");
		  }
	  }

	  strcpy(Token[nTokenNumer].b,"#");

	  Token[nTokenNumer].ID=7;          //'#'的種別編碼為7

	  return 1;
  }
 getch();
}

void GetProgram()                       //把源程序裝入數組a
{
  char ch;

  while((ch=getchar())!='#')
  {
   if(nLength>=MaxiProgramNumber-2)
	   break;
   else
	   a[nLength++]=ch;  
  }
  a[nLength]='\0';
  
  nLength=0;
}

char GetChr()                          //將數組a中的元素讀出
{
  if(nLength>=MaxiProgramNumber-1)
	  return '\0';
  else
	  return a[nLength++];
}

int Judge(char& chr)                   //用于判斷'\0',返回值為0時為'\0'
{
  while(chr==10 || chr==32)            //當chr為空格和換行時
  {
    chr=GetChr();
	
	if(chr=='\0')
	{
		return 0;
	}
  }
  return 1;
}

int IsLetter(char c)                  //用于判斷是否為字母
{
  if(c>='a' && c<='z' || c>='A' && c<='Z' )
		return 1;
	else
		return 0;
}

void Input(char* p,char c,int& nx)   //標識符或關鍵字進入指針p指向的數組第nx+1個元素
{
  if(nx<MaxiWordLength-1)
  {
	  p[nx]=c;
  
	  nx++;
  }
}

void Save(char* p,int x)              //將關鍵字或標志符或算符裝入Token
{
   for(int i=0;i<=x;i++)

	   Token[nTokenNumer].b[i]=p[i];

   nTokenNumer=nTokenNumer+1;
}
/*…………………………為不同的輸入符號賦予不同的種別編碼……………………*/
void Getcode()
{
  for(int i=1;i<nTokenNumer;i++)
  {
    if(strcmp(Token[i].b,"while\0")==0)
		Token[i].ID=1;
	else if(strcmp(Token[i].b,"do\0")==0)
		Token[i].ID=2;
    else if(strcmp(Token[i].b,">\0")==0)
		Token[i].ID=3;
	else if(strcmp(Token[i].b,"=\0")==0)
		Token[i].ID=4;
	else if(strcmp(Token[i].b,"<\0")==0)
        Token[i].ID=5;
	else 
	    Token[i].ID=6;
  }
}
/*………………………………………語法分析過程……………………………………*/
int ExpressionAnalyse()               //語法分析
{
 printf("\n語法分析得出:\n");
	
 strcpy(Ecode[Top++],"#");            //將#壓棧

 strcpy(Ecode[Top++],"S");            //將S壓棧

 int FLAG=1;                          //語法分析未結束標志
 
 while(FLAG)
 {
	 int f1=0;
	 f1=panduanSEA();
 
	 if(f1==1)
	 {
		  cout<<"  S->while E do A"<<endl; 
		  InputS();
	 }
	 else if(f1==2)
	 {   int f3=0;
		 f3=firstset();
		 if(f3==1)
		 {
		  cout<<"  E->id>id"<<endl;
		  InputE1();
		 }
         else if(f3==2)
         {
		  cout<<"  E->id=id\n"<<endl;
		  InputE2();
		 }
		 else 
		 {
		  cout<<"  E->id<id"<<endl;
		  InputE3();
		 }
	 }
	 else if(f1==3)
	 {
		 cout<<"  A->id=id"<<endl;
		 InputA();
	 }
	 else 
	 {
		 int f2=0;
		 f2=EStrcmp();
		 if(f2==1)                        //識別出關鍵字
		 {  
			Pop();
			nID=nID+1;
		 }
		 else if(f2==3)                   //識別出#,分析結束
		 {
		  cout<<endl<<"語法正確!"<<endl;
		  FLAG=0;
		  return 1;
		 }
		 else
		 {   
		  cout<<endl<<"語法出錯啦!"<<endl;
		  FLAG=0;
		  return 0;
		 }
	 }
 }
 getch();
}

void InputS()                             //壓棧        
{
	Pop();
	strcpy(Ecode[Top++],"A");
	strcpy(Ecode[Top++],"do");
	strcpy(Ecode[Top++],"E");
	strcpy(Ecode[Top++],"while");
}

void InputE1()                             //壓棧 
{
    Pop();
	strcpy(Ecode[Top++],"id");
	strcpy(Ecode[Top++],">");
	strcpy(Ecode[Top++],"id");
}

void InputE2()                             //壓棧 
{
    Pop();
	strcpy(Ecode[Top++],"id");
	strcpy(Ecode[Top++],"=");
	strcpy(Ecode[Top++],"id");
}

void InputE3()                             //壓棧 
{
    Pop();
	strcpy(Ecode[Top++],"id");
	strcpy(Ecode[Top++],"<");
	strcpy(Ecode[Top++],"id");
}

void InputA()                             //壓棧 
{
    Pop();
	strcpy(Ecode[Top++],"id");
	strcpy(Ecode[Top++],"=");
	strcpy(Ecode[Top++],"id");
}

void Pop()                               //出棧操作
{
    Top=Top-1;
}

int firstset()
{  
	if(strcmp(Token2[3].b,">")==0)
		return 1;     
    if(strcmp(Token2[3].b,"=")==0)
		return 2; 
	if(strcmp(Token2[3].b,"<")==0)
		return 3;   
}
int panduanSEA()                           //識別非終結符
{
    if(strcmp(Ecode[Top-1],"S")==0)
		return 1;
	else if(strcmp(Ecode[Top-1],"E")==0)
		return 2;
	else if(strcmp(Ecode[Top-1],"A")==0)
		return 3;
	else
		return 4;
}

int EStrcmp()                           //識別while和do關鍵字
{
           if(strcmp(Ecode[Top-1],"#")==0)
		   {
		              if(strcmp(Token[nID].b,"#")==0)	
			                return 3;
		   }
		   else if(strcmp(Ecode[Top-1],Token[nID].b)==0)
		   {
		                   if(strcmp(Ecode[Top-1],"while")==0)
						   {
							    L[nL].add=nadd++;
			                    L[nL].next=nadd++;
			                    strcpy(L[nL].str ,"while");
			                    nL++;
						   }
		                   if(strcmp(Ecode[Top-1],"do")==0)
						   {
							     L[nL].add=nadd++;
								 L[nL].next=L[nL-1].add;
                                 strcpy(L[nL].str ,"do");
			                     nL++;
						   }
						   return 1;
		   }
	       else
	           	return 0;
	cout<<Token[2].b<<endl;
}
/*……………………………………語義分析……………………………………*/
 void main()
 {
	 cout<<"****************************編譯原理課程設計:*********************************"<<endl<<endl;
	 cout<<"*************while語句的翻譯分析程序,采用LL(1)法,輸出三地址:*************"<<endl<<endl;
	 cout<<"***************************程序所用的文法為:*********************************"<<endl;
	 cout<<"  S->while E do A"<<endl;                   
	 cout<<"  E->id>id|E->id=id|E->id<id"<<endl;
	 cout<<"  A->id=id"<<endl;
     cout<<" (id代表標識符)"<<endl;
	 
	 if(Wordanalyze())              //詞法分析成功
	 {
		if(ExpressionAnalyse())     //語法分析也成功
		{
		 int i;
		 L[nL].add=nadd;
		 for(i=0;i<nL;i++)
		 {
		  if(strcmp(L[i].str,"while")==0)
		  {  cout<<endl;
			 cout<<"正確的語義輸出為:"<<endl;
			 cout<<"L0:  if "<<Token2[2].b<<" > "<<Token2[4].b<<"  goto L2"<<endl;
			 cout<<"L1:  if not goto L4"<<endl;
		  }
		  else 
		  {
			 cout<<"L2:  "<<Token2[6].b<<":="<<Token2[8].b<<endl;
             cout<<"L3:  "<<"goto L0"<<endl;
             cout<<"L4:  "<<endl;
		  }
		 }
		}
	 }
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久福利| 91一区一区三区| 亚洲宅男天堂在线观看无病毒| 久久综合五月天婷婷伊人| 91精品国产91热久久久做人人 | 欧美大片一区二区| 欧美一区二区三区免费视频| 欧美一区二区国产| 日韩精品一区二区三区三区免费| 欧洲激情一区二区| 7777精品伊人久久久大香线蕉经典版下载 | 国产亚洲综合性久久久影院| 久久久午夜精品| 国产精品美女久久久久久2018| 国产欧美日韩另类视频免费观看| 国产三级一区二区| 亚洲欧美另类在线| 日日摸夜夜添夜夜添精品视频| 亚洲高清在线精品| 久久97超碰国产精品超碰| 韩国精品在线观看| 色综合久久88色综合天天| 欧美日韩国产天堂| 亚洲精品在线电影| 国产亚洲精久久久久久| 综合激情成人伊人| 奇米色一区二区| 国产.欧美.日韩| 一本一本大道香蕉久在线精品| 欧美精品在线一区二区| 欧美mv日韩mv亚洲| 亚洲欧美日韩中文播放| 久久se精品一区精品二区| 成人av午夜电影| 91精品中文字幕一区二区三区| 欧美激情一区二区三区在线| 亚洲与欧洲av电影| 国产乱子轮精品视频| 色天天综合色天天久久| 日韩一区二区在线观看| 成人免费视频在线观看| 男人的j进女人的j一区| 92精品国产成人观看免费| 欧美日韩国产高清一区二区| 国产精品美女久久久久aⅴ| 日韩国产精品91| 色悠悠亚洲一区二区| 国产亚洲va综合人人澡精品| 香蕉成人伊视频在线观看| 99国产精品久久久久久久久久| 日韩欧美的一区| 亚洲成人精品一区| 99视频在线精品| 国产欧美综合色| 捆绑紧缚一区二区三区视频| 欧美揉bbbbb揉bbbbb| 国产精品免费久久久久| 极品少妇一区二区| 4438x亚洲最大成人网| 亚洲欧美日韩国产成人精品影院| 国产福利一区二区三区| 91精品国产高清一区二区三区 | 天堂午夜影视日韩欧美一区二区| 成人看片黄a免费看在线| 精品国产乱码久久久久久浪潮| 日本不卡视频一二三区| 欧美亚洲愉拍一区二区| 亚洲欧美日韩国产综合在线| 菠萝蜜视频在线观看一区| 国产农村妇女毛片精品久久麻豆 | 国产精品人成在线观看免费| 久久99精品久久久久| 欧美一三区三区四区免费在线看| 亚洲乱码中文字幕| 一本色道久久综合亚洲aⅴ蜜桃 | 欧美视频一区二区三区| 亚洲靠逼com| 欧美性猛交xxxxxx富婆| 亚洲一区二区三区四区不卡 | 天堂成人免费av电影一区| 欧美亚洲一区二区在线观看| 亚洲精品中文字幕在线观看| 成人av综合在线| 亚洲欧美一区二区三区极速播放| 色噜噜狠狠色综合中国| 亚洲国产精品一区二区久久恐怖片| 色婷婷av一区二区三区软件| 天天色图综合网| 日韩欧美在线1卡| 免费成人av资源网| 国产婷婷色一区二区三区在线| 懂色av一区二区夜夜嗨| 中文av一区二区| 91国偷自产一区二区三区成为亚洲经典 | 国产精品一二三| 国产精品久久看| 色天天综合色天天久久| 日韩在线一二三区| 久久这里只有精品6| 99久久久免费精品国产一区二区| 国产精品大尺度| 91精品国产乱码久久蜜臀| 国产精一区二区三区| 亚洲美女屁股眼交3| 91麻豆精品国产自产在线观看一区| 免费不卡在线观看| 国产精品国产馆在线真实露脸 | 91久久精品一区二区三| 一区二区成人在线| 欧美大黄免费观看| 精品欧美黑人一区二区三区| 中文字幕欧美三区| 欧美日韩午夜在线视频| 狠狠久久亚洲欧美| 一级女性全黄久久生活片免费| 欧美一区二区在线播放| 成人国产精品视频| 亚洲与欧洲av电影| 国产三级一区二区| 91精品国产综合久久香蕉的特点 | 99国产欧美久久久精品| 捆绑调教一区二区三区| 亚洲女女做受ⅹxx高潮| 精品动漫一区二区三区在线观看| 99视频一区二区三区| 久久精品噜噜噜成人av农村| 一区二区三区中文在线| 国产日韩欧美精品综合| 日韩美女天天操| 欧美日韩国产综合久久| 99久久99久久久精品齐齐| 国产在线播精品第三| 天天操天天干天天综合网| 国产精品国产自产拍在线| 久久人人爽爽爽人久久久| 欧美日韩国产三级| 色播五月激情综合网| youjizz久久| 成人一区二区三区在线观看| 久久精品国产77777蜜臀| 五月天丁香久久| 亚洲综合一区二区三区| 中文字幕一区二区在线观看| 国产婷婷精品av在线| 日韩欧美视频一区| 欧美一区二区视频在线观看| 精品视频免费在线| 在线视频国内自拍亚洲视频| av成人老司机| 91丨九色丨蝌蚪丨老版| 成年人国产精品| 91麻豆成人久久精品二区三区| a美女胸又www黄视频久久| 成人激情免费视频| 成人app在线| 色女孩综合影院| 欧美中文字幕不卡| 欧美美女网站色| 欧美一级一级性生活免费录像| 欧美猛男超大videosgay| 欧美精品免费视频| 欧美一区二区三区四区在线观看 | 韩国成人在线视频| 国产精品18久久久久久久久久久久| 毛片不卡一区二区| 精品午夜久久福利影院 | 一色桃子久久精品亚洲| 中文字幕一区二区三区在线不卡| 欧美高清在线一区| 亚洲免费观看视频| 日韩中文字幕1| 国产福利一区二区三区视频在线| 大胆亚洲人体视频| 欧美视频在线不卡| 欧美刺激午夜性久久久久久久| 日韩美一区二区三区| 中文字幕av不卡| 亚洲一区免费在线观看| 蜜臀av国产精品久久久久 | 国产精品久久久久久久久免费桃花| 中文一区二区完整视频在线观看| 1区2区3区精品视频| 亚洲成在人线免费| 国产一区高清在线| 色94色欧美sute亚洲线路一ni| 国产精品久久精品日日| 亚洲免费观看高清| 日本一区中文字幕| av福利精品导航| 日韩欧美美女一区二区三区| 中文字幕免费观看一区| 亚洲成人av免费| 丰满少妇久久久久久久| 欧美丝袜自拍制服另类| 日本一区二区电影| 看电影不卡的网站| 欧美三级乱人伦电影| 国产精品久久久久三级| 日韩影院精彩在线| 一本久道久久综合中文字幕|