xxxx18一60岁hd中国/日韩女同互慰一区二区/西西人体扒开双腿无遮挡/日韩欧美黄色一级片 - 色护士精品影院www

  • 大小: 461KB
    文件類型: .7z
    金幣: 1
    下載: 1 次
    發(fā)布日期: 2021-07-18
  • 語言: C/C++
  • 標簽: LR1??分析表??c++??

資源簡介

LR1分析表生成程序 c++,注釋完整。

資源截圖

代碼片段和文件信息

//0806580227?劉馳
//給定文法產(chǎn)生式構(gòu)造LR(1)項目集和DFA并對輸入的句子進行語法分析
//產(chǎn)生式存放在d:\syntax.txt
//句子存放在d:\test.txt
//項目集存放在d:\items_set
//DFA存放在d:\dfa.txt

#include“iostream“
#include“fstream“
#include“stack“
#include“utility“
using?namespace?std;

char?G[20][20];?????//存放文法,不超過20條產(chǎn)生式,每條產(chǎn)生式長度不超過20,用@表示空,以$結(jié)束
int??length[20];????//每條產(chǎn)生式的長度
int??number?=?0; //產(chǎn)生式條數(shù)
bool?tempofinput[150];??//記錄文法中有哪些Vt和Vn,用ASCII碼對應(yīng)位標記true表示
char?str_vn[20];????????//存放所有Vn
int??size_vn?=?0; //Vn個數(shù)
char?str_vt[150];???????//存放所有Vt
int??size_vt?=?0; //Vt個數(shù)
bool?first_vn[30][150]; //記錄每個非終結(jié)符的FIRST集,用位示圖法
char?buffer[50];????????//用來存放生成CLOSURE(I)時需要的FIRST集也用來讀入用戶的輸入串^_^
int??bsize?=?0;

struct?thri{
????int?beg; //起始狀態(tài)號
????int?nex; //下一狀態(tài)號
????char?ch; //接收的字符
}trans[200]; //用來在go()函數(shù)中記錄狀態(tài)間轉(zhuǎn)換
int??size_trans?=?0;
?
//定義項目集的形式
struct?proj{
????int?formula_numb; //產(chǎn)生式序號
????int?part; //產(chǎn)生式中.的位置
????char?expc; //希望接受的字符
}items[100][100];
int?????Ccount?=?0; //項目集個數(shù)
int?????size_item[100]; //每個項目集中產(chǎn)生式的條數(shù)
?
//狀態(tài)轉(zhuǎn)換表
struct?action{
????char????ch; //接受字符
????int?????nxt_sta; //下一狀態(tài)號
}action_table[100][100];//不超過100個狀態(tài)集;從每個狀態(tài)出發(fā)的狀態(tài)轉(zhuǎn)換不超過100條
int?size_act_table[100];//每個項目集狀態(tài)轉(zhuǎn)換邊數(shù)
?
ifstream??G_ifile; //文法輸入文件流
ifstream??input_ifile; //表達式輸入文件流
ofstream??items_ofile; //項目集輸出文件流
ofstream??act_ofile; //狀態(tài)轉(zhuǎn)換表輸出文件流
?
//讀取產(chǎn)生式
void?Read_G()
{
????G_ifile?>>?number;???//讀取產(chǎn)生式條數(shù)
????for(int?i?=?1;?i?<=?number;?i++){
????????char?temp;
????????int?j?=?0;
????????G_ifile?>>?temp;
????????while(temp?!=?‘$‘){ //循環(huán)讀到每條產(chǎn)生式末尾$
????????????tempofinput[temp]?=?true; //tempofinput[150]中讀入字符ASCII碼對應(yīng)值的位置記為true
????????????G[i][j++]?=?temp;
????????????G_ifile?>>?temp;
????????}
????????length[i]?=?j; //length[i]記錄每條產(chǎn)生式長度
????}
???
????G[0][0]?=?‘S‘;
????G[0][1]?=?G[1][0];
????length[0]?=?2; //G[0]定義拓展文法S->E
???
????for(int?i?=?0;?i?????????if(tempofinput[i])
???????????str_vt[size_vt++]?=?i; //標記Vt
????for(int?i?=?91;?i?????????if(tempofinput[i])
???????????str_vt[size_vt++]?=?i; //標記Vt
????for(int?i?=?65;?i?????????if(tempofinput[i])
???????????str_vn[size_vn++]?=?i; //標記Vn
}


//計算每一個Vn的FIRST:
//先設(shè)置?flag1表示本輪掃描?first_vn?中有沒有新增加的內(nèi)容。要是有,還要進行下一次掃描。
//每一輪掃描所有的產(chǎn)生式,在掃描每一個產(chǎn)生式的時候,設(shè)置一個下標指針?t?用來保證不會掃過本產(chǎn)生式.
//還設(shè)置?flag2?表示?t?的位置是否是一個可以推導(dǎo)出ε的非終結(jié)符。是的話,還要進行下一個?t?位置的檢查。
//如果?t走到產(chǎn)生式的最后位置的下一個位置,則表明ε屬于此產(chǎn)生式左邊非終結(jié)符的FIRST?集合
void?get_first(){
????bool?flag1;
????do{
????????flag1?=?false;
????????for(int?i?=?1;?i?<=?number;?i++){
???????????int?t?=?1; //每條產(chǎn)生式中的指針
???????????bool?flag2;
???????????do{
???????????????flag2?=?false;
???????????????if?(G[i][t]?>=?‘A‘?&&?G[i][t]?<=?‘Z‘){ //t當前位置是一個非終結(jié)符
??????????????????????for(int?k?=?0;?k? ??if(first_vn[G[i][t]-‘A‘][k]==true&&?!first_vn[G[i][0]-‘A‘][k]){
?first_vn[G[i][0]-‘A‘][k]?=?true;
?flag1?=?true;
??}
??????????????????????for(int?k?=?91;?k? ??if(first_vn[G[i][t]-‘A‘][k]==true&&?!

評論

共有 條評論