资源简介
已知文法G[S]:
S->AT
A->BU
T->+AT|$
U->*BU|$
B->(S)|m
其中,$表示空串。对该文法构造预测分析表,并手工构造预测分析程序,对输入串m+m*m#进行语法分析,并根据栈的变化状态输出分析过程。
代码片段和文件信息
#include
#include
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 {
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 {
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 {
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 {
sc.push(A.a4[i]);
}
//strcpy(msg“A->BU“);
return true;
}
else
{
printf(“ERROR!“);
return false;
}
}
//-------------------------------------------
评论
共有 条评论