教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 教育文库 >

编译原理_实验报告(4)

来源:网络收集 时间:2026-09-08
导读: int topAnalyse; /*分析栈顶*/ /*int reverseStack[MaxStackDepth + 1]; /*颠倒顺序栈*/ /*int topReverse; /*倒叙栈顶*/ /*------------------function declare---------------*/ void Init();/*初始化*/ int Inde

int topAnalyse; /*分析栈顶*/

/*int reverseStack[MaxStackDepth + 1]; /*颠倒顺序栈*/

/*int topReverse; /*倒叙栈顶*/

/*------------------function declare---------------*/

void Init();/*初始化*/

int IndexCh(char ch);

/*返回Vn在Vn表中的位置+100、Vt在Vt表中的位置,-1表示未找到*/

void InputVt(); /*输入终结符*/

void InputVn();/*输入非终结符*/

void ShowChArray(char* collect, int num);/*输出Vn或Vt的内容*/

void InputP();/*产生式输入*/

bool CheckP(char * st);/*判断产生式正确性*/

void First(int U);/*计算first集,U->xx...*/

void AddFirst(int U, int nCh); /*加入first集*/

bool HaveEmpty(int nVn); /*判断first集中是否有空(-1)*/

void Follow(int V);/*计算follow集*/

void AddFollow(int V, int nCh, int kind);/*加入follow集,

kind = 0表加入follow集,kind = 1加入first集*/

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);/*使用产生式入栈操作*/

16

编译原理实验

LL1.CPP :

/*-------------------------*/

#include "LL1.h"

/*----main function--------*/

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) {

if(' ' != ch && '\n' != ch)

{

st[i++] = ch;

}

ch = getchar();

}

if('#' == ch && i < MaxStLength)

{

st[i] = ch;

Identify(st);

}

else

printf("输入出错!\n");

}

}

getchar();

}

/*--------function definition-------*/ 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++)

buffer[i] = '\0';

for(i = 0; i < MaxVnNum; i++)

{

first[i] = NULL;

follow[i] = NULL;

}

for(i = 0; i <= MaxVnNum; i++)

{

for(j = 0; j <= MaxVnNum + 1; j++)

analyseTable[i][j] = -1;

}

}

/*返回Vn在Vn表中的位置+100、Vt在Vt 表中的位置,-1表示未找到*/

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++;

17

编译原理实验

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");

}

/*输入非终结符*/

void InputVn()

{

int inErr = 1;

int n,k;

char ch;

while(inErr)

{

printf("\n请输入所有的非终结符,注意:");

printf("请将开始符放在第一位,并以#号结束:\n");

ch = ' ';

n = 0;

/*初始化数组*/

while(n < MaxVnNum)

{

Vn[n++] = '\0';

}

n = 0;

while(('#' != ch) && (n < MaxVnNum)) {

if(' ' != ch && '\n' != ch && -1 == IndexCh(ch))

{

Vn[n++] = ch;

vnNum++;

}

ch = getchar();

}

Vn[n] = '#'; /*以“#”标志结束用于判断长度是否合法*/

k = n; /*k用于记录n以便改Vn[n]='\0'*/

if('#' != ch)

{

if( '#' != (ch = getchar()))

{

while('#' != (ch = getchar()))

;

printf("\n符号数目超过限制!\n");

inErr = 1;

continue;

}

}

/*正确性确认,正确则,执行下下面,否则重新输入*/

Vn[k] = '\0';

ShowChArray(Vn);

ch = ' ';

while('y' != ch && 'n' != ch)

{

if('\n' != ch)

{

printf("输入正确确认?(y/n):");

}

scanf("%c", &ch);

}

if('n' == ch)

{

printf("录入错误重新输入!\n");

inErr = 1;

}

else

{

inErr = 0;

}

}

}

/*输入终结符*/

void InputVt()

{

int inErr = 1;

int n,k;

char ch;

while(inErr)

{

printf("\n请输入所有的终结符,注意:");

printf("以#号结束:\n");

ch = ' ';

n = 0;

/*初始化数组*/

while(n < MaxVtNum)

{

Vt[n++] = '\0';

}

n = 0;

18

编译原理实验

while(('#' …… 此处隐藏:2869字,全部文档内容请下载后查看。喜欢就下载吧 ……

编译原理_实验报告(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/110442.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)