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

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

?? lastvt.txt

?? 編譯原理課程設計
?? TXT
字號:
#include<iostream.h>
#include<string.h>
#include<stdio.h>   //以上為三個頭文件
typedef struct       //定義數據類型array
{char R;           //變量R為char型
char r;             //變量 r為char型
int flag;            //變量flag為int型
}array;
typedef struct       //定義數據類型charLode
{char E;           //變量E為char型
char e;            //變量e為char型
}charLode;
typedef struct       //定義數據類型charstack棧
{ charLode *base;   //字符指針base為棧底
    int top;        //變量tor為int型,為棧頂
}charstack;
char str[80][80],arr[80][80],brr[80][80];//定義三個字符數組
array F[20];       //定義一個數組array
int m,kk,p,ppp,FF=1;//定義四個int型變量,其中FF初值為1
char r[10];        //定義字符數組r[]
int crr[20][20],FLAG=0;//定義二維數組crr[][],并定義FLAG初值為1
char ccrr1[1][20],ccrr2[20][1];      //字符型二維數組crr1[][]和crr2[][]
void Initstack(charstack &s)        //定義一個空棧charstack
{s.base=new charLode[20];
    s.top=-1;}
void push(charstack &s,charLode w)    //入棧,插入元素w為棧頂元素
{s.top++;                          //棧頂地址+1
   s.base[s.top].E=w.E;
   s.base[s.top].e=w.e;}
void pop(charstack &s,charLode &w)   //出棧,刪除棧頂元素w
{ w.E=s.base[s.top].E;
   w.e=s.base[s.top].e;
   s.top--;                //棧頂地址-1
}
int IsEmpty(charstack s)     //定棧是否為空
{if(s.top==-1) return 1; //若棧空,返回1
else return 0;        //若棧不為空,返回0
}
int IsLetter(char ch)//函數IsLetter是用來判斷一個字符是否為非終結符
{ if(ch>='A'&&ch<='Z')
     return 1;    //若字符為非終結符,則返回1
 else return 0;    //否則返回0
}
int judge1(int n)        //judge1是判斷文法是否是算符文法:若產生式中含有兩個相繼的非終結符則不是算符文法
{int j=3,flag=0;  //定義兩個int型變量j,flag,并分別定義初值為3和0
for(int i=0;i<=n;i++)    //循環條件
   while(str[i][j]!='\0')  //字符不為空
   {char a=str[i][j];    //把str[i][j]的值賦給變量a
   char b=str[i][j+1];   //把str[i][j+1]的值賦給變量b
   if(IsLetter(a)&&IsLetter(b))  //若a,b都為非終結符
{flag=1;break;}
else j++;}
   if(flag==1)
   return 0;
   else
   return 1;}
void judge2(int n)    //judge2是判斷文法G是否為算符優先文法:若不是算符文法或若文法中含空字或終結符的優先級不唯一則不是算符優先文法
{for(int i=0;i<=n;i++)          //循環條件
   if(str[i][3]=='~'||judge1(n)==0||FLAG==1)//'~'代表空字
   {cout<<"文法G不是算符優先文法!"<<endl;FF=0;break;}
   if(i>n)
   cout<<"文法G是算符優先文法!"<<endl;
}
int search1(char r[],int kk,char a)     //search1是查看存放終結符的數組r中是否含有重復的終結符
{for(int i=0;i<kk;i++)            //循環條件
   if(r[i]==a) break;
   if(i==kk) return 0;
   else  return 1;}
void createF(int n)    //createF函數是用F數組存放每個終結符與非終結符和組合,并且值每隊的標志位為0;F數組是一個結構體
{int k=0,i=1;char g;   //定義兩個int型變量,其中初值為k=0,i=1,一個型char變量g
char t[10];          //t數組用來存放非終結符
t[0]=str[0][0];       //把str[0][0]的值賦給變量t[0]
while(i<=n)         //判斷條件
{ if(t[k]!=str[i][0])
   {k++;t[k]=str[i][0];g=t[k];i++;}
   else i++;
}
kk=0;
    char c;
for(i=0;i<=n;i++)      //循環條件
{ int j=3;
   while(str[i][j]!='\0') //判斷條件
   { c=str[i][j];
    if(IsLetter(c)==0)
    {if(!search1(r,kk,c))
     r[kk]=c;kk++;         //r數組用來存放終結符
    }
    j++;
   } }
m=0;
for(i=0;i<k;i++)
   for(int j=0;j<kk-1;j++)     //循環條件
   { F[m].R=t[i];
    F[m].r=r[j];
    F[m].flag=0;
    m++;
   }}
void search(charLode w)      //search函數是將在F數組中尋找到的終結符與非終結符對的標志位值為1
{for(int i=0;i<m;i++)
   if(F[i].R==w.E&&F[i].r==w.e)
   {F[i].flag=1;break;}
}
void FirstVT(int n)//求FirstVT
{charstack sta;
charLode w;
int i=0;
Initstack(sta);
while(i<=n)
{  int k=3;
   w.E=str[i][0];
   char a=str[i][k];
   char b=str[i][k+1];
   if(!IsLetter(a))  //產生式的后選式的第一個字符就是終結符的情況
   { w.e=a;
    push(sta,w);
    search(w);
    i++;
   }
   else if(IsLetter(a)&&b!='\0'&&!IsLetter(b))    //產生式的后選式的第一個字符是非終結符的情況
   {w.e=b;
    push(sta,w);
    search(w);
    i++;
   }
   else i++;
}
charLode ww;
while(!IsEmpty(sta))
{ pop(sta,ww);
   for(i=0;i<=n;i++)
   {w.E=str[i][0];
    if(str[i][3]==ww.E&&str[i][4]=='\0')
    {w.e=ww.e;
     push(sta,w);
     search(w);
     break;
    }}}
p=0;int k=1;i=1;
while(i<m)
{ if(F[i-1].flag==1)
   { arr[p][0]=F[i-1].R;
    arr[p][k]=F[i-1].r;}
   while(F[i].flag==0&&i<m)
    i++;
   if(F[i].flag==1)
   {if(F[i].R==arr[p][0])
     k++;
      else {arr[p][k+1]='\0';p++;k=1;}
    i++;
   }}   
}
void LastVT(int n)//求LastVT
{charstack sta;
charLode w;
for(int i=0;i<m;i++)
   F[i].flag=0;
i=0;
Initstack(sta);
while(i<=n)
{ int k=strlen(str[i]);
   w.E=str[i][0];
   char a=str[i][k-1];
   char b=str[i][k-2];
   if(!IsLetter(a))
   { w.e=a;
    push(sta,w);
    search(w);
    i++;
   }
   else if(IsLetter(a)&&!IsLetter(b))
   { w.e=b;
    push(sta,w);
    search(w);
    i++;
   }
   else i++;
}
charLode ee;
while(!IsEmpty(sta))
{ pop(sta,ee);
   for(i=0;i<=n;i++)
   {w.E=str[i][0];
    if(str[i][3]==ee.E&&str[i][4]=='\0')
    {w.e=ee.e;
     push(sta,w);
     search(w);
    }}
}
int k=1;i=1;
ppp=0;
while(i<m)
{if(F[i-1].flag==1)
   { brr[ppp][0]=F[i-1].R;
    brr[ppp][k]=F[i-1].r;}
   while(F[i].flag==0&&i<m)
    i++;
   if(F[i].flag==1)
   { if(F[i].R==arr[ppp][0])
     k++;
      else {brr[ppp][k+1]='\0';ppp++;k=1;}
    i++; }
} }
void createYXB(int n)      //構造優先表
{int i,j;
    for(j=1;j<=kk;j++)
        ccrr1[0][j]=r[j-1];
for( i=1;i<=kk;i++)
   ccrr2[i][0]=r[i-1];
for(i=1;i<=kk;i++)
   for(j=1;j<=kk;j++)
    crr[i][j]=0;
   int I=0,J=3;
   while(I<=n)
   { if(str[I][J+1]=='\0')
    {I++;J=3;}
    else
    { while(str[I][J+1]!='\0')
     {char aa=str[I][J];
      char bb=str[I][J+1];
 if(!IsLetter(aa)&&!IsLetter(bb)) //優先及等于的情況,用1值表示等于
        {  for(i=1;i<=kk;i++)
         {  if(ccrr2[i][0]==aa)
            break; }
      for(j=1;j<=kk;j++)
        { if(ccrr1[0][j]==bb)
            break;}  
       if(crr[i][j]==0)
        crr[i][j]=1;
       else {FLAG=1;I=n+1;}
       J++;
      }
if(!IsLetter(aa)&&IsLetter(bb)&&str[I][J+2]!='\0'&&!IsLetter(str[I][J+2]))                     //優先及等于的情況
      { for(i=1;i<=kk;i++)
       { if(ccrr2[i][0]==aa)
          break;}
      for(int j=1;j<=kk;j++)
       {  if(ccrr1[0][j]==str[I][J+2])
             break;}
       if(crr[i][j]==0)
        crr[i][j]=1;
       else {FLAG=1;I=n+1;}
      }
if(!IsLetter(aa)&&IsLetter(bb)) //優先及小于的情況,用2值表示小于
      { for(i=1;i<=kk;i++)
       { if(aa==ccrr2[i][0])
            break;}
        for(j=0;j<=p;j++)
        { if(bb==arr[j][0])
           break;}
        for(int mm=1;arr[j][mm]!='\0';mm++)
         { for(int pp=1;pp<=kk;pp++)
          {if(ccrr1[0][pp]==arr[j][mm])
                  break;}
         if(crr[i][pp]==0)
          crr[i][pp]=2;
         else {FLAG=1;I=n+1;}
         }
         J++;
      }
  if(IsLetter(aa)&&!IsLetter(bb)) //優先及大于的情況,用3值表示大于
      { for(i=1;i<=kk;i++)
       { if(ccrr1[0][i]==bb)
         break;}
        for(j=0;j<=ppp;j++)
       {if(aa==brr[j][0])
         break;}
       for(int mm=1;brr[j][mm]!='\0';mm++)
       {  for(int pp=1;pp<=kk;pp++)
        { if(ccrr2[pp][0]==brr[j][mm])
               break;}
        if(crr[pp][i]==0)
          crr[pp][i]=3;
        else {FLAG=1;I=n+1;}
       }
       J++;}
     }}
   }}
int judge3(char s,char a)   //search函數是將在F數組中尋找到的終結符與非終結符對的標志位值為1
{int i=1,j=1;
while(ccrr2[i][0]!=s)  i++;
while(ccrr1[0][j]!=a)  j++;
if(crr[i][j]==3) return 3;
else if(crr[i][j]==2) 
   return 2;
else if(crr[i][j]==1)
   return 1;
else return 0;
}
void print(char s[],char STR[][20],int q,int u,int ii,int k)//打印歸約的過程
{cout<<u<<"        ";
for(int i=0;i<=k;i++)
   cout<<s[i];
cout<<"         ";
for(i=q;i<=ii;i++)
   cout<<STR[0][i];
cout<<"        ";
}
void process(char STR[][20],int ii)//對輸入的字符串進行歸約的過程
{ cout<<"步驟"<<"    "<<"符號棧"<<"    "<<"輸入串"<<"       "<<"動作"<<endl;
int k=0,q=0,u=0,b,i,j;
char s[40],a;
s[k]='#';
print(s,STR,q,u,ii,k);
cout<<"預備"<<endl;
k++;u++;
 s[k]=STR[0][q];
q++;
print(s,STR,q,u,ii,k);
cout<<"移進"<<endl;
while(q<=ii)
{a=STR[0][q];
   if(!IsLetter(s[k])) j=k;
   else j=k-1;
   b=judge3(s[j],a);
   if(b==3)     //大于的情況進行歸約
   { while(IsLetter(s[j-1]))
     j--;
    for(i=j;i<=k;i++)
     s[i]='\0';
    k=j;s[k]='N';u++;
    print(s,STR,q,u,ii,k);
    cout<<"歸約"<<endl;
   }
   else if(b==2||b==1)    //小于或等于的情況移進
   {k++;
    s[k]=a;
    u++;
    q++;
    print(s,STR,q,u,ii,k);
    if(s[0]=='#'&&s[1]=='N'&&s[2]=='#')
        cout<<"接受"<<endl;
    else cout<<"移進"<<endl;
   }
   else  {cout<<"出錯"<<endl;break;}
}
if(s[0]=='#'&&s[1]=='N'&&s[2]=='#')
   cout<<"歸約成功"<<endl;
else cout<<"歸約失敗"<<endl;
}
void main()    //主函數
{int n,i,j;
cout<<"請輸入你要定義的文法G的產生式的個數n:";
cin>>n;
for(i=0;i<n;i++)
{gets(str[i]);
   j=strlen(str[i]);
   str[i][j]='\0';}
str[i][0]='Q';
str[i][1]='-';
str[i][2]='>';
str[i][3]='#';
str[i][4]=str[0][0];
str[i][5]='#';
str[i][6]='\0';
cout<<"你定義的產生式如下:"<<endl;
    for(i=0;i<=n;i++)
   cout<<str[i]<<endl;
if(judge1(n)==0)//判斷文法G是否為算符文法
   cout<<"文法G不是算符文法!"<<endl;
if(judge1(n)==1)
{cout<<"文法G是算符文法!"<<endl;
     createF(n);
FirstVT(n);
LastVT(n);
createYXB(n);
}
judge2(n);//判斷文法G是否為算符優先文法
   if(FLAG==0)
   {for(i=0;i<=p;i++)//打印FirstVT
    {cout<<"FirstVT("<<arr[i][0]<<")={";
       for(int l=1;arr[i][l+1]!='\0';l++)
    cout<<arr[i][l]<<",";
    cout<<arr[i][l]<<"}"<<endl;
    }
       cout<<"FirstVT(Q)={#}"<<endl; 
   for(i=0;i<=ppp;i++)//打印LastVT
   {cout<<"LastVT("<<arr[i][0]<<")={";
         for(int l=1;brr[i][l+1]!='\0';l++)
         cout<<brr[i][l]<<",";
      cout<<brr[i][l]<<"}"<<endl;
   }
       cout<<"LastVT(Q)={#}"<<endl;
   cout<<"優先表如下:"<<endl;
   for(i=1;i<kk;i++)//打印優先關系表
   {cout<<"   ";
    cout<<ccrr1[0][i];
   }
   cout<<endl;
   for(i=1;i<kk;i++)
   { cout<<ccrr2[i][0]<<" ";
    for(j=1;j<kk;j++)
    {if(crr[i][j]==0)
     cout<<" ";
    else if(crr[i][j]==1)
     cout<<"=";
    else if(crr[i][j]==2)
     cout<<"<";
    else if(crr[i][j]==3)
     cout<<">";
    cout<<"   ";
    }
    cout<<endl;
   }
}
if(FF==1)
{char STR[1][20];
cout<<"請輸入要規約的字符串:"<<endl;
gets(STR[0]);
   int ii=strlen(STR[0]);
STR[0][ii]='#';
   cout<<"下面是規約的過程:"<<endl;
process(STR,ii);   //歸約成功
}
}






?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性大战久久久久久久蜜臀 | 久久不见久久见免费视频7| 另类人妖一区二区av| av午夜一区麻豆| 91精品免费在线| 日韩伦理电影网| 激情小说亚洲一区| 欧美三级午夜理伦三级中视频| 国产亚洲一区二区在线观看| 亚洲大片免费看| 成人毛片视频在线观看| 91精品国产麻豆| 亚洲二区在线观看| 色先锋久久av资源部| 国产欧美一区二区精品秋霞影院 | 99热99精品| 中文字幕av在线一区二区三区| 免费在线欧美视频| 欧美日韩一区 二区 三区 久久精品| 中文字幕第一区二区| 极品少妇xxxx精品少妇偷拍| 欧美高清www午色夜在线视频| 日韩美女视频一区二区| 国产·精品毛片| 久久精品一区四区| 国产综合成人久久大片91| 在线综合+亚洲+欧美中文字幕| 亚洲国产视频一区| 欧美在线观看18| 亚洲自拍偷拍图区| 欧美性大战久久久久久久| 一区二区三区在线观看网站| 99riav久久精品riav| 国产精品成人一区二区三区夜夜夜 | 午夜精品久久久久久久99水蜜桃 | 亚洲色图一区二区| 成人视屏免费看| 国产清纯白嫩初高生在线观看91| 韩国中文字幕2020精品| 久久一区二区三区国产精品| 久久99国产精品久久99果冻传媒 | 欧美美女bb生活片| 亚洲成精国产精品女| 欧美一个色资源| 国产一区二区福利| 日本一区免费视频| 91麻豆国产在线观看| 一区二区三区日韩| 91精品国产综合久久久久久漫画 | 亚洲欧美aⅴ...| 欧洲日韩一区二区三区| 亚洲成va人在线观看| 日韩欧美一级二级三级| 韩国一区二区视频| 国产精品久久久久aaaa樱花| 91丨porny丨国产入口| 亚洲影院久久精品| 精品精品国产高清一毛片一天堂| 极品销魂美女一区二区三区| 国产精品黄色在线观看| 欧美日韩在线不卡| 国产一区视频在线看| 亚洲视频一二三| 欧美一区二区国产| 不卡免费追剧大全电视剧网站| 亚洲综合精品自拍| 亚洲精品一线二线三线无人区| 成人免费av资源| 天天做天天摸天天爽国产一区| 日韩欧美久久久| 成人av电影在线播放| 日韩精品免费专区| 国产精品久久久久久久久动漫 | 国产超碰在线一区| 午夜久久久影院| 国产精品色哟哟| 日韩欧美另类在线| 欧洲色大大久久| 丁香五精品蜜臀久久久久99网站| 亚洲国产一区二区视频| 欧美国产一区视频在线观看| 欧美精品一级二级三级| 国产成人亚洲精品青草天美| 亚洲国产一区二区视频| 中文字幕国产精品一区二区| 日韩免费视频一区| 欧美日韩一区二区三区四区| 成人av集中营| 国产美女视频一区| 老司机免费视频一区二区三区| 亚洲激情综合网| 日韩影院精彩在线| 国产精品国产三级国产aⅴ中文 | 91蝌蚪porny| 国产精品99久久久久久宅男| 日本不卡高清视频| 亚洲精选视频在线| 国产精品久久久久影院老司| 久久免费偷拍视频| 日韩一区二区在线观看视频| 欧美手机在线视频| 色狠狠桃花综合| 99久精品国产| 成人黄色在线看| 国产不卡视频一区二区三区| 久草中文综合在线| 久久精品理论片| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产精品888| 精品一区二区在线视频| 免费人成黄页网站在线一区二区| 午夜激情综合网| 日本亚洲免费观看| 日产国产高清一区二区三区| 天堂在线一区二区| 蜜臀va亚洲va欧美va天堂| 日韩av中文字幕一区二区三区| 亚洲永久精品大片| 天堂久久久久va久久久久| 亚洲一区二区三区视频在线播放 | 蜜臀av一区二区在线免费观看| 日韩激情视频在线观看| 日韩精品一二区| 久久er99精品| 国产91在线观看丝袜| 不卡欧美aaaaa| 色综合天天性综合| 欧美色倩网站大全免费| 91精品国产欧美一区二区18| 精品国产麻豆免费人成网站| 精品嫩草影院久久| 中文字幕av一区 二区| 一色屋精品亚洲香蕉网站| 中文字幕一区二区三区四区不卡| 国产精品国产精品国产专区不蜜| 亚洲综合图片区| 秋霞影院一区二区| 国产福利一区二区三区视频在线| 成人av资源站| 色婷婷亚洲综合| 日韩丝袜美女视频| 国产三级欧美三级日产三级99| 亚洲日本乱码在线观看| 性感美女极品91精品| 经典三级视频一区| 91丨九色丨国产丨porny| 在线不卡中文字幕播放| 久久久精品国产免大香伊| 国产精品久久久久久久蜜臀| 亚洲不卡一区二区三区| 国产乱理伦片在线观看夜一区| 国产不卡视频一区| 欧美日韩综合不卡| 国产女主播在线一区二区| 玉米视频成人免费看| 蜜臀a∨国产成人精品| av电影天堂一区二区在线观看| 欧美日韩一卡二卡| 国产午夜精品久久久久久免费视| 一区二区高清在线| 韩国理伦片一区二区三区在线播放| 99久久99久久综合| 精品国产第一区二区三区观看体验| 中文字幕视频一区二区三区久| 日韩黄色免费电影| 99久久久久久| 精品成人一区二区三区| 亚洲国产精品天堂| 99久久精品国产毛片| 欧美一区二区三区性视频| 亚洲三级久久久| 国产不卡在线一区| 精品粉嫩aⅴ一区二区三区四区| 亚洲精品大片www| 成人教育av在线| 欧美mv和日韩mv的网站| 亚洲午夜视频在线观看| zzijzzij亚洲日本少妇熟睡| 欧美大片在线观看| 午夜精品福利久久久| 在线一区二区视频| 日韩毛片精品高清免费| 国产大陆精品国产| 精品99999| 久久福利视频一区二区| 日韩一级欧美一级| 婷婷中文字幕综合| 欧美性色综合网| 亚洲最色的网站| 在线国产电影不卡| 亚洲欧美色图小说| 99re这里只有精品视频首页| 国产日韩欧美精品在线| 国产乱淫av一区二区三区| 欧美成人r级一区二区三区| 午夜精品久久久久久久久| 777午夜精品免费视频| 日韩精品成人一区二区在线| 欧美二区在线观看| 日本麻豆一区二区三区视频|