导师2010年课程设计作业陈述 学生姓名:专业班级:计算机班0705 导师:工作单位:计算机科学与技术学院 DO-WHILE语句翻译编程(递归下降法,输出四进制公式) 初始条件: 理论:完成后编译课程,掌握高级计算机语言的使用。 实践:计算机实验室提供计算机和软件环境。 如果你有一台电脑,你可以在上面进行设计。 需要完成的主要任务:(包括课程设计工作量及其技术要求,以及指令编写等具体要求),编写符合递归下降法的语法和属性语法。 完成题目所需的中间代码四元数的描述。 写出递归下降法的思想,并完成语法分析和语义分析编程。 分析程序编译完成后,设计几个用例,并在计算机上进行测试,并通过设计的分析程序。 设计报告格式按附件要求编写。 课程设计报告的正文内容应包括:问题的描述; 2 描述语法和属性语法; 3 语法分析方法和中间代码形式的描述; 4 简要分析和概要设计; 5 详细的算法描述; 6 给出软件测试方法和测试结果; 7 设计特点、不足、收获和经验。 时间安排:一周的设计进度:第一周、第二周:完成方案分析和设计。 第三周和第四周:完成程序调试和测试。 第五周:撰写课程设计报告。 设计验收安排:第18周周五3-4班到实验室进行上机验收。 设计报告收集时间:第十九周周四下午。
指导老师签名: 5月23日系主任(或负责老师)签名: 内容 1.问题描述 2.语法和属性语法描述。 2.1 DO-while 循环语句语法 2.2 DO-WHILE 循环语句属性语法: 3. 语法分析方法及中间代码形式描述 3.1 语法分析方法 3.2 中间代码形式描述 4. 简要分析与概要设计 4.1 词法分析 4.2递归下降翻译器设计 4.3 语法引导翻译 5 算法详细描述 5.1 语法 5.2 错误检查 6 测试方法和测试结果 6.1 测试方法 6.2 测试用例 6.3 测试结果 7 设计特点、缺点、收获和经验 7.1 设计特点 7.2 缺点、设计收获与心得 8 参考文献 DO-WHILE 语句编程翻译分析——递归下降法,输出四进制公式 1 问题描述 设计一条 DO-WHILE 循环语句 词法、语法、语义分析程序采用递归下降法进行语法分析,并使用语法引导翻译来输出中间代码四元数。 2 语法和属性语法的描述。 2.1 DO-while循环语句的语法产生式是S-。 为了方便语法引导翻译,改写如下: 语法G(s)如下:--{s1}-;s1lab-==||!=|||| =||||=2.2 DO-WHILE循环语句的属性语法:产生式语义规则 SdoS.begin:=;E.true:=;E.false:=S.next;S1.next:=S.begin; S.code:=gen(S.begin':'‖E.
code‖gen(E.true':')‖S1.code‖gen('goto'S.begin) 三、语法分析方法及中间代码形式说明 3.1 语法分析方法 递归下降法的实现思想是提供每个非终结符号设计一个相应的递归子程序,识别程序由一组这样的子程序组成。 其优点是简单直观、易于构造。 很多编译系统的缺点是对语法要求较高。 由于递归调用较多,影响了分析器的效率。 其语法可表示为: 3.2 中间码形式描述 中间码采用四元式输出,四元数是一个有四个字段的记录结构,称为and。 op 字段包含代表操作符的内部代码。 语句的四进制输出形式如下: 4.简要分析与概要设计 4.1 词法分析 词法分析程序的任务是从左到右逐个字符地扫描源程序,一一生成单词符号,并将源程序作为字符串转换为单词符号的中间程序。 。 词法分析检查的错误主要是挑出源程序中出现的非法符号。 所谓非法符号是指编程语言中不允许出现的符号,就像自然句子中的拼写错误一样。 4.2 递归下降翻译器的设计为每个非终结符号A构造一个函数过程,并为A的每个继承属性设置一个形参,函数的返回值是A的综合属性。在函数过程中对应对于A,A产生式中每个语法符号的每个属性都设置一个局部变量。
在非终结符号A对应的函数过程中,根据当前输入符号来确定使用哪个产生式候选。 在每个产生式对应的程序代码中,按照从左到右的顺序,对单词符号、非终结符号和语义动作进行了如下工作。 (1) 对于具有综合属性x的终端符号X,将x的值存储到为X和x设置的变量中。 然后它进行匹配 X 的调用并继续读取输入符号。 (2) 对于每个非终结符号 B,生成赋值语句 c=B(b1, b2,..., bk),右侧为函数调用。 (3) 对于语义动作,将动作的代码复制到分析器中,用代表属性的变量替换对相应属性的每个引用。 4.3 句法引导翻译 在句法分析过程中,随着分析的一步步进行,根据每个产生式对应的语义子程序(或语义规则描述的语义动作)进行翻译。 属性语法的每个符号都有属性,因此每个符号入栈时,必须与其属性一起入栈。 这样,堆栈符号就由语法符号和存储符号属性的字段组成。 由于属性类型不同,属性域中存储的内容必须根据属性的类型来确定。 有些可能直接存储属性值,而另一些可能存储指向属性值的指针。 对于综合属性来说,属性域并不存储其属性值,而是存储一个指向存储属性值的单元的指针。 对于继承的属性,其属性字段直接存储其属性值。 继承属性的属性字段在第一次压入堆栈时为空,但在堆栈符号成为堆栈顶部符号之前的某个时刻,它们必须接受相应的属性值。 也就是说,当成为栈顶时,继承的属性的属性字段必须有值。
5 算法详细说明 5.1 语法--{s1}-;s1lab-==||!=||||=||||= 5.2 错误检查 (int//3 表示 '('if(b[o++] = =10)//变量else{cout"不等式右边部分出错"endl;}else{cout"不等号右边出错"endl;"不等式左边部分出错"endl;uzhi({cout "赋值语句右侧错误"endl;} else{cout"赋值语句右侧错误"endl;}else{cout"赋值语句右侧错误"endl;}else{ cout"赋值语句缺少赋值运算符"endl;}else{cout"赋值语句左侧出错" endl;(int*aa,intif(aa[zz]==2){;}// /2表示';'else{if(fuzhi(aa,zz))//赋值语句 xue++;if(aa[zz++ ]==2)//';'if(aa[zz]==6){; }///6表示'}'else((aa,zz))//; (aa[zz]= =10)//';'的递归,既不是赋值语句,也不是其后面的'}',而是一个变量,那么它就是一个错误; {cout"!"endl; else{cout"分号错误!"endl; else{cout"赋值语句错误!"endl; intS(int *a,int ((a,z))//测试s1 (a[z++]==6){//6表示'}'if(a[z++]==11 )//'while ' (a[z++]==3){//3 表示 '('if((a,z))//不等式 (a[z++]==4)//4 表示 ')' {cout"! " endl; }else{cout"')' 在不等式之后缺失!"endl; else{cout"不等式错误!"endl; }else{cout"'(' 不等式后缺失!"endl; }else{ cout"error 'while'"endl; 0;}}else {cout"} 0;}else }else{cout"error ' do'"endl; 6 测试方法和测试结果 6.1 在C++环境下设计测试方法 测试几个有代表性的用例,例如:如果输入语句do}while(ab)没有产生预期的结果,那么就会有程序有问题。
如果有问题,进行单步调试,找出程序中的逻辑问题。 6.2 测试用例 do i=i+j;a=b+c;=g+h;hu=ssf+wef;}while(i1110)#(正确!) do (i10)#(错误) 6.3 测试结果 测试结果如下:“../../Local%/Temp/%5dE%7bE%5d%7bQ@%7b~R%25(PJP.jpg"CTURE"../../Local%/Temp/GNX1% ( 4Q8%.jpg" 设计的特点、缺点、收获和经验 7.1 设计的特点 本设计采用递归下降的方法,对输入的 DO WHILE 循环语句的语法和语义进行分析,并输出四元数。因此,程序充分体现了递归下降的思想。 7.2 设计的不足、收获和经验 通过这次实验,我对编译过程有了比较系统的认识,编译过程一般分为六个阶段,可以通过以下方式完成六个模块,分别是词法分析器、语法分析器、语义分析器、中间代码生成程序、代码优化程序、目标代码生成程序,此外,一个完整的编译器还必须包括“表管理程序”和“错误处理程序”。