自上而下预测分析.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
自上而下预测分析

自上而下预测分析算法(C语言版) 1:特别注意:文法输入到文件中一定不要输错了,不要多任何空格,换行,但最后一行是空行,也就是倒数第二行末尾有一个换行符,如果执行程序时有错,请仔细检查文法文件(d:\grammar.txt)。 2:源代码如下: /*自上而下预测分析 完美C语言版*/ /*文法文件 将此注释复制至d:\grammar.txt文件,最后输入一个换行符 +*()i EPTQF E-TP P-+TP P-$ T-FQ Q-*FQ Q-$ F-(E) F-i */ /* $代表空集 文法可以是任何符合自上而下分析的文法 不要忘了最后输入一个换行符*/ #includestdio.h #includestring.h #define null 0 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define N 20 int vtnum=0;//终结符数目 int vnnum=0;//非终结符数目 int expnum=0;//产生式数目 char* vt;//指向终结符数组 char* vn; //指向非终结符数组 int First[N][N] = {0};//储存first集 int Follow[N][N] = {0};//储存follow集 int pretable[N][N] = {0};//预测分析表 int flag[20] = {0};//标识非终结符能否推出空集 typedef struct VNode{ int flag;//标识左部能否推出空集 char data;//左部非终结符 int right_length;//记录产生式右部的长度 char* firstarc; }VNode; VNode* vertices;//左部数组的头指针 typedef struct { char VN; char VT; }Sqv;//P-a形式的产生式 typedef struct { Sqv* top; Sqv* base; int stacksize; }Sqstack; Sqstack initStack(){ Sqstack sq; sq.base = (Sqv*)malloc(STACK_INIT_SIZE*sizeof(Sqv)); sq.top= sq.base; sq.stacksize= STACK_INIT_SIZE; return sq; }//初始化产生式栈 void pushStack(Sqstack* s,char e,char f){ if(s-top-s-base = s-stacksize-1){ s-base = (Sqv*)realloc((STACKINCREMENT+s-stacksize)*sizeof(Sqv)); s-top = s-base + s-stacksize-1; s-stacksize = STACKINCREMENT+s-stacksize; } s-top-VN = e; s-top-VT = f; s-top++; } void popStack(Sqstack* s,char* e,char* f){ s-top--; *e = s-top-VN; *f = s-top-VT; } int inStack(Sqstack s,char e,char f){ //判断(e,f)是否在栈中 char m,n; while(s.top != s.base){ s.top--; m = s.top-VN; n = s.top-VT; if((m==e)(n==f)){ return 1; } } return 0; } void readfile(){ FILE* fp; int i,j; char ch; fp = fopen(d:\\grammar.txt,rt); if(fp == null){ printf(Error in opening the file!\n); exit(0); } char str[20]; fgets(str,19,fp); vtnum = strlen(str)-1;//去掉换行符 vt = (char*)malloc((vtnum+1)*sizeof(char)); for(i=0;ivtnum;i++){ vt[i] = str[i]; } fgets(str,19,fp); vnnum = strlen(str)-1; vn = (c

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档