编译原理课程设计

合集下载

编译原理编译器课程设计

编译原理编译器课程设计

编译原理编译器课程设计一、课程目标知识目标: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.源程序的词法分析、语法分析和语义分析的基本方法;3.编译器的基本结构和工作原理;4.简单程序的编译实例。

三、教学方法为了达到本节课的教学目标,将采用以下几种教学方法:1.讲授法:通过讲解编译原理的基本概念、编译过程和编译器的基本结构,使学生掌握相关知识。

2.案例分析法:通过分析具体程序的编译过程,使学生理解和掌握词法分析、语法分析和语义分析的方法。

3.实验法:让学生亲自使用编译器进行程序设计,提高学生的实际操作能力。

四、教学资源为了支持本节课的教学内容和教学方法的实施,将准备以下教学资源:1.教材:《编译原理》;2.参考书:相关编译原理的专著和论文;3.多媒体资料:关于编译原理的PPT、视频等;4.实验设备:计算机和编译器。

五、教学评估为了全面、公正地评估学生在编译原理课程中的学习成果,将采用以下几种评估方式:1.平时表现:通过观察学生在课堂上的参与程度、提问回答等情况,评估学生的学习态度和理解程度;2.作业:布置与课程内容相关的编程作业,评估学生的实际操作能力和对知识的掌握程度;3.考试:进行期中考试和期末考试,评估学生对课程知识的全面理解和运用能力。

六、教学安排本学期的编译原理课程安排如下:1.教学进度:按照教材《编译原理》的章节顺序进行教学,确保每个章节都有足够的时间进行讲解和讨论;2.教学时间:每周两节课,每节课45分钟,共计18周;3.教学地点:计算机实验室,以便学生进行实验和实践。

编译原理课程设计步骤

编译原理课程设计步骤

编译原理课程设计步骤一、教学目标本课程旨在让学生掌握编译原理的基本概念、理论和方法,培养学生运用编译原理解决实际问题的能力。

具体目标如下:1.知识目标:(1)了解编译原理的基本概念和组成部分;(2)掌握源程序的分析、语法分析、语义分析、中间代码生成、目标代码生成等基本过程;(3)熟悉编译器的优化技术和实现方法。

2.技能目标:(1)能够使用编译原理相关工具和框架进行程序设计;(2)具备阅读和理解编译器源代码的能力;(3)具备编写简单编译器的能力。

3.情感态度价值观目标:(1)培养学生的抽象思维和逻辑推理能力;(2)培养学生的问题解决能力和创新意识;(3)培养学生团队合作精神和良好的编程习惯。

二、教学内容本课程的教学内容主要包括以下几个部分:1.编译原理概述:编译器的定义、功能、分类和组成部分;2.词法分析:词法规则、词法分析器的设计与实现;3.语法分析:语法规则、语法分析树、分析算法(递归下降分析、LL分析、LR分析等);4.语义分析:类型检查、 symbol table、语义错误处理;5.中间代码生成:三地址码、静态单赋值代码等;6.目标代码生成:机器码生成、优化技术;7.编译器实现:编译器框架、代码调试与优化。

三、教学方法本课程采用讲授法、讨论法、案例分析法和实验法等多种教学方法,以激发学生的学习兴趣和主动性。

1.讲授法:用于讲解编译原理的基本概念、理论和方法;2.讨论法:引导学生针对编译原理中的重点、难点问题进行讨论,提高学生的思维能力和问题解决能力;3.案例分析法:分析实际编译器案例,让学生了解编译原理在实际应用中的作用;4.实验法:让学生动手编写代码,体验编译原理的实际操作过程。

四、教学资源本课程所需教学资源包括:1.教材:《编译原理》(作者: Alfred V. Aho et al.);2.参考书:《现代编译原理》(作者:Andrew W. Appel);3.多媒体资料:课件、教学视频;4.实验设备:计算机、编程环境。

《编译原理》课程设计

《编译原理》课程设计

《编译原理》课程设计一、课程目标知识目标: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. 使学生熟悉编译过程中的词法分析、语法分析、语义分析、中间代码生成和目标代码生成等关键环节。

3. 帮助学生掌握常用的编译技术、算法和数据结构,提高编程实践能力。

技能目标:1. 培养学生运用形式语言和自动机理论对程序语言进行分析的能力。

2. 培养学生设计和实现简单编译器的能力,具备一定的编译器优化技巧。

3. 提高学生运用编译原理解决实际问题的能力,如编写解释器、静态分析工具等。

情感态度价值观目标:1. 培养学生严谨的科学态度,对编译原理和技术产生浓厚兴趣。

2. 培养学生的团队协作意识,学会与他人共同分析问题、解决问题。

3. 使学生认识到编译技术在国家战略、信息技术发展中的地位和作用,增强学生的社会责任感和使命感。

本课程针对哈尔滨工程大学计算机专业高年级学生,课程性质为专业核心课程。

结合学生特点和教学要求,课程目标旨在帮助学生系统掌握编译原理知识,提高编程实践能力,培养严谨的科学态度和团队协作精神。

通过本课程的学习,使学生能够独立设计和实现简单的编译器,具备进一步深入研究编译技术的坚实基础。

二、教学内容1. 编译原理概述:介绍编译器的作用、编译过程的基本概念,以及编译技术在我国的发展现状。

相关教材章节:第1章 编译原理概述2. 词法分析:讲解词法分析的任务、词法分析器的设计,以及正则表达式和有限自动机等基本概念。

相关教材章节:第2章 词法分析3. 语法分析:介绍语法分析的任务、语法分析器的设计,以及LL(1)、LR(1)等语法分析方法。

相关教材章节:第3章 语法分析4. 语义分析:讲解语义分析的任务、语义分析器的设计,以及类型检查、符号表等关键技术。

相关教材章节:第4章 语义分析5. 中间代码生成和目标代码生成:介绍中间代码的表示、目标代码生成方法,以及代码优化技术。

编译原理课程设计

编译原理课程设计

编译原理课程设计一、设计目的和依据编译原理是计算机科学专业的核心课程,通过学习该课程,可以使学生了解编译器的基本原理和设计方法,培养学生的编译器设计和实现能力。

本课程设计旨在通过设计一个简单的编译器,对学生掌握的编译原理知识进行实践应用,加深对编译原理的理解。

设计依据主要包括编译原理课程的教学大纲和参考教材。

二、设计内容和要求1.设计一个简单的编译器,要求实现从源程序到目标汇编语言的完整编译过程。

2.编译器要支持基本的语法解析、语义分析和代码生成功能。

3.编译器要求能够把源程序编译成可执行的目标程序,能够在特定的计算机系统上运行。

三、设计步骤和方法1.确定语言和文法:选择一种简单的高级程序设计语言作为源语言,设计对应的文法。

例如,可以选择类C语言作为源语言,设计相应的文法规则。

2.构建词法分析器:根据语言的词法规则,设计并实现词法分析器,将源程序分割成一系列的单词符号。

3.设计语法解析器:根据文法规则,设计并实现语法解析器,将词法分析器输出的单词流转化为语法树。

4.进行语义分析:根据语义规则,对语法树进行语义分析,并生成中间代码。

5.进行代码生成:根据目标机器的特点,设计并实现代码生成器,将中间代码翻译成目标机器的汇编语言。

6.进行代码优化:对生成的目标代码进行优化,提高代码的运行效率。

7.进行目标代码的装配:将生成的目标代码和运行库函数进行链接,生成可执行的目标程序。

四、实施过程和方案1.使用合适的编程语言和工具进行实现:可以选择使用C/C++等传统的编程语言进行实现,也可以使用较新的编程语言如Python等。

同时,可以借助工具如LEX/YACC等进行词法分析和语法解析器的实现。

2.设计合适的数据结构和算法:设计合理的数据结构和算法,提高编译器的效率和性能。

如采用符号表、语法树、中间代码等数据结构来辅助编译器的实现。

3.进行测试和调试:在实现过程中,要进行充分的测试和调试,保证编译器的正确性和可靠性。

编译原理课程设计

编译原理课程设计
编译原理课程设计
2010年3月
目 设 遵 明 设 一 法 培 掌 现 “ 通
的 计 循 确 立 次 ; 养 握 技 编 过
、基 分 开 真
大 ;术译实
编本 工 发 正

”程际
码的 、 小 的

更序设
、软 协 组 实

进的计
集件 作 ; 践

一设和
成开 ;


步计开
和发


的方发
测过


了法,
试程

解和对


和实
SNL Pascal
语 语 法语 词 四 言
言设 总 内
义 法 )法 法 个
分分
分分模
析析
析析块
模模
模模:
块块
块块


LL(1)


方 法 )
下 降 方

语 言 , 即 嵌 套 式 语
言 是 自 定 义 的 一 种 类
的计 编并 译实 程现 序 ;程
序 设 计 语
SNL
体 目 标
代码,自己设计并实现词法分析、语法分析和语义分析模块; (C语言)
高级
在掌握已有的编译原理方法和实现技术基础上,自己设计并 实现,特别是采用面向对象的软件设计思想;(Java)
时间安排
01 下午1:00-4:00,请牢记,勿迟 到!
02 上机时间:第3周至第10周
(共8周,3月29日~5月21日)
(P7)
字母:{a..zA..Z} 数字:{0..9} 运算符:{+,-,*,/,<,=} 格式符:{(,),[,],{,},.,EOF,;,
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理课程设计报告课题名称: C-语言编译器设计(scanner和parser)提交文档学生姓名:提交文档学生学号:同组成员名单:无指导教师姓名:金军指导教师评阅成绩:指导教师评阅意见:..提交报告时间: 2011年 6 月 17 日1.课程设计目标设计C-Minus编译器分为scanner和parser两个部分。

scanner主要作用是对目标代码进行扫描,列出关键字,变量等内容;parser主要对语法进行分析并生成语法树。

2.分析与设计●实现方法:代码用C语言编译而成。

其中scanner为手工实现,主要采用switch-case结构实现状态转换;parser部分采用递归下降分析方法实现。

●扫描器:C-的词法如下:1、语言的关键字:i f el se i nt return void while2、专用符号:+ - * /< <= > >= == != =; , ( ) [ ] { } /* */3、其他标记是变量(ID)和数字(NUM),通过下列正则表达式定义:ID = letter letter* NUM = di git digi t* letter = a|..|z|A|..|Z digi t = 0|..|94、空格由空白、换行符和制表符组成。

空格通常被忽略,除了它必须分开ID、NUM关键字5. 注释用通常的C语言符号/ * . . . * /围起来。

注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。

注释不能嵌套其DFA图如下:分析器:以下为C-的语法规则BNF:代码设计说明:程序结构:本程序共有8个文件,分别为main.c ,globals.h , scan.h ,scan.c , util.h ,util.c ,parse.h ,parse.c。

其中main.c是主函数,实现打开文件等main函数的操作;globals.h里主要词法分析和语法分析的功能;util.c和util.h提供了词法分析和语法分析以及构造分析树的相关函数;scan.c和scan.h主要对目标程序进行扫描和词法分析;parse.c和parse.h主要实现语法分析。

系统结构图如下:3.程序代码实现#include "globals.h"//#define NO_PARSE FALSE#include "util.h"//#if NO_PARSE#include "scan.h"//#else#include "parse.h"//#endif/* allocate global variables */int lineno = 0;FILE * source;FILE * listing;FILE * code;/* allocate and set tracing flags */int EchoSource = TRUE;int TraceScan = TRUE;int TraceParse = TRUE;int Error = FALSE;main( int argc, char * argv[] ){ TreeNode * syntaxTree;char pgm[120];printf("请输入文件名(本文件夹下的文件,如a.txt b.txt):");scanf("%s",pgm);source=fopen(pgm,"r");if (source==NULL){ fprintf(stderr,"File %s not found\n",pgm);exit(1);}listing = stdout;fprintf(listing,"\nCMINUS COMPILATION: %s\n",pgm); syntaxTree = parse();if (TraceParse) {fprintf(listing,"\nSyntax tree:\n");printTree(syntaxTree);}fclose(source);return 0;}#ifndef _GLOBALS_H_#define _GLOBALS_H_#include <stdio.h>#include <stdlib.h>#include <cty pe.h>#include <string.h>#ifndef FALSE#define FALSE 0#endif#ifndef TRUE#define TRUE 1#endif/* MAXRESERVED = the number of reserved words */ #define MAXRESERVED 6typedef enum/* book-keeping tokens */{ENDFILE,ERROR,/* reserved words */IF,ELSE,RETURN,WHILE,/* multicharacter tokens */ID,NUM,/* ty pe*/INT,VOID,/* special symbols + - * / < <= > >= == != = ; , ( ) [ ] { } */PLUS,MINUS,TIMES,OVER,LT,LTEQ,GT,GTEQ,EQ,NOEQ,ASSIGN,SEMI,COMMA,LP AREN,RPAREN,LBRA,RBRA,LBRACE,RBRACE} TokenType;extern FILE* source;extern FILE* listing;extern FILE* code;extern int lineno;typedef enum {StmtK,ExpK,DecK,Param K} NodeKind;typedef enum {CompoundK,SelectionK,IterationK,Return K,ExpressionK} StmtKind; typedef enum {OpK,ConstK,IdK,AssignK,CallK} ExpKind;typedef enum {V ar,Array,Null} ParamKind;typedef enum {Array K,V arK,Fun K} DecKind; //declaration kind treen ode ;#define MAXCHILDREN 3//定义树的结点结构,树是左孩子右兄弟结构。

typedef struct treeNode{ struct treeNode * child[MAXCHILDREN];struct treeNode * sibling;int lineno;NodeKind nodekind;union { StmtKind stmt; ExpKind exp; DecKind dec;ParamKind param;} kind;union { TokenType op;int val;char * ty pe;char * name; } attr;} TreeNode;extern int EchoSource;extern int TraceScan;extern int TraceParse;extern int Error;#endif#include "globals.h"#include "util.h"#include "scan.h"/* states in scanner DFA *//* comments */typedef enum{ START,INASSIGN,INCOMMENT,INOVER,INNUM,INID,INLT,INGT,INNOEQ,DONE } StateType;/* lexeme of identifier or reserved word */char token String[MAXTOKENLEN+1];/* BUFLEN = length of the input buffer forsource code lines */#define BUFLEN 256static char lineBuf[BUFLEN]; /* holds the current line */static int linepos = 0; /* current position in LineBuf */static int bufsize = 0; /* current size of buffer string */static int EOF_flag = FALSE; /* corrects ungetNextChar behavior on EOF *//* getNextChar fetches the next n on-blank characterfrom lineBuf, reading in a new line if lineBuf isexhausted */static int getNextChar(void){ if (!(linepos < bufsize)){ lineno++;if (fgets(lineBuf,BUFLEN-1,source)){ if (EchoSource)fprintf(listing,"%4d: %s",lineno,lineBuf);bufsize = (int)strlen(lineBuf);linepos = 0;return lineBuf[linepos++];}else{ EOF_flag = TRUE;return EOF;}}else return lineBuf[linepos++];}static v oid ungetNextChar(void){ if (!EOF_flag) linepos--;}static struct{ char* str;TokenType tok;} reservedW ords[MAXRESERVED]={{"if",IF},{"else",ELSE},{"while",WHILE},{"return",RETURN},{"int",INT},{"void",VOID} };static TokenType reservedLooku p (char * s){ int i;for (i=0;i<MAXRESERVED;i++)if (!strcmp(s,reservedWords[i].str))return reserv edWords[i].tok;return ID;}TokenType g etToken(void){int token StringIndex = 0;TokenType currentT oken;StateType state = START;int save;while (state != DONE){int c = getNextChar();save = TRUE;switch (state){case START:if (isdigit(c))state = INNUM;else if (isalpha(c))state = INID;else if (c == '=')state = INASSIGN;else if ((c == ' ') || (c == '\t') || (c == '\n'))save = FALSE;else if (c == '<')state = INLT;else if (c == '>')state = INGT;else if (c == '!')state = INNOEQ;else if (c == '/')state = INOVER;else{ state = DONE;switch (c){ case EOF:save = FALSE;currentToken = ENDFILE;break;case '+':currentToken = PLUS;break;case '-':currentToken = MINUS;break;case '*':currentToken = TIMES;break;case '(':currentToken = LPAREN;break;case ')':currentToken = RPAREN;break;case '[':currentToken = LBRA;break;case ']':currentToken = RBRA;break;case '{':currentToken = LBRACE;break;case '}':currentToken = RBRACE;break;case ';':currentToken = SEMI;break;case ',':currentToken = COMMA;break;default:currentToken = ERROR;break;}}break;case INCOMMENT:save = FALSE;if (c == EOF){ state = DONE;currentToken = ENDFILE;}else if ((c == '*') && (getNextChar( ) =='/')) { sav e = FALSE;state = START;}break;case INOVER:if (c == '*'){save = FALSE;tokenStringIndex --;state = INCOMMENT;}else{state = DONE;currentToken = OVER;ungetNextCh ar();}break;case INASSIGN:state = DONE;if (c == '=')currentToken = EQ;else{currentToken = ASSIGN;ungetNextChar();save = FALSE;}break;case INNUM:if (!isdigit(c)){ungetNextChar();save = FALSE;state = DONE;currentToken = NUM;}break;case INID:if (!isalpha(c)){ungetNextChar();save = FALSE;state = DONE;currentToken = ID;}break;case INLT:state = DONE;if (c == '=')currentToken = LTEQ;else {currentToken = LT;ungetNextCh ar();save = FALSE;}break;case INGT:state = DONE;if (c == '=')currentToken = GTEQ;else {currentToken = GT;ungetNextCh ar();save = FALSE;}break;case INNOEQ:state = DONE;if (c == '=')currentToken = NOEQ;else{ungetNextCh ar();save = FALSE;currentToken = ERROR;}break;case DONE:default:fprintf(listing,"Scanner Bug: state= %d\n",state);state = DONE;currentT oken = ERROR;break;}if ((save) && (token StringIndex <= MAXTOKENLEN))token String[token StringIndex++] = (char) c;if (state == DONE){ token String[tokenStringIndex] = '\0';if (currentToken == ID)currentT oken = reservedLooku p(tokenString);}}if (TraceScan) {fprintf(listing,"\t%d: ",lineno);printToken(currentT oken,tokenString);}return currentToken;}#ifndef _SCAN_H_#define _SCAN_H_/* MAXTOKENLEN is the maximum size of a token */#define MAXTOKENLEN 40/* token String array stores the lexeme of each token */extern char token String[MAXTOKENLEN+1];/* function getToken returns the* next token in source file*/TokenType g etToken(void);TokenType g etNextToken(void);#endifvoid sort ( int a[], int low, int high ) { int i; int k;i = low;while (i < high-1){ int t;k = minloc (a,i,high);t =a[k];a[k] = a[i];a[i] = t;i = i + 1;}}void main (void){ int i;i = 0;while (i < 10){ x[i] = input;i = i + 1;}sort (x,0,10);i = 0;while (i < 10){ output(x[i]);i = i + 1;}}#include "globals.h"#include "util.h"/* Procedure printToken prints a token* and its lexeme to the listing file*///输出一个识别出来的关键字void printToken( TokenType token, const char* tokenString ) { switch (token){ case IF:case ELSE:case WHILE:case RETURN:case INT:case VOID:fprintf(listing,"reserved word: %s\n",tokenString);break;case PLUS: fprintf(listing,"+\n"); break;case MINUS: fprintf(listing,"-\n"); break;case TIMES: fprintf(listing,"*\n"); break;case OVER: fprintf(listing,"/\n"); break;case LT: fprintf(listing,"<\n"); break;case LTEQ: fprintf(listing,"<=\n"); break;case GT: fprintf(listing,">\n"); break;case GTEQ: fprintf(listing,">=\n"); break;case EQ: fprintf(listing,"==\n"); break;case NOEQ: fprintf(listing,"!=\n"); break;case ASSIGN: fprintf(listing,"=\n"); break;case SEMI: fprintf(listing,";\n"); break;case COMMA: fprintf(listing,",\n"); break;case LPAREN: fprintf(listing,"(\n"); break;case RPAREN: fprintf(listing,")\n"); break;case LBRA: fprintf(listing,"[\n"); break;case RBRA: fprintf(listing,"]\n"); break;case LBRACE: fprintf(listing,"{\n"); break;case RBRACE: fprintf(listing,"}\n"); break;case ENDFILE: fprintf(listing,"EOF\n"); break;case NUM:fprintf(listing,"NUM, val= %s\n",tokenString);break;case ID:fprintf(listing,"ID, name= %s\n",tokenString);break;case ERROR://报错处理fprintf(listing,"ERROR: %s\n",tokenString);break;default: /* should never happen */fprintf(listing,"Unknown token: %d\n",token);}}//新建一个stmtNode结点,与第三个实验的方法相同//不同的是这里的参数是识别出来的tokenTreeNode * newStmtNode(StmtKind kind){ TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));int i;if (t==NULL)fprintf(listing,"Out of memory error at line %d\n",lineno); else {for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;t->sibling = NULL;t->nodekind = StmtK;t->kind.stmt = kind;t->lineno = lineno;}return t;}TreeNode * newExpNode(ExpKind kind){ TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));int i;if (t==NULL)fprintf(listing,"Out of memory error at line %d\n",lineno); else {for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;t->sibling = NULL;t->nodekind = ExpK;t->kind.exp = kind;t->lineno = lineno;}return t;}TreeNode * newParamNode(ParamKind kind){TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));int i;if (t == NULL)fprintf(listing,"Out of memory error at line %d\n",lineno); else{for (i = 0; i<MAXCHILDREN;i++) t->child[i] = NULL;t->sibling = NULL;t->nodekind = ParamK;t->kind.param = kind;t->lineno = lineno;}return t;}TreeNode * newDecNode(){TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode));int i;if (t == NULL)fprintf(listing,"Out of memory error at line %d\n",lineno);else{for (i=0;i<MAXCHILDREN;i++) t->child[i] = NULL;t->sibling = NULL;t->nodekind = DecK;t->lineno = lineno;}return t;}char * copyString(char * s){ int n;char * t;if (s==NULL) return NULL;n = (int)strlen(s)+1;t = (char *)malloc(n);if (t==NULL)fprintf(listing,"Out of memory error at line %d\n",lineno);else strcpy(t,s);return t;}static indentno = 0;#define INDENT indentno+=2#define UNINDENT indentno-=2//输出每行前面的空格static void printSpaces(void){ int i;for (i=0;i<indentno;i++)fprintf(listing," ");}//输出整个树。

相关文档
最新文档