编译原理_LL文法源代码.doc
文本预览下载声明
LL(1)文法(源代码)
#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;
struct collectNode *next;
};
struct collectNode* first[MaxVnNum + 1]; /*first集*/
struct collectNode* follow[MaxVnNum + 1]; /*follow集*/
int analyseTable[MaxVnNum + 1][MaxVtNum + 1 + 1];
int analyseStack[MaxStackDepth + 1]; /*分析栈*/
int topAnalyse; /*分析栈顶*/
void Init();/*初始化*/
int IndexCh(char ch);
void InputVt(); /*输入终结符*/
void InputVn();/*输入非终结符*/
void ShowChArray(char* collect, int num);/*输出Vn或Vt的内容*/
void InputP();/*产生式输入*/
bool CheckP(char * st);/*判断产生式正确性*/
void First(int U);
void AddFirst(int U, int nCh); /*加入first集*/
bool HaveEmpty(int nVn);
void Follow(int V);/*计算follow集*/
void AddFollow(int V, int nCh, int kind);
void ShowCollect(struct collectNode **collect);/*输出first或follow集*/
void FirstFollow();/*计算first和follow*/
void CreateAT();/*构造预测分析表*/
void ShowAT();/*输出分析表*/
void Identify(char *st);
void InitStack();
void ShowStack();
void Pop();
void Push(int r);
void main(void)
{
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
显示全部