#include <iostream>
#include <stack>
using namespace std;
char msg[50];
class mystack{
public:
char element[100];
int size;
void clear()
{
size=0;
}
int length()
{
return size;
}
char top()
{
if(size>0)
return element[size-1];
}
void pop()
{
if(size>0)
{
size--;
element[size]='\0';
}
}
void push(char st)
{
element[size++]=st;
element[size]='\0';
}
mystack()
{
size=0;
}
};
mystack sc;
//
void printstack()
{
printf("%s\t",sc.element);
}
//
char s[80];//输入的字符串
int l;//输入字符串的长度
struct any
{
char a1[10];
char a2[10];
char a3[10];
char a4[10];
char a5[10];
char a6[10];
};
struct any S={"E","E","TA","TA","E","E"};
struct any A={"E","E","UB","UB","E","E"};
struct any B={"E","E","m",")s(","E","E"};
struct any U={"","UB*","TA","TA","E",""};
struct any T={"TA+","E","E","E","E",""};
////////////////////////////////////////////////////////
bool comp(int& b)
{
char d;
//int i;
d=sc.top();
if(d=='+'||d=='*'||d=='m'||d=='('||d==')')
{
if(s[b]==d)
{
msg[0]=s[b];
strcpy(msg+1,"匹配");
b++;
sc.pop();
return true;
}
else
{
printf("ERROR!");
return false;
}
}
//----------------------------------------------
else if(d=='S')
{
if(s[b]=='m')
{
strcpy(msg,"S->AT");
sc.pop();
for(int i=0;i<strlen(S.a3);i++)
{
sc.push(S.a3[i]);
}
//strcpy(msg,"S->AT");
return true;
}
else if(s[b]=='(')
{
strcpy(msg,"S->AT");
sc.pop();
for(int i=0;i<strlen(S.a4);i++)
{
sc.push(S.a4[i]);
}
//strcpy(msg,"S->AT");
return true;
}
else
{
printf("ERROR!");
return false;
}
}
//---------------------------------------------
else if(d=='A')
{
if(s[b]=='m')
{
strcpy(msg,"A->BU");
sc.pop();
for(int i=0;i<strlen(A.a3);i++)
{
sc.push(A.a3[i]);
}
//strcpy(msg,"A->BU");
return true;
}
else if(s[b]=='(')
{
strcpy(msg,"A->BU");
sc.pop();
for(int i=0;i<strlen(A.a4);i++)
{
sc.push(A.a4[i]);
}
//strcpy(msg,"A->BU");
return true;
}
else
{
printf("ERROR!");
return false;
}
}
//-------------------------------------------
else if(d=='B')
{
if(s[b]=='m')
{
sc.pop();
for(int i=0;i<strlen(B.a3);i++)
{
sc.push(B.a3[i]);
}
strcpy(msg,"B->m");
return true;
}
else if(s[b]=='(')
{
sc.pop();
for(int i=0;i<strlen(B.a4);i++)
{
sc.push(B.a4[i]);
}
strcpy(msg,"B->(S)");
return true;
}
else
{
printf("ERROR!");
return false;
}
}
//----------------------------------------------
else if(d=='U')
{
if(s[b]=='+')
{
sc.pop();
strcpy(msg,"S->$");
return true;
}
else if(s[b]=='*')
{
sc.pop();
for(int i=0;i<strlen(U.a2);i++)
{
sc.push(U.a2[i]);
}
strcpy(msg,"S->*BU");
return true;
}
else if(s[b]=='#')
{
sc.pop();
strcpy(msg,"U->$");
return true;
}
else
{
printf("ERROR!");
return false;
}
}
//-------------------------------------------------
else if(d=='T')
{
if(s[b]=='+')
{
sc.pop();
for(int i=0;i<strlen(T.a1);i++)
{
sc.push(T.a1[i]);
}
strcpy(msg,"T->+AT");
return true;
}
else if(s[b]=='#')
{
sc.pop();
strcpy(msg,"T->$");
return true;
}
else
{
printf("ERROR!");
return false;
}
}
//---------------------------------------------------
else if(d=='#')
{
printf("接受");
return false;
}
//--------------------------------------------------
else
{
printf("ERROR!");
return false;
}
}
///////////////////////////////////////////////
void main()
{
while(true)
{
sc.clear();
printf("please input string(exit to quit):");
gets(s);
if(strcmp(s,"exit")==0)
break;
l=strlen(s);//取得字符串的长度
s[l]='#';//对输入的字符串最后补充一个#号
l++;
s[l]='\0';
sc.push('#');
sc.push('S');
int b;
b=0;
printf("用预测分析法分析符号串的过程:");
printf("\n");
printf("step\tStack\tString\tRule\n");
int st=1;
printf("%d\t",st);
printstack();//输出栈内元素
printf("%s\t",&s[b]);//输出剩余字符串的内容
//printf("S->AT\n");
while(b<l&&comp(b))
{
printf("%s\n",msg);
st++;
printf("%d\t",st);
printstack();//输出栈内元素
printf("%s\t",&s[b]);//输出剩余字符串的内容
}
printf("\n");
}
}
- 1
- 2
- 3
前往页