代码:
#include<iostream>
#include<fstream>
#include<cstring>
#include<stack>
using namespace std;
ifstream input;
ofstream output;
struct group{
char node[100];
int count;
};//状态集
group trans[200][200]; //转换矩阵,trans[i][j]=k;状态i输入j转换到状态K;
int groupCount;//DFA状态个数
group DFA[100];//DFA状态;
int trans_DFA[100][100];//DFA转换矩阵;
int finalFlag[200]; //DFA终态标志数组
char begin; //初态 S
char end; //终态
char state[100];//文法中的状态集合
int sCount=0; //文法中状态的个数
char final[200];//文法中终结符集合
int fCount=0; //文法中终结符的个数;
/*char keyword[60][20]={"int","float","char","double","bool","string","struct",
"stack","if","else","for","while","include","iostream","main","return","switch","typedef","void","unsigned","using","namespace","std","ifstream","ofstream"};
char one_operator[20]={'+','-','*','/','!','%','~','&','|','^','='};*/
bool check_state(char a){
for(int i=0;i<sCount;i++){
if(a==state[i])return true;
}
return false;
}
bool check_final(char a){
for(int i=0;i<fCount;i++){
if(a==final[i]) return true;
}
return false;
}
void NFA(){
int num;//文法个数
int flag;//文法类型:0为右线性,1为左线性;
char lag[6];//文法产生式
input.open("词法分析_文法.txt");
input>>num;
input>>flag;
input>>lag;
if(flag==1){
state[sCount++]='S';
begin='S';
end=lag[0];
}
else{
state[sCount++]='Y';
begin=lag[0];
end='Y';
}
while(num--){
if(!check_state(lag[0])){
state[sCount++]=lag[0];
}
if(strlen(lag)==3){// A->#的情况 空用#代替
if(flag==1){
trans[begin]['#'].node [trans[begin]['#'].count ++]=lag[0];
}
else{
trans[lag[0]]['#'].node [trans[lag[0]]['#'].count ++]='Y';
}
}
if(strlen(lag)==4){//A->a的情况
if(!check_final(lag[3])){
final[fCount++]=lag[3];
}
if(flag==0)//右线性
trans[lag[0]][lag[3]].node [trans[lag[0]][lag[3]].count ++]='Y';
if(flag==1)//左线性
trans[begin][lag[3]].node [trans[begin][lag[3]].count ++]=lag[0];
}
if(strlen(lag)==5){ //A->Aa或A->aA 的情况
if(!check_final(lag[3])&&(lag[3]<='A'||lag[3]>='Z')){
final[fCount++]=lag[3];
}
if(!check_final(lag[4])&&(lag[4]<='A'||lag[4]>='Z')){
final[fCount++]=lag[4];
}
if(flag==1){
trans[lag[3]][lag[4]].node [trans[lag[3]][lag[4]].count ++]=lag[0];
}
if(flag==0){
trans[lag[0]][lag[3]].node [trans[lag[0]][lag[3]].count ++]=lag[4];
}
}
input>>lag;
}
}
void showNFA()
{
for(int i=0;i<100;++i)
{
for(int j=0;j<100;++j)
{
for(int k=0;k<100;++k)
{
if(trans[i][j].node[k]!='@')
cout<<char(i)<<" "<<char(j)<<" "<<k<<" "<<trans[i][j].node[k]<<endl;
}
}
}
}
//子集构造法
//检查状态a是否在状态集合T中
bool checkGroup(char a,group t){
for(int i=0;i<t.count ;i++){
if(a==t.node [i])return true;
}
return false;
}
//闭包
void closure(group &t){
for(int i=0;i<t.count ;i++){
for(int j=0;j<trans[t.node [i]]['#'].count ;j++){
if(!checkGroup(trans[t.node [i]]['#'].node [j],t)){
t.node [t.count ++]=trans[t.node [i]]['#'].node [j];
}
}
}
}
//检查是否是终态
bool checkFinal(group t){
for(int i=0;i<t.count ;i++){
if(t.node [i]==end)return true;
}
return false;
}
//检查状态t是否在 DFA的状态集合里面
int checkNewsta(group t){
bool p[200];
bool pp;
for(int i=0;i<t.count ;i++)p[i]=false;
for(int i=0;i<groupCount;i++){
if(t.count !=DFA[i].count ){
continue;
}
for(int j=0;j<t.count ;j++){
for(int k=0;k<DFA[i].count ;k++){
if(t.node [j]==DFA[i].node [k]){
p[j]=true;
break;
}
}
}
pp=true;
for(int r=0;r<t.count ;r++){
if(p[r]==false){
pp=false;
break;
}
}
if(pp=true) return i;
for(int r=0;r<t.count ;r++)p[r]=false;
}
return -1;
}
void child_method(){
groupCount=0;//DFA状态个数
group newsta;//扩展之后的状态集合
group oldsta;//原来的状态集合;
oldsta.count =0;
newsta.node [newsta.count ++]=begin;
closure(newsta);
stack<group> s;
s.push(newsta);
DFA[groupCount++]=newsta;
if(checkFinal(newsta)){
finalFlag[groupCount-1]=true;
}
while(!s.empty() ){
// cout<<"while循环:::groupCount: "<<groupCount<<endl;
newsta=s.top() ;
s.pop() ;
for(int i=0;i<fCount;i++){
for(int j=0;j<newsta.count ;j++){
for(int k=0;k<trans[newsta.node [j]][final[i]].count ;k++){
if(trans[newsta.node [j]][final[i]].node [k]!='@'&&!checkGroup(trans[newsta.node [j]][final[i]].node [k],oldsta)){
oldsta.node [oldsta.count ++]=trans[newsta.node [j]][final[i]].node [k];
}
}
}
closure(oldsta);
/*cout<<"odsta的状态集:"<<endl;
for(int h=0;h<oldsta.count ;h++){
cout<<oldsta.node [h]<<" ";
}
cout<<endl;*/
cout<<"oldsta.count:"<<oldsta.count <<endl;
cout<<" checkNewsta(oldsta):"<< checkNewsta(oldsta)<<endl;
if(oldsta.count >0&& checkNewsta(oldsta)==-1 ){
cout<<"push之前::::groupCount: "<<groupCount<<endl;
trans_DFA[groupCount-1][final[i]]=groupCount;
s.push(oldsta);
cout<<"odsta的状态集:"<<endl;
for(int h=0;h<oldsta.count ;h++){
cout<<oldsta.node [h]<<" ";
}
cout<<endl;
DFA[groupCount++]=oldsta;
if(checkFinal(oldsta)){
finalFlag[groupCount-1]=true;
}
}
if(oldsta.count >0&& checkNewsta(oldsta)!=-1&&final[i]!='#'){
trans_DFA[checkNewsta(newsta)][final[i]]=checkNewsta(oldsta);
}
oldsta.count =0;
/* for(int m=0;m<oldsta.count ;m++){
oldsta.node [m]='@';
}*/
}
}
}
void showGroup(){
for(int i=0;i<groupCount;i++){
cout<<i<<"的集合:";
for(int j=0;j<DFA[i].count;j++){
cout<<DFA[i].node [j]<<" ";
}
cout<<endl;
}
}
void showDFAtrans(){
for(int i=0;i<100;++i)
{
for(int j=0;j<100;++j)
{
for(int k=0;k<100;++k)
{
if(trans_DFA[i][j]!=-1)
cout<<i<<" "<<char(j)<<" "<<trans_DFA[i][j]<<endl;
}
}
}
}
int main(){
for(int i=0;i<200;i++){
for(int j=0;j<200;j++){
for(int k=0;k<100;k++){
trans[i][j].node [k]='@';
}
}
}
NFA();
showNFA();
memset(trans_DFA,-1,sizeof(trans_DFA));
memset(finalFlag,0,sizeof(finalFlag));
child_method();
cout<<"groupCount: "<<groupCount<<endl;
showGroup();
cout<<"********************"<<endl;
showDFAtrans();
}