資源簡介
需要創建一個名字叫project.txt的文件來存儲要識別的文法
代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
#include?
using?namespace?std;
string?M[2000][2000];?????//任務分析表
stack??cc;??????????//分析棧
queue??qq;??????????//輸入串
set??ww[200];???????//first集
set??T;?????????????//終結符集
set??N;?????????????//非終結符集合
set??vv[200];???????//中間過程記錄集
set??ff[200];???????//fllow集合
set??select[200];???//select集合
int?step?=?0;?????????????//步驟統計變量
int?error_flag=0;?????????//錯誤標志位
int?nullflag[1000];???????//是否推空標志
int?nullselect[1000];?????//集合是否推空標志
int?ll=0;?????????????????//文法行數
int?T_flag[1000];?????????//右側是否含有終結符
int?length_char[1000];????//每行文法的字符個數
char?line[100][1024];?????//文法記錄表
//判斷是否是非終結符
bool?isN(char?v)
{
??if(v>=‘A‘&&v<=‘Z‘)
??{
??????return?true;
??}
??return?false;
}
//判斷是否是終結符
bool?isT(char?v)
{
????if(isN(v)==0&&v!=‘|‘&&v!=‘-‘&&v!=‘>‘)
????{
????????return?true;
????}
????return?false;
}
//輸出符號棧里的值
void?showCC()
{
????stack??cc2=cc;
????stack??cc3;
????while(!cc2.empty())
????{
????????cc3.push(cc2.top());
????????cc2.pop();
????}
????while(!cc3.empty())
????{
????????cout< ????????cc3.pop();
????}
????cout<<“\t“;
}
//輸出匹配字符串剩余部分
void?showPP()
{
????queue??pp2;
????pp2=qq;
????while(!pp2.empty())
????{
????????cout< ????????pp2.pop();
????}
????cout<<“\t“;
}
//判斷集合記錄是否為空,也即是否處理完所有過程
bool?isEmpty()
{
????for(set::iterator?ite1?=?N.begin();ite1!=N.end();ite1++)
????{
???????if(!vv[int(*ite1)].empty())
????????return?false;
????}
????return?true;
}
//求和,用于是否完成空字符判斷
int?sum()
{
????int?suum=0;
????for(set::iterator?ite1?=?N.begin();ite1!=N.end();ite1++)
????{
????????suum+=nullflag[int(*ite1)];
????}
????return?suum;
}
//判斷是否有推空非終結符
void?_null()
{
????int?cha=999;
????int?yuan=sum();
????while(cha!=0)
????{
????????//0代表不能推出空,1代表可以
????????for(int?i=0;i ????????{
????????????if(T_flag[i]==0)
????????????{
????????????????int?t=1;
????????????????for(int?j=3;j ????????????????{
????????????????????t=t&&nullflag[int(line[i][j])];
????????????????}
????????????????nullflag[int(line[i][0])]=t;
????????????}
????????}
????????cha=yuan-sum();
????????yuan=sum();
????}
}
//判斷select集合時,右側是否可以推空
void?_null2()
{
????for(int?i=0;i ????{
????????for(set::iterator?ite2?=?select[i].begin();ite2!=select[i].end();ite2++)
????????{
????????????if(*ite2==‘^‘)
????????????{
????????????????nullselect[i]=1;
????????????????break;
????????????}
????????}
????}
}
void?raedFromFile()
{
????fstream?infile(“project.txt“ios::in);
????while(infile.getline(line[ll]sizeof(line[ll])))
????{
????????for(int?i=0;i<100;i++)
????????{
????????????if(int(line[ll][i])==0)
????????????????{
????????????????????length_char[ll]=i;
????????????????????break;
????????????????}
????
- 上一篇:聯絡矩陣最小路集不交化
- 下一篇:vc 視頻會議系統v2.8 源碼
評論
共有 條評論