编译原理课程设计
- 格式:docx
- 大小:424.61 KB
- 文档页数:41
编译原理编译器课程设计一、课程目标知识目标:1. 理解编译原理的基本概念,掌握编译器各阶段的工作原理和实现方法;2. 学会使用一种编程语言(如C、Java等)编写简单的编译器程序;3. 掌握词法分析、语法分析、语义分析及目标代码生成的基本技术和策略;4. 了解优化技术在编译器中的应用,提高程序运行效率。
技能目标:1. 能够运用所学知识独立设计并实现一个简单的编译器;2. 培养学生运用编译原理知识解决实际问题的能力;3. 提高学生的编程实践能力和团队协作能力;4. 培养学生查阅资料、分析问题、总结归纳的能力。
情感态度价值观目标:1. 培养学生对编译原理和编译器开发工作的兴趣,激发学生的学习热情;2. 培养学生勇于探索、积极创新的精神,增强克服困难的信心和毅力;3. 培养学生具备良好的编程习惯,遵循职业道德,为我国软件产业的发展贡献自己的力量。
本课程旨在通过编译原理编译器课程设计,使学生掌握编译器的基本原理和技术,提高编程实践能力,培养团队协作精神,激发学生的学习兴趣和创新精神。
课程性质为理论与实践相结合,注重培养学生的实际操作能力。
针对学生的年级特点,课程内容将逐步深入,从基本概念到实际应用,引导学生由浅入深地掌握编译器相关知识。
在教学过程中,教师需关注学生的学习进度,及时调整教学策略,确保课程目标的实现。
通过本课程的学习,学生将具备独立设计和实现简单编译器的能力,为后续相关课程的学习打下坚实基础。
二、教学内容1. 编译原理概述:介绍编译器的基本概念、发展阶段和组成部分,使学生了解编译器在整个软件开发过程中的地位和作用。
教材章节:第一章2. 词法分析:讲解词法分析器的功能、设计方法,以及正则表达式和有限自动机等基本概念。
教材章节:第二章3. 语法分析:介绍语法分析器的作用、设计方法,以及上下文无关文法、LL(1)、LR(1)等分析方法。
教材章节:第三章4. 语义分析:讲解语义分析器的任务、属性文法、语法制导翻译等概念,以及类型检查和符号表管理方法。
编译原理课程设计教案第一章:编译原理概述1.1 编译器的作用与重要性解释编译器将高级语言程序转换为机器语言程序的过程强调编译器在软件开发中的关键角色1.2 编译原理的基本概念介绍编译程序的基本组成部分,如词法分析器、语法分析器、语义分析器、中间代码器、目标代码器和代码优化器等解释源程序、目标程序和中间代码的概念1.3 编译过程的阶段详细介绍编译过程的各个阶段,包括词法分析、语法分析、语义分析、中间代码、代码优化和目标代码强调每个阶段的目标和重要性第二章:词法分析2.1 词法分析的基本概念解释词法分析器的任务和作用介绍词法单位的概念,如标识符、关键字、常量和符号等2.2 词法分析的技术和方法介绍词法分析常用的技术和方法,如有限自动机、正则表达式和词法规则等解释词法分析过程中的扫描线和词法单元的产生过程2.3 词法分析器的实现介绍如何实现一个简单的词法分析器,包括词法规则的定义和词法分析器的构造提供相关的编程练习,让学生通过编写代码实现基本的词法分析功能第三章:语法分析3.1 语法分析的基本概念解释语法分析器的任务和作用介绍语法规则和语法树的概念3.2 语法分析的技术和方法介绍语法分析常用的技术和方法,如递归下降分析法、LL分析法、LR分析法等解释语法分析过程中的分析表和状态机的概念3.3 语法分析器的实现介绍如何实现一个简单的语法分析器,包括语法规则的定义和语法分析器的构造提供相关的编程练习,让学生通过编写代码实现基本的语法分析功能第四章:语义分析4.1 语义分析的基本概念解释语义分析器的任务和作用介绍语义规则和语义错误的概念4.2 语义分析的技术和方法介绍语义分析常用的技术和方法,如类型检查、上下文无关文法分析、语义规则等解释语义分析过程中的语义规则和语义冲突的解决方法4.3 语义分析器的实现介绍如何实现一个简单的语义分析器,包括语义规则的定义和语义分析器的构造提供相关的编程练习,让学生通过编写代码实现基本的语义分析功能第五章:中间代码5.1 中间代码的基本概念解释中间代码器的任务和作用介绍中间代码的概念和中间代码的原则5.2 中间代码的技术和方法介绍中间代码的常用技术和方法,如三地址代码、静态单赋值代码等解释中间代码过程中的基本规则和操作符的转换5.3 中间代码器的实现介绍如何实现一个简单的中间代码器,包括中间代码的定义和中间代码器的构造提供相关的编程练习,让学生通过编写代码实现基本的中间代码功能第六章:代码优化6.1 代码优化的基本概念解释代码优化器的任务和作用介绍代码优化的目标和常见的优化技术6.2 常见代码优化技术详细介绍各种代码优化技术,如常量折叠、死代码消除、循环优化、表达式简化等强调优化技术对提高程序性能的重要性6.3 代码优化器的实现介绍如何实现一个简单的代码优化器,包括优化规则的定义和代码优化器的构造提供相关的编程练习,让学生通过编写代码实现基本的代码优化功能第七章:目标代码7.1 目标代码的基本概念解释目标代码器的任务和作用介绍目标代码的概念和目标代码的原则7.2 目标代码的技术和方法介绍目标代码的常用技术和方法,如寄存器分配、指令调度等解释目标代码过程中的基本规则和操作符的转换7.3 目标代码器的实现介绍如何实现一个简单的目标代码器,包括目标代码的定义和目标代码器的构造提供相关的编程练习,让学生通过编写代码实现基本的目标代码功能第八章:调试技术8.1 调试技术的基本概念解释调试器的作用和重要性介绍调试过程中的常见问题和调试技术8.2 调试器的结构和原理详细介绍调试器的结构和原理,如断点、单步执行、查看变量等功能强调调试技术对发现和修复程序错误的重要性8.3 调试器的实现介绍如何实现一个简单的调试器,包括断点的设置、单步执行、变量查看等功能提供相关的编程练习,让学生通过编写代码实现基本的调试功能第九章:编译器性能评价9.1 编译器性能评价的基本概念解释编译器性能评价的目的和方法介绍编译器性能评价的指标和评价方法9.2 编译器性能评价的指标和评价方法详细介绍编译器性能评价的指标,如执行速度、内存占用、编译时间等介绍常用的编译器性能评价方法和工具9.3 编译器性能评价的实践介绍如何进行编译器性能评价的实践,包括评价指标的选取和评价方法的实施提供相关的实践练习,让学生通过实际操作评价编译器的性能第十章:编译原理应用与发展趋势10.1 编译原理在软件开发中的应用介绍编译原理在软件开发中的应用领域,如解释器设计、即时编译、程序分析等强调编译原理在提高程序性能和开发效率方面的重要性10.2 编译原理的研究现状与未来发展介绍编译原理研究领域的前沿技术和最新研究成果探讨编译原理未来的发展趋势和挑战10.3 编译原理在实践中的应用案例分析分析编译原理在实际项目中的应用案例,如开源编译器项目、商业编译器产品等引导学生思考如何将编译原理应用于实际工程实践中的问题重点和难点解析重点环节一:编译器的作用与重要性编译器作为程序设计语言和计算机硬件之间的桥梁,其作用不可忽视。
南邮编译原理课程设计一、课程目标知识目标:1. 理解编译原理的基本概念,掌握编译器的各个阶段及其功能;2. 学习并掌握词法分析、语法分析、语义分析的基本方法;3. 了解目标代码生成和代码优化的一般方法。
技能目标:1. 能够运用形式语言和自动机理论分析编程语言;2. 学会使用编译器构造工具,如lex和yacc,进行简单的编译器编写;3. 能够运用所学知识对简单程序进行编译过程的调试和分析。
情感态度价值观目标:1. 培养学生对编译原理的兴趣,激发学生自主学习、深入研究的热情;2. 培养学生的团队合作精神,提高学生在团队中的沟通协作能力;3. 使学生认识到编译技术在计算机科学与技术领域的重要地位,增强学生的专业认同感。
课程性质分析:本课程为计算机科学与技术专业核心课程,涉及编译原理的基础知识和实践技能。
课程注重理论与实践相结合,培养学生对编译过程的理解和编译器的构造能力。
学生特点分析:南邮学生具备一定的编程基础和计算机科学理论知识,对编译原理有一定了解,但可能缺乏系统性的认识和实际操作经验。
教学要求:1. 结合实际案例,深入浅出地讲解编译原理的基础知识;2. 强化实践环节,通过实际操作,使学生掌握编译器构造的基本方法;3. 注重培养学生的主动学习能力和团队合作精神,提高学生的综合素质。
二、教学内容1. 编译原理概述:介绍编译器的定义、编译过程及其各个阶段的作用,引导学生理解编译器的整体框架。
教材章节:第一章2. 词法分析:讲解词法分析的基本概念、词法分析器的功能及其实现方法,包括正则表达式和有限自动机理论。
教材章节:第二章3. 语法分析:介绍语法分析的基本概念、语法分析器的功能及其实现方法,包括上下文无关文法、递归下降分析和LL(1)分析法等。
教材章节:第三章4. 语义分析:讲解语义分析的作用、类型检查和符号表等基本概念,探讨语义分析的方法和实现。
教材章节:第四章5. 中间代码生成与优化:介绍中间代码的特点、生成方法以及常见的优化技术。
编译原理课程设计内容一、教学目标本节课的教学目标是使学生掌握编译原理的基本概念和基本方法,能够理解源程序的词法分析、语法分析和语义分析等过程,并能够运用这些知识对简单的程序进行编译。
通过本节课的学习,学生应达到以下具体目标:1.知识目标:了解编译原理的基本概念、编译过程和编译器的基本结构;掌握源程序的词法分析、语法分析和语义分析的基本方法。
2.技能目标:能够运用编译原理的基本知识对简单的程序进行编译;能够使用至少一种编译器进行程序设计。
3.情感态度价值观目标:培养学生对计算机科学和编程的兴趣和热情,提高学生分析问题和解决问题的能力。
二、教学内容本节课的教学内容主要包括以下几个部分:1.编译原理的基本概念和编译过程;2.源程序的词法分析、语法分析和语义分析的基本方法;3.编译器的基本结构和工作原理;4.简单程序的编译实例。
三、教学方法为了达到本节课的教学目标,将采用以下几种教学方法:1.讲授法:通过讲解编译原理的基本概念、编译过程和编译器的基本结构,使学生掌握相关知识。
2.案例分析法:通过分析具体程序的编译过程,使学生理解和掌握词法分析、语法分析和语义分析的方法。
3.实验法:让学生亲自使用编译器进行程序设计,提高学生的实际操作能力。
四、教学资源为了支持本节课的教学内容和教学方法的实施,将准备以下教学资源:1.教材:《编译原理》;2.参考书:相关编译原理的专著和论文;3.多媒体资料:关于编译原理的PPT、视频等;4.实验设备:计算机和编译器。
五、教学评估为了全面、公正地评估学生在编译原理课程中的学习成果,将采用以下几种评估方式:1.平时表现:通过观察学生在课堂上的参与程度、提问回答等情况,评估学生的学习态度和理解程度;2.作业:布置与课程内容相关的编程作业,评估学生的实际操作能力和对知识的掌握程度;3.考试:进行期中考试和期末考试,评估学生对课程知识的全面理解和运用能力。
六、教学安排本学期的编译原理课程安排如下:1.教学进度:按照教材《编译原理》的章节顺序进行教学,确保每个章节都有足够的时间进行讲解和讨论;2.教学时间:每周两节课,每节课45分钟,共计18周;3.教学地点:计算机实验室,以便学生进行实验和实践。
编译原理c语言课程设计一、课程目标知识目标:1. 理解编译原理的基本概念,掌握C语言编译过程的关键步骤;2. 学会运用C语言进行程序设计,掌握基本语法、数据类型、运算符和控制结构;3. 了解编译器如何将C语言代码转换为机器语言,理解编译器优化和错误处理机制;4. 掌握使用调试工具对C程序进行调试和优化,提高程序性能。
技能目标:1. 能够运用所学知识独立编写简单的C程序,解决实际问题;2. 学会使用编译器和调试工具对C程序进行编译、链接和调试,具备基本的程序调试能力;3. 能够分析C程序中的错误,并进行修正,提高编程能力;4. 培养良好的编程习惯,编写规范、易读、高质量的C代码。
情感态度价值观目标:1. 培养学生对编译原理和C语言的兴趣,激发学习热情,树立自信心;2. 培养学生的团队合作意识,学会与他人共同解决问题,提高沟通能力;3. 培养学生的创新精神,敢于尝试新方法,勇于克服困难,追求卓越;4. 培养学生严谨、踏实的学术态度,遵循学术道德,尊重他人成果。
课程性质:本课程为实践性较强的学科,要求学生具备一定的计算机基础和编程能力。
学生特点:学生处于高年级阶段,已具备一定的编程基础和问题解决能力。
教学要求:注重理论与实践相结合,强调动手实践,培养学生解决实际问题的能力。
在教学过程中,关注学生的个体差异,因材施教,确保课程目标的实现。
通过本课程的学习,使学生能够掌握编译原理和C语言的核心知识,具备实际编程和调试能力。
二、教学内容1. 编译原理基本概念:介绍编译过程、编译器的组成、编译器的优化和错误处理;- 教材章节:第1章 编译原理概述2. C语言基础知识:回顾C语言的基本语法、数据类型、运算符、表达式和控制结构;- 教材章节:第2章 C语言基础3. C程序设计:学习函数、数组和指针的运用,编写简单的C程序;- 教材章节:第3章 函数、第4章 数组与指针4. 编译器与调试工具的使用:学习如何使用编译器、链接器和调试器对C程序进行编译、链接和调试;- 教材章节:第5章 编译器与调试器5. C程序调试与优化:分析C程序中的错误,学习调试技巧和性能优化方法;- 教材章节:第6章 程序调试与优化6. 综合案例分析与实战:结合实际案例,进行编译原理和C语言的实战训练;- 教材章节:第7章 综合案例分析与实战教学内容安排和进度:1. 第1周:编译原理基本概念;2. 第2周:C语言基础知识回顾;3. 第3-4周:C程序设计;4. 第5周:编译器与调试工具的使用;5. 第6周:C程序调试与优化;6. 第7-8周:综合案例分析与实战。
《编译原理》课程设计一、课程目标知识目标:1. 理解编译原理的基本概念,掌握编译器的基本结构及其工作流程;2. 学会使用词法分析、语法分析和语义分析的基本方法,能对简单程序进行编译过程分析;3. 掌握程序语言中的类型系统、作用域规则和中间代码生成等关键知识。
技能目标:1. 能够运用所学编译原理知识,编写简单的词法分析器和语法分析器;2. 具备分析并优化程序代码的能力,提高程序运行效率;3. 能够运用调试工具对编译过程中出现的问题进行定位和解决。
情感态度价值观目标:1. 培养学生严谨的逻辑思维能力和问题解决能力,激发学生对计算机科学领域的探索热情;2. 培养学生的团队协作意识,提高沟通与交流能力,使学生能够更好地适应未来的工作环境;3. 增强学生的学术自信,培养他们勇于挑战困难、持续学习的优良品质。
课程性质:本课程属于计算机科学与技术专业核心课程,旨在帮助学生深入理解程序设计语言的编译过程,掌握编译原理的基本知识和技能。
学生特点:学生具备一定的编程基础,熟悉至少一种程序设计语言,但可能对编译原理的理论知识掌握不足。
教学要求:结合学生特点,注重理论与实践相结合,强调案例教学,使学生能够将所学知识应用于实际编程中。
通过课程学习,使学生达到以上所述的知识、技能和情感态度价值观目标,为后续相关课程和未来职业发展奠定坚实基础。
二、教学内容1. 编译原理概述:介绍编译器的基本概念、编译过程及编译器的结构;- 教材章节:第1章 编译原理概述2. 词法分析:讲解词法分析的基本任务、词法分析器的实现方法及相关算法;- 教材章节:第2章 词法分析3. 语法分析:介绍语法分析的基本概念、语法分析器的构造方法及递归下降分析法等;- 教材章节:第3章 语法分析4. 语义分析:讲述语义分析的任务、类型检查、符号表管理及语义分析器的实现;- 教材章节:第4章 语义分析5. 中间代码生成:解析中间代码的概念、中间代码表示形式及中间代码生成方法;- 教材章节:第5章 中间代码生成6. 代码优化与生成:介绍代码优化的目的、方法及目标代码生成的基本过程;- 教材章节:第6章 代码优化与生成7. 实践环节:组织学生进行词法分析器、语法分析器的编写和调试,分析并优化给定程序;- 教材章节:实践环节教学内容安排和进度:共16学时,其中理论教学10学时,实践环节6学时。
编译原理课程设计速成教案一、教学目标本节课旨在通过学习编译原理,使学生掌握以下知识目标:1. 理解编译器的基本结构和编译过程;2. 掌握词法分析、语法分析、中间代码生成、代码优化和目标代码生成的基本原理和方法。
技能目标:1. 能够使用至少一种编程语言实现简单的编译器;2. 能够分析简单的程序,并对其进行词法分析和语法分析。
情感态度价值观目标:1. 培养学生对计算机科学和编程的兴趣;2. 培养学生的问题解决能力和创新精神。
二、教学内容本节课的教学内容主要包括以下几个部分:1. 编译器的基本结构和工作原理;2. 词法分析的基本方法和技术;3. 语法分析的基本方法和技术;4. 中间代码生成和代码优化的基本方法和技术;5. 目标代码生成的基本方法和技术。
三、教学方法为了更好地实现教学目标,本节课将采用以下教学方法:1. 讲授法:通过讲解编译原理的基本概念和理论知识,使学生掌握相关知识点;2. 案例分析法:通过分析具体的程序案例,使学生理解并掌握词法分析和语法分析的方法;3. 实验法:通过编程实验,使学生亲手实现简单的编译器,加深对编译原理的理解。
四、教学资源为了支持教学内容和教学方法的实施,本节课将使用以下教学资源:1. 教材:《编译原理》,为学生提供理论知识和参考;2. 多媒体资料:包括PPT、视频等,用于辅助讲解和演示;3. 实验设备:计算机、编程环境等,用于实验和实践。
五、教学评估本节课的评估方式包括以下几个部分:1. 平时表现:通过课堂参与、提问、讨论等方式评估学生的学习态度和理解程度;2. 作业:通过布置相关的编程作业,评估学生对知识的掌握和应用能力;3. 考试:通过期末考试,全面评估学生对编译原理知识的掌握程度。
六、教学安排本节课的教学安排如下:1. 课时:共4课时,每课时45分钟;2. 教学时间:安排在每周三下午;3. 教学地点:计算机实验室。
教学安排将根据学生的实际情况和需要进行调整,确保教学效果最大化。
编译原理的课课程设计一、教学目标本课程的教学目标是使学生掌握编译原理的基本概念、理论和方法,能够运用编译原理解决实际问题。
具体分为以下三个部分:1.知识目标:学生需要掌握编译原理的基本概念,包括编译器的基本结构、词法分析、语法分析、语义分析、中间代码生成、目标代码生成和优化等。
2.技能目标:学生需要具备使用编译原理解决实际问题的能力,包括能够使用编译器开发工具,进行词法分析、语法分析和语义分析等操作。
3.情感态度价值观目标:通过本课程的学习,使学生认识到编译原理在软件工程中的重要性,增强学生对计算机科学的热爱和责任感。
二、教学内容本课程的教学内容主要包括以下几个部分:1.编译器的基本结构:包括前端和后端的基本组成部分,以及它们之间的交互关系。
2.词法分析:包括词法规则的定义、词法分析器的实现和词法分析的过程。
3.语法分析:包括语法规则的定义、语法分析树的构建和语法分析的方法。
4.语义分析:包括语义规则的定义、语义分析的方法和语义分析的实现。
5.中间代码生成:包括中间代码的定义、中间代码生成的方法和中间代码优化的方法。
6.目标代码生成:包括目标代码的定义、目标代码生成的方法和目标代码优化的方法。
三、教学方法本课程采用多种教学方法,以激发学生的学习兴趣和主动性:1.讲授法:教师通过讲解编译原理的基本概念和理论,使学生掌握相关知识。
2.案例分析法:教师通过分析实际的编译器案例,使学生了解编译原理在实际中的应用。
3.实验法:学生通过动手实现编译器的基本功能,加深对编译原理的理解。
4.讨论法:学生通过分组讨论,共同解决问题,培养团队协作能力。
四、教学资源本课程的教学资源包括以下几个部分:1.教材:选用《编译原理》作为主要教材,为学生提供系统性的理论知识。
2.参考书:提供相关的参考书籍,为学生提供更多的学习资源。
3.多媒体资料:制作PPT、视频等多媒体资料,丰富课堂教学。
4.实验设备:提供计算机实验室,让学生能够实际操作编译器。
编译原理分析课程设计一、课程目标知识目标:1. 理解编译原理的基本概念,掌握编译过程的主要阶段及其功能;2. 学会使用形式语言和自动机的基本理论分析编程语言的结构;3. 掌握词法分析、语法分析、语义分析的基本方法,并能运用到实际编译器设计中;4. 了解代码生成和优化的一般方法,并能分析其效率。
技能目标:1. 能运用所学编译原理知识,对简单的编程语言进行词法、语法、语义分析;2. 掌握使用编译器生成工具,如lex、yacc等,实现一个小型编程语言的编译器;3. 培养学生独立分析和解决问题的能力,提高编程实践技能。
情感态度价值观目标:1. 激发学生对计算机科学领域的兴趣,培养其探索精神和创新意识;2. 培养学生良好的团队合作意识,使其在学习过程中学会交流、协作、分享;3. 增强学生对我国计算机事业的自豪感,激发其为我国信息技术发展贡献力量的信念。
课程性质分析:本课程为计算机科学与技术专业核心课程,旨在让学生掌握编译原理的基本知识,具备一定的编译器设计和实现能力。
学生特点分析:学生为大学三年级本科生,具备一定的编程基础和离散数学知识,对编译原理有一定了解,但实践经验不足。
教学要求:结合学生特点,注重理论与实践相结合,强调知识的应用和能力的培养,提高学生的编程实践技能和综合素质。
在教学过程中,将课程目标分解为具体的学习成果,以便于教学设计和评估。
二、教学内容1. 编译原理概述:介绍编译器的作用、编译过程及各阶段功能;- 教材章节:第1章 编译原理概述2. 编程语言与文法:分析编程语言的结构,引入文法、语法树等概念;- 教材章节:第2章 编程语言与文法3. 词法分析:讲解词法分析的基本概念,介绍词法分析器的实现方法;- 教材章节:第3章 词法分析4. 语法分析:介绍语法分析的方法,如LL(1)、LR(1)分析法;- 教材章节:第4章 语法分析5. 语义分析:讲解语义分析的作用和基本方法,如类型检查、符号表管理等;- 教材章节:第5章 语义分析6. 中间代码生成与优化:介绍中间代码生成和优化的基本方法;- 教材章节:第6章 中间代码生成与优化7. 代码生成与目标代码优化:讲解目标代码生成和优化的一般方法;- 教材章节:第7章 代码生成与目标代码优化8. 实践环节:设计并实现一个小型编程语言的编译器,涵盖词法、语法、语义分析及代码生成;- 教材章节:附录 实践环节教学内容安排与进度:共16周,每周2课时。
编译原理课程设计一、设计目的和依据编译原理是计算机科学专业的核心课程,通过学习该课程,可以使学生了解编译器的基本原理和设计方法,培养学生的编译器设计和实现能力。
本课程设计旨在通过设计一个简单的编译器,对学生掌握的编译原理知识进行实践应用,加深对编译原理的理解。
设计依据主要包括编译原理课程的教学大纲和参考教材。
二、设计内容和要求1.设计一个简单的编译器,要求实现从源程序到目标汇编语言的完整编译过程。
2.编译器要支持基本的语法解析、语义分析和代码生成功能。
3.编译器要求能够把源程序编译成可执行的目标程序,能够在特定的计算机系统上运行。
三、设计步骤和方法1.确定语言和文法:选择一种简单的高级程序设计语言作为源语言,设计对应的文法。
例如,可以选择类C语言作为源语言,设计相应的文法规则。
2.构建词法分析器:根据语言的词法规则,设计并实现词法分析器,将源程序分割成一系列的单词符号。
3.设计语法解析器:根据文法规则,设计并实现语法解析器,将词法分析器输出的单词流转化为语法树。
4.进行语义分析:根据语义规则,对语法树进行语义分析,并生成中间代码。
5.进行代码生成:根据目标机器的特点,设计并实现代码生成器,将中间代码翻译成目标机器的汇编语言。
6.进行代码优化:对生成的目标代码进行优化,提高代码的运行效率。
7.进行目标代码的装配:将生成的目标代码和运行库函数进行链接,生成可执行的目标程序。
四、实施过程和方案1.使用合适的编程语言和工具进行实现:可以选择使用C/C++等传统的编程语言进行实现,也可以使用较新的编程语言如Python等。
同时,可以借助工具如LEX/YACC等进行词法分析和语法解析器的实现。
2.设计合适的数据结构和算法:设计合理的数据结构和算法,提高编译器的效率和性能。
如采用符号表、语法树、中间代码等数据结构来辅助编译器的实现。
3.进行测试和调试:在实现过程中,要进行充分的测试和调试,保证编译器的正确性和可靠性。
郑州轻工业学院课程设计说明书题目:编译器姓名:孙雪平院(系):计算机与通信工程学院专业班级:计算机科学与技术学号:541007010135指导教师:马吉明成绩:时间:2013年6月17 日至2013 年 6 月21日郑州轻工业学院课程设计任务书题目编译器专业、班级计科10-01 学号 541007010135 姓名孙雪平主要内容、基本要求、主要参考资料等:内容:将词法、语法、代码生成等实验组合成一个大的编译程序基本要求:1、词法分析器产生小语言单词序列。
2、语法分析器能识别+、-、*、/等操作数组成的表达式。
3、中间代码生成器,产生上述表达式产生的中间代码(四元式)。
4、编写完整的代码,达到理想的目的。
主要参考资料:编译原理第三版刘铭徐兰芳骆婷编完成期限:2013 年6 月21日指导教师签名:课程负责人签名:年月日目录1. 实验原理 (2)1.1. 简介 (2)1.2. 单词符号及种别表示 (2)1.3. 语法结构定义 (3)2. 运行环境 (4)3. 算法设计思想 (4)3.1. 词法分析算法思想 (4)3.2. 语法分析算法思想 (4)3.3. 语义分析和中间代码生成算法思想 (4)4. 程序流程图 (5)4.1. 主函数流程图 (5)4.2. 递归下降分析程序流程 (6)4.3. 语句块分析流程图 (7)4.4. 语句串分析流程图 (7)4.5. 语句分析流程图 (8)5. 心得体会 (8)6. 运行结果 (8)7. 源代码 (13)1.实验原理1.1.简介编译程序是一种翻译程序,它将高级语言所写的源程序翻译成等价的机器语言或汇编语言的目标程序。
编译程序是将一种语言形式翻译成另一种语言形式,因此其工作过程一般可划分为5个基本阶段:词法分析、语法分析、语义分析及中间代码生成、代码优化和目标代码生成。
1.2.单词符号及种别表示1.3.语法结构定义<程序> ::= main()<语句块><语句块> ::= ‘{‘<语句串>’}’//程序用括号括起来<语句串>::=<语句>{;<语句>};<语句>::=<赋值语句>|<条件语句>|<循环语句><赋值语句>::=ID=<表达式> //赋值语句用”=”号<条件语句>::=if<条件><语句块> //条件怎么没有括号,囧(自己加1个)<循环语句>::=do <语句块>while <条件><条件>::=<表达式><关系运算符><表达式> //没有布尔运算,还算简单<表达式> ::= <项>{ +<项>|-<项>}<项> ::= <因子>{*<因子>|/<因子>}<因子> ::=ID|num|(<表达式>)num::= ( +|-|ε) 数字*(.数字数字* | ε)( e ( +|-|ε) 数字数字*|ε)ID::=字母(字母|d数字)*字母::=a|b|c…|z|A|B|C…|Z数字::=0|1|2…|9<关系运算符> ::= <|<=|>|>=|==|!=2.运行环境Windows 系统Visual C++ 6.03.算法设计思想3.1.词法分析算法思想这部分对源文件进行分析,允许/* */注释。
从源文件依次读取字符,对字符进行分析,组成字符串、数字、关系符等固定含义的token符,并把它们添加到token链中,如果遇到非法字符报错并退出程序。
3.2.语法分析算法思想这部分对Token链进行分析,利用自底向上的分析方法,构建SLR(1)分析表的过程是手工完成的。
语法分析的同时构建语法树,移进时创建叶子,规约时创建节点。
3.3.语义分析和中间代码生成算法思想这部分对语法树从左到右进行遍历,节点记录了规约式的编号,遍历到节点时就进行相应处理。
语义分析主要检查变量、函数是否被定义或重定义,同时产生四元式。
4.程序流程图4.1.主函数流程图4.2.递归下降分析程序流程4.3.语句块分析流程图4.4.语句串分析流程图4.5.语句分析流程图5.心得体会这次的课程设计,最大的收获就是清楚了编译的整个过程,在学习编译原理这门课程之时,在做设计的过程中和词法分析、语法分析、语义分析联系起来, 非常清晰的理解了简单编译器实现过程。
读完了一个完整的源程序,知道了它里面的功能模快以及结构组织,也明白了编译的基本原理.。
在实验中加深了在课堂上说学到编译原理知识的理解,实验中实践了书本上的知识和原理。
通过这次课程设计也使我认识到自己的不足。
首先这些代码我并不能独立完成,而是在网上查阅了大量资料,以及在许多同学的帮助下才完成的。
其次平时对编译原理的各个部分理解的不错,平时实验做的也还可以,只是在做这次的课程设计的时候需要把整个编译的过程整体的思路搞清楚。
通过看以前的笔记和课本,我了解了各个阶段间的连接,最终使得本次课程设计的顺利完成。
6.运行结果1.输出源文件路径2.输出保留字3.输出符号表的内容5.输出语法分析的结果(本程序采用自上而下的LR分析法)6.输出中间代码7.输出目标代码7.源代码#include<cstdio>#include<iostream>#include<cstdlib>#include<fstream>#include<string>#include<cmath>using namespace std;struct token//词法token结构体{int code;//编码int num;//递增编号token *next;};token *token_head,*token_tail;//token队列struct str//词法string结构体{int num;//编号string word;//字符串内容str *next;};str *string_head,*string_tail;//string队列struct ivan//语法产生式结构体{char left;//产生式的左部string right;//产生式的右部int len;//产生式右部的长度};ivan css[20];//语法20个产生式struct pank//语法action表结构体{char sr;//移进或归约int state;//转到的状态编号};pank action[46][18];//action表int go_to[46][11];//语法go_to表struct ike//语法分析栈结构体,双链{ike *pre;int num;//状态int word;//符号编码ike *next;};ike *stack_head,*stack_tail;//分析栈首尾指针struct L//语义四元式的数据结构{int k;string op;//操作符string op1;//操作数string op2;//操作数string result;//结果L *next;//语义四元式向后指针L *Ltrue;//回填true链向前指针L *Lfalse;//回填false链向前指针};L *L_four_head,*L_four_tail,*L_true_head,*L_false_head;/*四元式链,true链,false链*/ struct symb//语义输入时符号表{string word;//变量名称int addr;//变量地址symb *next;};symb *symb_head,*symb_tail;//语义符号链表////////////////////////////////词法分析有关函数声明void outdaima() ;void scan();//按字符读取源文件void cifa_main();//词法分析主程序int judge(char ch);//判断输入字符的类型void out1(char ch);//写入token.txtvoid out3(char ch,string word);//写入string.txtvoid input1(token *temp);//插入结点到队列tokenvoid input3(str *temp);//插入结点到队列stringvoid output();//输出三个队列的内容void outfile();//输出三个队列的内容到相应文件中////////////////////////////////语法分析有关函数声明void yufa_main();//语法分析主程序void yufa_initialize();//初始化语法分析数据结构int yufa_SLR1(int a);//语法分析主体部分int ID1(int a);//给输入字符编号,转化成action表列编号string ID10(int i);//给输入字符反编号int ID2(char ch);//给非终结状态编号,转化成go_to表列编号int ID20(char ch);//给非终结状态编号char ID21(int j);//给非终结状态反编号void add(ike *temp);//给ike分析栈链表增加一个结点void del();//给ike分析栈链表删除一个结点/////////////////////////////////语义分析相关函数的声明void yuyi_main(int m);//语义分析主程序void add_L_four(L *temp);//向四元式链中加一个结点void add_L_true(L *temp);//向true链中加一个结点void add_L_false(L *temp);//向false链中加一个结点void add_symb(symb *temp);//向语义符号表链中加一个结点void output_yuyi();//输出中间代码四元式和最后符号表string newop(int m);//把数字变成字符串string id_numtoname(int num);//把编号转换成相应的变量名int lookup(string m);//变量声明检查/////////////////////////////////全局变量的声明FILE *fp;//文件指针int wordcount;//标志符计数int err;//标志词法分析结果正确或错误int nl;//读取行数int yuyi_linshi;//语义临时变量string E_name,T_name,F_name,M_name,id_name,id1_name,id2_name,errword;//用于归约时名称传递和未声明变量的输出int id_num,id1_num,id2_num,id_left,id_while,id_then,id_do;//用于记录一些特殊的字符位置信息////////////////////////////////主程序开始int main(){cout<<"************************"<<endl;cout<<"* 说明:*"<<endl;cout<<"* 第一部分:词法分析*"<<endl;cout<<"* 第二部分:语法分析*"<<endl;cout<<"* 第三部分:语义分析*"<<endl;cout<<"* 第四部分:目标代码生成*"<<endl;cout<<"************************"<<endl;cifa_main();//词法yufa_main();//语法output_yuyi();//语义outdaima(); //代码生成cout<<endl;system("pause");return(0);}//////////////////////////////////词法分析子程序void cifa_main(){token_head=new token;token_head->next=NULL;token_tail=new token;token_tail->next=NULL;string_head=new str;string_head->next=NULL;string_tail=new str;string_tail->next=NULL;//初始化三个队列的首尾指针L_four_head=new L;L_four_head->next=NULL;L_four_tail=new L;L_four_tail->k=0;L_four_tail->next=NULL;L_true_head=new L;L_true_head->Ltrue=NULL;L_false_head=new L;L_false_head->Lfalse=NULL;symb_head=new symb;symb_head->next=NULL;symb_tail=new symb;symb_tail->next=NULL;yuyi_linshi=-1;id_num=0;wordcount=0;//初始化字符计数器err=0;//初始化词法分析错误标志nl=1;//初始化读取行数scan();if(err==0){char m;output();cout<<"词法分析正确完成!"<<endl<<endl<<"如果将结果保存到文件中请输入y ,否则请输入其它字母:";cin>>m;cout<<endl;if(m=='y'){outfile();cout<<"结果成功保存在token.txt和sting.txt两个文件中,请打开查看"<<endl;cout<<endl;}}}void scan(){cout<<endl;system("pause");cout<<endl;char ch;string word;char document[50];int flag=0;cout<<"请输入源文件路径及名称:";cin>>document;cout<<endl;cout<<"************************"<<endl;cout<<"* 第一部分:词法分析*"<<endl;cout<<"************************"<<endl;if((fp=fopen(document,"rt"))==NULL){err=1;cout<<"无法找到该文件!"<<endl;return;}while(!feof(fp)){word="";ch=fgetc(fp);flag=judge(ch);if(flag==1)out1(ch);else if(flag==3)out3(ch,word);else if(flag==4 || flag==5 ||flag==6)continue;else{cout<<nl<<"行"<<"错误:非法字符! "<<ch<<endl;err=1;}}fclose(fp);}int judge(char ch){int flag=0;if(ch=='=' || ch=='+' || ch=='*' || ch=='>' || ch==':' || ch==';' || ch=='{' || ch=='}' || ch=='(' || ch==')')flag=1;//界符else if(('a'<=ch && ch<='z') || ('A'<=ch && ch<='Z'))flag=3;//字母else if(ch==' ')flag=4;//空格else if(feof(fp))flag=5;//结束else if(ch=='\n'){flag=6;//换行nl++;}elseflag=0;//非法字符return(flag);}void out1(char ch){int id;switch(ch){case '=' : id=1;break;case '+' : id=2;break;case '*' : id=3;break;case '>' : id=4;break;case ':' : id=5;break;case ';' : id=6;break;case '{' : id=7;break;case '}' : id=8;break;case '(' : id=9;break;case ')' : id=10;break;//界符编码default : id=0;}token *temp;temp=new token;temp->code=id;temp->num=-1;temp->next=NULL;input1(temp);return;}void out3(char ch,string word){token *temp;temp=new token;temp->code=-1;temp->num=-1;temp->next=NULL;str *temp1;temp1=new str;temp1->num=-1;temp1->word="";temp1->next=NULL;int flag=0;word=word+ch;ch=fgetc(fp);flag=judge(ch);if(flag==1 || flag==4 || flag==5 || flag==6){if(word=="and" || word=="if" || word=="then" || word=="while" || word=="do" || word=="int"){if(word=="and")temp->code=31;else if(word=="if")temp->code=32;else if(word=="then")temp->code=33;else if(word=="while")temp->code=35;else if(word=="do")temp->code=36;else if(word=="int")temp->code=37;//关键字编码input1(temp);if(flag==1)out1(ch);else if(flag==4 || flag==5 || flag==6)return;}else if(flag==1){wordcount++;temp->code=25;temp->num=wordcount;input1(temp);temp1->num=wordcount;temp1->word=word;input3(temp1);out1(ch);}else if(flag==4 || flag==5 || flag==6){wordcount++;temp->code=25;temp->num=wordcount;input1(temp);temp1->num=wordcount;temp1->word=word;input3(temp1);}return;}else if(flag==2 || flag==3)out3(ch,word);//形成字符串else{err=1;cout<<nl<<"行"<<"错误:非法字符! "<<ch<<endl;return;}}void input1(token *temp){if(token_head->next == NULL){token_head->next=temp;token_tail->next=temp;}else{token_tail->next->next=temp;token_tail->next=temp;}}void input3(str *temp){if(string_head->next == NULL){string_head->next=temp;string_tail->next=temp;}else{string_tail->next->next=temp;string_tail->next=temp;}}void output(){cout<<"token表内容如下:"<<endl;token *temp1;temp1=new token;temp1=token_head->next;while(temp1!=NULL){cout<<temp1->code;if(temp1->num == -1){cout<<endl;}else{cout<<" "<<temp1->num<<endl;}temp1=temp1->next;}cout<<"符号表内容如下:"<<endl;str *temp3;temp3=new str;temp3=string_head->next;while(temp3!=NULL){cout<<temp3->num<<" "<<temp3->word<<endl;temp3=temp3->next;}}void outfile(){ofstream fout1("token.txt");//写文件ofstream fout3("string.txt");token *temp1;temp1=new token;temp1=token_head->next;while(temp1!=NULL){fout1<<temp1->code;if(temp1->num == -1)fout1<<endl;elsefout1<<" "<<temp1->num<<endl;temp1=temp1->next;}str *temp3;temp3=new str;temp3=string_head->next;while(temp3!=NULL){fout3<<temp3->num<<" "<<temp3->word<<endl;temp3=temp3->next;}}/////////////////////////////////////////语法分析子程序void yufa_main(){if(err==0){system("pause");cout<<endl;cout<<"************************"<<endl;cout<<"* 第二部分:语法分析*"<<endl;cout<<"************************"<<endl;yufa_initialize();//初始化语法分析数据结构token *temp;temp=new token;temp=token_head->next;int p,q;p=0;q=0;cout<<"语法分析过程如下:"<<endl;while(temp!=NULL){int w;w=ID1(temp->code);p=yufa_SLR1(w);if(p==1) break;if(p==0)temp=temp->next;if(temp==NULL) q=1;}//语法分析if(q==1)while(1){p=yufa_SLR1(17);if(p==3) break;}//最后输入$来完成语法分析}}void yufa_initialize(){stack_head=new ike;stack_tail=new ike;stack_head->pre=NULL;stack_head->next=stack_tail;stack_head->num=0;stack_head->word='!';stack_tail->pre=stack_head;stack_tail->next=NULL;//初始化栈分析链表css[0].left='Q';css[0].right="P";css[1].left='P';css[1].right="id()L;R";css[2].left='L';css[2].right="L;D";css[3].left='L';css[3].right="D";css[4].left='D';css[4].right="id:int";css[5].left='E';css[5].right="E+T";css[6].left='E';css[6].right="T";css[7].left='T';css[7].right="T*F";css[8].left='T';css[8].right="F";css[9].left='F';css[9].right="(E)";css[10].left='F';css[10].right="id";css[11].left='B';css[11].right="B and B";css[12].left='B';css[12].right="id>id";css[13].left='M';css[13].right="id=E";css[14].left='S';css[14].right="if B then M";css[15].left='S';css[15].right="while B do M";css[16].left='S';css[16].right="M";css[17].left='N';css[17].right="N;S";css[18].left='N';css[18].right="S";css[19].left='R';css[19].right="{N}";int i,j;for(i=0;i<20;i++){char *css_len;css_len=&css[i].right[0];css[i].len=strlen(css_len);}css[1].len=6;css[4].len=3;css[10].len=1;css[11].len=3;css[12].len=3;css[13].len=3;css[14].len=4;css[15].len=4;//初始化产生式for(i=0;i<46;i++){for(j=0;j<18;j++)action[i][j].sr='#';}//初始化action表for(i=0;i<46;i++){for(j=0;j<11;j++)go_to[i][j]=-1;}//初始化go_to表/****************************以下是给action表和go_to表赋初值************************/action[0][0].sr='s';action[0][0].state=2;action[1][17].sr='@';//结束action[2][1].sr='s';action[2][1].state=3;action[3][2].sr='s';action[3][2].state=4;action[4][0].sr='s';action[4][0].state=5;action[5][4].sr='s';action[5][4].state=6;action[6][11].sr='s';action[6][11].state=7;action[7][3].sr='r';action[7][3].state=4;action[8][3].sr='r';action[8][3].state=3;action[9][3].sr='s';action[9][3].state=10;action[10][0].sr='s';action[10][0].state=5;action[10][9].sr='s';action[10][9].state=13;action[11][17].sr='r';action[11][17].state=1;action[12][3].sr='r';action[12][3].state=2;action[13][0].sr='s';action[13][0].state=14;action[13][13].sr='s';action[13][13].state=23;action[13][15].sr='s';action[13][15].state=27;action[14][8].sr='s';action[14][8].state=15;action[15][0].sr='s';action[15][0].state=36;action[15][1].sr='s';action[15][1].state=41;action[16][6].sr='s';action[16][6].state=43;action[16][3].sr='r';action[16][3].state=13;action[16][10].sr='r';action[16][10].state=13;action[17][3].sr='s';action[17][3].state=19;action[17][10].sr='s';action[17][10].state=18;action[18][17].sr='r';action[18][17].state=19;action[19][0].sr='s';action[19][0].state=14;action[19][13].sr='s';action[19][13].state=23;action[19][15].sr='s';action[19][15].state=27;action[20][3].sr='r';action[20][3].state=17;action[20][10].sr='r';action[20][10].state=17;action[21][3].sr='r';action[21][3].state=18;action[21][10].sr='r';action[21][10].state=18;action[22][3].sr='r';action[22][3].state=16;action[22][10].sr='r';action[22][10].state=16;action[23][0].sr='s';action[23][0].state=31;action[24][12].sr='s';action[24][12].state=34;action[24][14].sr='s';action[24][14].state=25;action[25][0].sr='s';action[25][0].state=14;action[26][3].sr='r';action[26][3].state=14;action[26][10].sr='r';action[26][10].state=14;action[27][0].sr='s';action[27][0].state=31;action[28][12].sr='s';action[28][12].state=34;action[28][16].sr='s';action[28][16].state=29; action[29][0].sr='s';action[29][0].state=14; action[30][3].sr='r';action[30][3].state=15; action[30][10].sr='r';action[30][10].state=15; action[31][7].sr='s';action[31][7].state=32; action[32][0].sr='s';action[32][0].state=33; action[33][12].sr='r';action[33][12].state=12; action[33][14].sr='r';action[33][14].state=12; action[33][16].sr='r';action[33][16].state=12; action[34][0].sr='s';action[34][0].state=31; action[35][12].sr='r';action[35][12].state=11; action[35][14].sr='r';action[35][14].state=11; action[35][16].sr='r';action[35][16].state=11; action[36][2].sr='r';action[36][2].state=10; action[36][3].sr='r';action[36][3].state=10; action[36][5].sr='r';action[36][5].state=10; action[36][6].sr='r';action[36][6].state=10; action[36][10].sr='r';action[36][10].state=10; action[37][2].sr='r';action[37][2].state=8; action[37][3].sr='r';action[37][3].state=8; action[37][5].sr='r';action[37][5].state=8; action[37][6].sr='r';action[37][6].state=8; action[37][10].sr='r';action[37][10].state=8; action[38][2].sr='r';action[38][2].state=6; action[38][3].sr='r';action[38][3].state=6; action[38][5].sr='s';action[38][5].state=39; action[38][6].sr='r';action[38][6].state=6; action[38][10].sr='r';action[38][10].state=6; action[39][0].sr='s';action[39][0].state=36; action[39][1].sr='s';action[39][1].state=41; action[40][2].sr='r';action[40][2].state=7; action[40][3].sr='r';action[40][3].state=7; action[40][5].sr='r';action[40][5].state=7; action[40][6].sr='r';action[40][6].state=7; action[40][10].sr='r';action[40][10].state=7; action[41][0].sr='s';action[41][0].state=36; action[41][1].sr='s';action[41][1].state=41; action[42][2].sr='s';action[42][2].state=45; action[42][6].sr='s';action[42][6].state=43; action[43][0].sr='s';action[43][0].state=36; action[43][1].sr='s';action[43][1].state=41; action[44][2].sr='r';action[44][2].state=5; action[44][3].sr='r';action[44][3].state=5; action[44][5].sr='s';action[44][5].state=39;action[44][6].sr='r';action[44][6].state=5;action[44][10].sr='r';action[44][10].state=5;action[45][2].sr='r';action[45][2].state=9;action[45][3].sr='r';action[45][3].state=9;action[45][5].sr='r';action[45][5].state=9;action[45][6].sr='r';action[45][6].state=9;action[45][10].sr='r';action[45][10].state=9;go_to[0][0]=1;go_to[4][1]=8;go_to[4][9]=9;go_to[10][1]=12;go_to[10][2]=11;go_to[13][7]= 22;go_to[13][8]=21;go_to[13][10]=17;go_to[15][3]=16;go_to[15][4]=38;go_to[15][5]=37;go_to[19][7]=20;go_to[19][8]=20;go_to[ 23][6]=24;go_to[25][7]=26;go_to[27][6]=28;go_to[29][7]=30;go_to[34][6]=35;go_to[39][5]=40;go_to[41][3]=42;go_to[41][4]=38;go_to[ 41][5]=37;go_to[43][4]=44;go_to[43][5]=37;/****************************action表和go_to表赋初值完毕************************/}int ID1(int i)//按action表,给输入字符编号{int j;j=-1;if(i==25) {j=0;id_num++;}//设置变量名称标志if(i==1) {j=8,id_left=id_num;}//设置产生试左边变量名称标志if(i==2) j=6;if(i==3) j=5;if(i==4) j=7;if(i==5) j=4;if(i==6) j=3;if(i==7) j=9;if(i==8) j=10;if(i==9) j=1;if(i==10) j=2;if(i==31) j=12;if(i==32) j=13;if(i==33) {j=14;id_then=L_four_tail->k+1;}//设置if语句中then位置标志if(i==35) {j=15;id_while=L_four_tail->k+1;}//设置while语句中while位置标志if(i==36) {j=16;id_do=L_four_tail->k+1;}//设置while语句中do位置标志if(i==37) j=11;return(j);}string ID10(int i)//反编号输入字符{string ch;if(i==0) ch="id";if(i==1) ch="(";if(i==2) ch=")";if(i==3) ch=";";if(i==4) ch=":";if(i==5) ch="*";if(i==6) ch="+";if(i==7) ch=">";if(i==8) ch="=";if(i==9) ch="{";if(i==10) ch="}";if(i==11) ch="int";if(i==12) ch="and";if(i==13) ch="if";if(i==14) ch="then";if(i==15) ch="while";if(i==16) ch="do";if(i==17) ch="$";return(ch);}int ID2(char ch)//按go_to表给非终结符编号{int j;j=-1;if(ch=='P') j=0;if(ch=='D') j=1;if(ch=='R') j=2;if(ch=='E') j=3;if(ch=='T') j=4;if(ch=='F') j=5;if(ch=='B') j=6;if(ch=='M') j=7;if(ch=='S') j=8;if(ch=='L') j=9;if(ch=='N') j=10;return(j);}int ID20(char ch)//给非终结符编号{int j;j=-1;if(ch=='P') j=100;if(ch=='D') j=101;if(ch=='R') j=102;if(ch=='E') j=103;if(ch=='T') j=104;if(ch=='F') j=105;if(ch=='B') j=106;if(ch=='M') j=107;if(ch=='S') j=108;if(ch=='L') j=109;if(ch=='N') j=1010;return(j);}char ID21(int j)//反编号非终结符{char ch;if(j==100 || j==0) ch='P';if(j==101 || j==1) ch='D';if(j==102 || j==2) ch='R';if(j==103 || j==3) ch='E';if(j==104 || j==4) ch='T';if(j==105 || j==5) ch='F';if(j==106 || j==6) ch='B';if(j==107 || j==7) ch='M';if(j==108 || j==8) ch='S';if(j==109 || j==9) ch='L';if(j==1010 || j==10) ch='N';return(ch);}void add(ike *temp)//加一个结点{if(stack_head->next==stack_tail){temp->pre=stack_head;temp->next=stack_tail;stack_head->next=temp;stack_tail->pre=temp;}else{temp->pre=stack_tail->pre;temp->next=stack_tail;stack_tail->pre->next=temp;stack_tail->pre=temp;}}void del()//删除一个结点{stack_tail->pre->pre->next=stack_tail;stack_tail->pre=stack_tail->pre->pre;}int yufa_SLR1(int w){/*cout<<"当前输入符号:"<<ID10(w)<<" ";*/int i,flag=0,state_temp;//flag错误标志,0正常移进,1错误,2归约,3结束char sr_temp;sr_temp=action[stack_tail->pre->num][w].sr;//动作state_temp=action[stack_tail->pre->num][w].state;//状态变化if(sr_temp=='#')//错误动作{flag=1;err=3;cout<<"语法分析出错!"<<endl;}else if(sr_temp=='s')//移进动作{ike *temp;temp=new ike;temp->next=NULL;temp->pre=NULL;temp->word=w;temp->num=state_temp;add(temp);cout/*<<"动作(移进):"*/<<sr_temp<<state_temp<<" "/*<<"状态转为:"<<stack_tail->pre->num<<" "<<"栈顶符号:"<<ID10(stack_tail->pre->word)*/<<endl;flag=0;}else if(sr_temp=='r')//归约动作{int p=ID2(css[state_temp].left);int q=css[state_temp].len;for(i=0;i<q;i++)del();ike *temp;temp=new ike;temp->next=NULL;temp->pre=NULL;temp->word=ID20(css[state_temp].left);temp->num=go_to[stack_tail->pre->num][p];//查go_to表add(temp);cout/*<<"动作(归约):"*/<<sr_temp<<state_temp<<" "<<css[state_temp].left<<"→"<<css[state_temp].right<<" "/*<<"状态转为:"<<stack_tail->pre->num<<" "<<"栈顶符号:"<<ID21(stack_tail->pre->word)*/<<endl;flag=2;yuyi_main(state_temp);//在产生树的同时进行语义分析}else if(sr_temp=='@')//结束动作{cout<<"END"/*<<"动作(归约):"<<sr_temp<<state_temp*/<<" "<<css[state_temp].left<<"→"<<css[state_temp].right<<" "/*<<"状态转为:"<<stack_tail->pre->num<<" "<<"栈顶符号:"<<ID21(stack_tail->pre->word)*/<<endl;flag=3;cout<<"语法分析正确完成!"<<endl;}else//其他意外情况{flag=1;err=3;cout<<"语法分析出错!"<<endl;}return(flag);}/////////////////////////////////////////语义分析子程序void yuyi_main(int m){L *temp;int k;k=1;temp=new L;temp->op=" ";temp->op1=" ";temp->op2=" ";temp->result="";temp->next=NULL;temp->Ltrue=NULL;temp->Lfalse=NULL;if(m==4)//变量声明时加入符号表链{symb *Stemp;Stemp=new symb;id_name=id_numtoname(id_num);Stemp->word=id_name;Stemp->next=NULL;add_symb(Stemp);if(m==5)//归约E→E+T{temp->op="+";temp->op1=E_name;temp->op2=T_name;yuyi_linshi++;//申请临时变量E_name="t"+newop(yuyi_linshi);temp->result=E_name;add_L_four(temp);//加一个四元式结点}if(m==6)//归约E→T{E_name=T_name;}if(m==7)//归约T→T*F{temp->op="*";temp->op1=T_name;temp->op2=F_name;yuyi_linshi++;//申请临时变量T_name="t"+newop(yuyi_linshi);temp->result=T_name;add_L_four(temp);//加一个四元式结点}if(m==8)//归约T→F{T_name=F_name;}if(m==9)//归约F→(E){F_name=E_name;}if(m==10)//归约F→id{id_name=id_numtoname(id_num);F_name=id_name;k=lookup(id_name);//检查变量是否声明if(k==0){err=2;errword=id_name;return;}if(m==12)//归约B→id>id{temp->op="J>";id1_num=id_num-1;id1_name=id_numtoname(id1_num);k=lookup(id1_name);//检查变量是否声明if(k==0){err=2;errword=id1_name;return;}id2_num=id_num;id2_name=id_numtoname(id2_num);k=lookup(id2_name);//检查变量是否声明if(k==0){err=2;errword=id2_name;return;}temp->result="-1";temp->op1=id1_name;temp->op2=id2_name;add_L_four(temp);//加一个四元式结点add_L_true(temp);//加一个true链结点L *temp2;temp2=new L;temp2->op="J";temp2->op1=" ";temp2->op2=" ";temp2->result="-1";add_L_four(temp2);//加一个四元式结点add_L_false(temp2);//加一个false链结点}if(m==13)//归约M→id=E{temp->op="=";temp->op1=E_name;temp->op2=" ";id_name=id_numtoname(id_left);temp->result=id_name;add_L_four(temp);//加一个四元式结点。