- 23
- 0
- 约1.27万字
- 约 24页
- 2016-11-28 发布于重庆
- 举报
预测分析算法的设计与实现
预测分析算法的设计与实现
程序代码:
#include stdio.h
#include stdlib.h
#define MaxRuleNum 8
#define MaxVnNum 5
#define MaxVtNum 5
#define MaxStackDepth 20
#define MaxPLength 20
#define MaxStLength 50
struct pRNode /*产生式右部结构*/
{
int rCursor;
struct pRNode *next;
};
struct pNode
{
int lCursor;
int rLength; /*右部长度*/
struct pRNode *rHead; /*右部结点头指针*/
};
char Vn[MaxVnNum + 1]; /*非终结符集*/
int vnNum;
char Vt[MaxVtNum + 1]; /*终结符集*/
int vtNum;
struct pNode P[MaxRuleNum];
int PNum;
char buffer[MaxPLength + 1];
char ch;
char st[MaxStLength]; /*要分析的符号串*/
struct collectNode
{
int nVt;
void ShowAT();/*输出分析表*/
void Identify(char *st);
void InitStack();
void ShowStack();
void Pop();
void Push(int r);
int main()
{
char todo,ch;
Init();
InputVn();
InputVt();
InputP();
getchar();
FirstFollow();
printf(所得first集为:);
ShowCollect(first);
printf(所得follow集为:);
ShowCollect(follow);
CreateAT();
ShowAT();
todo = y;
while(y == todo)
{
printf(\n是否继续进行句型分析?(y / n):);
todo = getchar();
while(y != todo n != todo)
{
printf(\n(y / n)? );
todo = getchar();
}
if(y == todo)
{
int i;
InitStack();
printf(请输入符号串(以#结束) : );
ch = getchar();
i = 0;
while(# != ch i MaxStLength)
{
st[i] = ch;
Identify(st);
}
else
printf(输入出错!\n);
}
}
getchar();
}
void Init()
{
int i,j;
vnNum = 0;
vtNum = 0;
PNum = 0;
for(i = 0; i = MaxVnNum; i++)
Vn[i] = \0;
for(i = 0; i = MaxVtNum; i++)
Vt[i] = \0;
for(i = 0; i MaxRuleNum; i++)
{
P[i].lCursor = NULL;
P[i].rHead = NULL;
P[i].rLength = 0;
}
PNum = 0;
for(i = 0; i = MaxPLength; i++)
}
}
int IndexCh(char ch)
{
int n;
n = 0; /*is Vn?*/
while(ch != Vn[n] \0 != Vn[n])
n++;
if(\0 != Vn[n])
return 100 + n;
n = 0; /*is Vt?*/
while(ch != Vt[n] \0 != Vt[n])
n++;
if(\0 != Vt[n])
return n;
return -1;
}
/*输出Vn或Vt的内容*/
void ShowChArray(char* collect)
{
int k = 0;
while(\0 != collect[k])
{
printf( %c , collect[k++]);
}
printf(\n);
}
/*输入非终结符*/
原创力文档

文档评论(0)