91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

資源簡介

編譯原理作業:輸出LR(0)分析表,并且可以判斷一個語句是否符合文法。整個過程我是使用codeblocks的c++編寫的,其中用了一下STL標準庫中的隊列、映射。這是實現功能的詳細代碼,有注釋的偽代碼以及測試用的相關樣例數據。

資源截圖

代碼片段和文件信息

#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
using?namespace?std;
typedef?long?long?LL;
const?int?INF=0x7fffffff;
const?int?MAX_N=10000;

int?num_of_anum_of_Anum_of_Stotalnum;
//小寫字母個數、大寫字母個數、推導式個數、最終結點總數
char?a[50];//字母
char?S[50][50];//推導式
bool?pushed[100];//訪問一個結點的時候,再往外拓展時記錄非終結符是否已經被push過
int?ans[100][100];
char?analyse[50];//分析串
int?stack1[50];
char?stack2[50];
char?stack3[50];
int?L1L2L3;//三個棧的長度
mapM;
map::iterator?m;

struct?node{//結點
????int?id;//編號
????int?num;//包含的推導式個數
????char?s[20][50];
};
queueq;//結點型隊列
node?N[100];
int?numN=0;

void?outputnd(node?k){//輸出一個結點的s
????for(int?i=0;i????????cout<????}
}

void?outputlb(){//輸出一個數組的s
????cout<<“鏈表“<????for(int?i=0;i????????outputnd(N[i]);
????????cout<????}
}

bool?samenode(node?xnode?y){//比較兩個node是否一樣
?????if(x.num!=y.num)return?0;//如果兩個node包含的s數量不同直接輸出不同
?????for(int?i=0;i????????int?flag=0;
????????for(int?j=0;j????????????if(strcmp(x.s[i]y.s[j])==0){
????????????????flag=1;
????????????????break;
????????????}
????????}
????????if(flag==0)return?0;
?????}
?????return?1;
}

void?init(){//初始化
????totalnum=0;//結點數量
????while(!q.empty())q.pop();//情況隊列
????memset(S0sizeof(S));
????for(int?i=0;i<100;i++){
????????for(int?j=0;j<100;j++){
????????????ans[i][j]=-10000;
????????}
????}
????M.clear();//清空映射
}

void?input(){//顧名思義,輸入數據
????printf(“請輸入終結符的個數:“);
????scanf(“%d“&num_of_a);
????printf(“請輸入%d個終結符(小寫字母):“num_of_a);
????for(int?i=0;i????????scanf(“?%c“&a[i]);
????????M.insert(make_pair(a[i]i));//建立映射
????}
????a[num_of_a]=‘#‘;
????M.insert(make_pair(a[num_of_a]num_of_a));
????printf(“請輸入非終結符的個數(不包含起始符):“);
????scanf(“%d“&num_of_A);
????printf(“請輸入%d個非終結符(大寫字母):“num_of_A);
????for(int?i=0;i????????scanf(“?%c“&a[num_of_a+1+i]);
????????M.insert(make_pair(a[num_of_a+1+i]num_of_a+1+i));
????}
????printf(“請輸入初始推導式的個數:“);
????scanf(“%d“&num_of_S);
????printf(“下面%d行每行請輸入1個推導式:前后用下劃線“_”鏈接(起始為S):\n“num_of_S);
????for(int?i=0;i????????scanf(“%s“S[i]);
????????for(int?j=strlen(S[i]);j>=3;j--){
????????????S[i][j]=S[i][j-1];
????????}
????????S[i][2]=‘.‘;
????}
}

node?pushback(char?pnode?f){//node?f里把所有p開頭的推導式push進去
????for(int?i=0;i????????if(S[i][0]==p){
????????????strcpy(f.s[f.num++]S[i]);
????????}
????}
????return?f;
}

void?bfs(){//寬度優先搜索
????node?aa;//聲明一個空的狀態
????aa.num=0;
????aa.id=totalnum++;//初始化num和id
????aa=pushback(‘S‘aa);//把S開頭的推導式放到這個起始結點里
????memset(pushed0sizeof(pushed));//用于記錄哪些字母被一次性push過,避免重復push
????for(int?j=0;j????????if(aa

評論

共有 條評論