编译原理预测分析法实验报告(C语言).docVIP

编译原理预测分析法实验报告(C语言).doc

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

编 译 原 理 实 验 报 告 目的要求 构造文法的语法分析程序,要求采用预测分析法对输入的字符串进行语法分析。 加深对预测分析LL(1)分析法的理解和掌握。 实验内容 对文法G进行语法分析,文法G如下所示: *0. S→a */ *1. S→^ *2. S→(T) *3. T→SW * *4. W→,SW *5. W→ε; 并对任给的一个输入串进行语法分析检查。程序要求能对输入串进行预测分析,能判别程序是否符合已知的语法规则,如果不符合(编译出错),则输出错误信息。 程序输入/输出示例: 输入: 一个以 # 结束的符号串:例如:(a,a)# 输出: 步数 分析栈 输入串 所用规则 (1) #S (a,a))# 2 源程序: //LL(1)预测分析控制程序 #include stdio.h #include stdlib.h #include string.h char str[100]; //存储待分析的句子 const char T[ ] = a^(),#; //终结符,分析表的列符 const char NT[ ] = STW; //非终结符,分析表的行符 /*指向产生式右部符号串*/ const char *p[] = { /*0. S→a */ a, /*1. S→^ */ ^, /*2. S→(T) */ (T), /*3. T→SW */ SW, /*4. W→,SW */ ,SW, /*5. W→ε; */ }; //设M[i][j]=x,通过p[M[i][j]]=p[x]获取右部符号串。 const int M[][6] = { /* a ^ ( ) , # */ /*S*/ { 0, 1, 2, -1, -1, -1 }, /*T*/ { 3, 3, 3, -1, -1, -1 }, /*W*/ { -1, -1,-1, 5, 4, -1 } }; void init()//输入待分析的句子 { printf(请输入待分析的句子(以$结束):\n); scanf(%s,str); } int lin(char c);//非终结符转换为行号 int col(char c);//终结转换为列号 bool isNT(char c);//isNT判断是否是非终结符 bool isT(char c);//isT判断是否是终结符。 void main(void) { int i,j=0; int flag=1,flag2=0; char A; //设置指示句子的当前字符 char stack[20]= {#,S}; //栈赋初值 int top = 1 ; //设置栈顶指针 char X = ; //存储栈顶字符 init(); A=str[0]; printf(\t步数\t分析栈\t输入串\t所用规则\n); //在屏幕上输出列表标题 while ( 1 ) { printf(\n\t(%d)\t,++j); //输出当前执行步数 for ( i = 0 ; i = top ; i++ ) //输出当前栈的内容(出栈前) { printf(%c,stack[i]); } printf(\t); for ( i = flag-1 ; str[i]!=$ ; i++ ) { printf(%c,str[i]); } if(flag2==1) { printf(\t%d,M[ lin(X) ][col(A)]); flag2=0; } //出栈 X = stack[top--] ; if (X==#)//是结束符 { if (X==A)//是结束符 { printf(\tAcc\n); } else printf(\tERROR\n); break; } else if (isT(X))//是终结符 { A=str[flag++]; } else if (isNT(X))//是否是非终结符 { flag2=1; //

文档评论(0)

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

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

1亿VIP精品文档

相关文档