语法分析程序.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
语法分析程序语法分析程序

实验二 语法分析程序设计 计算机科学与技术(2)班 [实验目的]: 了解语法分析的主要任务。 熟悉编译程序的编制。 [实验内容]:根据某文法,构造一基本递归下降语法分析程序。给出分析过程中所用的产生式序列。 [实验要求]: 构造一个小语言的文法,例如,Pascal语言子集的算术表达式文法: G[表达式]: G[E]: 表达式→表达式+项|表达式-项|项 E→E+T|T 项→项*因式|项/因式|因式 T→T*F|F 因式→标识符|无符号整数|(表达式) F→i|(E) 设计语法树的输出形式,例如: 产生式 …… 编写递归下降语法分析程序 实现基本的递归下降分析器,能够分析任给的符号串是否为该文法所定义的合法算术表达式。实验报告中要说明分析使用的方法。 生成并输出分析过程中所用的产生式序列: 1 产生式1 2 产生式2 …… [实验步骤]: 写出一个小语言的文法,根据情况自由选择C语言或Pascal语言。 写出该小语言的算术表达式等价的LL(1)文法。 S-I|o I-i(E)SP P-eS|^ E-0|1 其中小写字母为终结符,大写字母为非终结符,^为空。 编写递归下降语法分析程序。调试运行程序。 结果分析。 撰写实验报告。 [实验报告]: 写出实现的算法。 画出流程图。 递归 递归 实验设计过程中出现的问题及解决的方法。 写代码过程中,有时会遇到数据异常,可以使用编译器本身的调试功能或者设置一些标志量来检验。代码过于复杂时,比如本实验,应该先写出程序的主要代码,再添加那些输出代码。 实验设计过程中的体会。 在使用LL(1)算法时,先要写出LL(1)的文法,根据文法设计函数,弹药注意二义性的问题。 给出程序清单。 #include stdio.h #include dos.h #include stdlib.h #include string.h char inputstr[50],d[200],e[10];/*数组inputstr存输入串,数组d存推导式,*/ int strlong=0,Total=0,count=0,n=4; int S(); int I(); int P(); int E(); void outas(); void outrmd(); void output(); int main() { char ch; int i=0,f; printf(请输入字符串(长度50,以#号结束)\n); do{ scanf(%c,ch); inputstr[i]=ch; i++; }while(ch!=#); strlong=i; d[0]=S; d[1]==; d[2]=; d[3]=S; d[4]=#; printf(步骤\t文法\t\t分析串\t\t分析字符\t剩余串\n); f=S(); if(f==1) return 1; if(inputstr[count++]==#) { printf(accept!\n); i=0; ch=d[i]; while(ch!=#) { printf(%c,ch); i++; ch=d[i]; } } else { printf(error!); } return 0; } int S()/*正确返回0,错误返回1*/ { int f; if(inputstr[count++]==i) { char ch[]=S=I; e[0]=S; e[1]==; e[2]=; e[3]=I; e[4]=#; output(); printf(%d\tS-I\t\t,Total); outas(); outrmd(); Total++; f=I(); if(f==1) return 1; return 0; } count--; if(inputstr[count++]==o) { printf(%d\tS-o\t\t,Total); e[0]=S; e[1]==; e[2]=; e[3]=o; e[4]=#; output(); outas(); outrmd(); Total++; return 0; } } int I() { int f1,f2,f3; printf(%d\tI-i(E)SP\t,Total); e[0]=I; e[1]==; e[2]=; e[3]=i;

文档评论(0)

skewguj + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档