编译原理实验教案

合集下载

编译原理课程设计教案

编译原理课程设计教案

编译原理课程设计教案第一章:编译原理概述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. 语法分析:上下文无关文法、递归下降分析、LL(1)分析、LR分析。

4. 语义分析:类型检查、作用域分析、语义规则。

5. 中间代码生成:三地址码、四元式、逆波兰表示法。

6. 代码优化:数据流分析、代码优化策略。

7. 目标代码生成:机器代码、汇编语言、目标代码生成技术。

8. 编译器构造工具:编译器生成器、代码优化工具。

四、教学方法1. 讲授法:系统讲解编译原理的基本概念、原理和方法。

2. 案例分析法:通过分析经典的编译器案例,加深对理论知识的理解。

3. 实验法:设计实验,让学生动手实现编译器的基本组件。

4. 讨论法:组织课堂讨论,激发学生的学习兴趣,培养学生的批判性思维。

5. 项目法:设计编译器开发项目,让学生综合运用所学知识。

五、教学过程1. 导入:介绍编译原理的重要性,激发学生的学习兴趣。

2. 讲解:系统讲解编译原理的基本概念和原理。

3. 案例分析:分析经典的编译器案例,帮助学生理解理论知识。

4. 实验:设计实验,让学生动手实现编译器的基本组件。

5. 讨论:组织课堂讨论,解决学生在学习过程中遇到的问题。

编译原理实验教程课程设计

编译原理实验教程课程设计

编译原理实验教程课程设计背景编译原理是计算机科学专业的一门重要课程,它研究如何将高级语言翻译成低级语言,以便计算机执行。

编译器是实现这一过程的关键工具。

然而,对于很多学生来说,编译原理的理论知识学习起来比较抽象,难以掌握。

因此,本文旨在为编译原理的学习提供一些实验教程的设计思路。

实验一:词法分析器词法分析器是编译器的第一个模块,它的作用是将输入的字符流转化为一个个单词符号。

本实验的目的是设计并实现一个简单的词法分析器,实现以下功能:1.识别输入的程序中所包含的各个单词符号。

2.输出所有单词符号及其对应的单词类型。

3.当遇到不合法单词符号时,给出相应的错误提示。

具体实现可以采用有限自动机的思想,使用正则表达式或者手写代码,实现对于不同的单词类型的识别,并对于不合法单词进行识别和报错处理。

实验二:语法分析器语法分析器是编译器的第二个模块,它的作用是将词法分析器输出的单词序列转换成语法树或者语法分析表,以便后续进行语义分析和目标代码生成。

本实验的目的是设计并实现一个简单的语法分析器,实现以下功能:1.识别输入的程序是否符合所设计的文法规则。

2.输出语法树或语法分析表。

具体实现可以采用自上而下的递归下降分析法或自下而上的移进-规约分析法,实现对于不同的句型的识别,并生成语法树或语法分析表。

实验三:语义分析器语义分析器是编译器的第三个模块,它的作用是对语法分析器输出的语法树或语法分析表进行语义分析,并生成中间代码。

本实验的目的是设计并实现一个简单的语义分析器,实现以下功能:1.对语法树或语法分析表进行遍历,识别语法错误和语义错误,给出相应的错误提示。

2.生成中间代码。

具体实现可以采用语义规则和符号表的检查方式,识别语法错误和语义错误,并在生成中间代码时,根据中间代码语言的规则进行实现。

实验四:目标代码生成器目标代码生成器是编译器的第四个模块,它的作用是将中间代码转换成机器语言,以便计算机执行。

本实验的目的是设计并实现一个简单的目标代码生成器,实现以下功能:1.将中间代码转换成机器语言。

《编译原理》实验教学大纲

《编译原理》实验教学大纲

《编译原理》实验教学大纲一、实验目的和任务编译原理是计算机科学与技术专业的一门重要课程,它主要研究的是将高级语言程序翻译成机器语言程序的方法和技术。

通过本实验课程的学习,旨在使学生掌握编译原理的基本原理和方法,培养学生对编译器结构与构造技术的专门知识和技能,为学生今后进行编译器设计与实现打下基础。

二、实验设备和工具1.计算机和相关硬件设备2. 编程语言的开发环境,如C/C++或Java三、实验内容1.实验一:词法分析器设计与实现a)实验目的:学习词法分析器的原理和设计方法,掌握正则表达式、DFA和NFA的转换方法。

b)实验任务:i.设计并实现一个词法分析器的原型,能够正确地识别出给定的程序中的词法单元。

ii. 使用给定的正则表达式设计并实现识别给定程序中的关键字、标识符、常量等的词法分析器。

2.实验二:语法分析器设计与实现a)实验目的:学习语法分析器的原理和设计方法,掌握上下文无关文法和LR分析表的构造方法。

b)实验任务:i.学习并理解上下文无关文法和LR分析表的构造方法。

ii. 设计并实现一个简单的递归下降语法分析器。

3.实验三:语义分析器设计与实现a)实验目的:学习语义分析器的原理和设计方法,掌握语义动作的定义和处理方法。

b)实验任务:i.学习并理解语义分析器的原理和设计方法。

ii. 设计并实现一个简单的语义分析器,能够对给定的程序进行语义分析和语义动作的处理。

4.实验四:中间代码生成器设计与实现a)实验目的:学习中间代码生成器的原理和设计方法,掌握中间代码的生成和优化方法。

b)实验任务:i.学习并理解中间代码生成器的原理和设计方法。

ii. 设计并实现一个简单的中间代码生成器,能够将给定的程序翻译成中间代码。

5.实验五:目标代码生成器设计与实现a)实验目的:学习目标代码生成器的原理和设计方法,掌握目标代码的生成和优化方法。

b)实验任务:i.学习并理解目标代码生成器的原理和设计方法。

ii. 设计并实现一个简单的目标代码生成器,能够将中间代码翻译成目标代码。

编译原理实验教案

编译原理实验教案

编译原理实验教案1.1 背景介绍1.1.1 编译原理是计算机科学中的一个重要分支,研究如何将高级编程语言转换为机器语言。

1.1.2 编译器作为编程语言和计算机硬件之间的桥梁,对于软件开发至关重要。

1.1.3 通过实验学习编译原理,可以加深对编译过程的理解,提高实际编程能力。

二、知识点讲解2.1 编译器的基本组成部分2.1.1 词法分析器:将字符串分解为词法单元。

2.1.2 语法分析器:根据语言的语法规则,将词法单元组合成抽象语法树。

2.1.3 语义分析器:检查抽象语法树的语义正确性,如类型检查等。

2.1.4 中间代码器:将抽象语法树转换为中间代码表示。

2.1.5 代码优化器:对中间代码进行优化,提高代码执行效率。

2.1.6 目标代码器:将优化后的中间代码转换为目标机器代码。

三、教学内容3.1 词法分析实验3.1.1 实现一个简单的词法分析器,能够识别变量名、关键字、常量等。

3.1.2 练习使用正则表达式处理字符串,实现词法单元的提取。

3.1.3 分析词法分析过程中可能遇到的问题,如标识符与关键字的冲突等。

3.2 语法分析实验3.2.1 学习常用的语法分析算法,如LL(1)、LR(1)等。

3.2.2 实现一个简单的语法分析器,能够对简单的算术表达式进行解析。

3.2.3 通过构造预测分析表,解决标识符与关键字冲突的问题。

3.3 语义分析实验3.3.1 学习基本的语义分析方法,如静态语义分析、动态语义分析等。

3.3.2 实现一个简单的类型检查器,能够检查变量类型的正确性。

3.3.3 分析并解决常见语义错误,如类型不匹配、未定义变量等。

四、教学目标4.1 理解编译器的基本工作原理和各个组件的功能。

4.2 掌握基本的词法分析、语法分析和语义分析方法。

4.3 能够独立设计和实现简单的编译器组件,解决实际编程中的问题。

五、教学难点与重点5.1 编译器的设计与实现涉及多个方面的知识,如语言学、逻辑学、计算机科学等。

编译原理实验教案

编译原理实验教案

一、实验目的与要求1. 实验目的(1) 理解编译原理的基本概念和流程。

(2) 掌握常用的编译方法和技术。

(3) 熟练使用编译器开发工具。

2. 实验要求(1) 熟悉计算机专业基础知识。

(2) 掌握C/C++编程语言。

(3) 了解基本的编译原理。

二、实验环境1. 硬件环境(1) 计算机一台。

(2) 编译器开发工具(如GCC、Clang等)。

2. 软件环境(1) 操作系统(如Windows、Linux等)。

(2) 文本编辑器或集成开发环境(如Visual Studio、Eclipse等)。

三、实验内容1. 实验一:词法分析(1) 实现一个简单的词法分析器,识别出关键字、标识符、常量等。

(2) 分析输入的程序,输出词法分析结果。

2. 实验二:语法分析(1) 实现一个简单的语法分析器,根据给定的语法规则分析输入的程序。

(2) 分析输入的程序,输出语法分析树。

3. 实验三:语义分析(1) 实现一个简单的语义分析器,检查程序中的语义错误。

(2) 分析输入的程序,输出语义分析结果。

4. 实验四:中间代码(1) 实现一个简单的中间代码器,将转换为中间代码表示。

(2) 对输入的程序进行转换,输出中间代码。

5. 实验五:目标代码(1) 实现一个简单的目标代码器,将中间代码转换为目标代码。

(2) 对输入的中间代码进行转换,输出目标代码。

四、实验步骤与方法1. 实验一:词法分析(1) 编写词法分析器的代码。

(2) 测试并调试词法分析器。

2. 实验二:语法分析(1) 编写语法分析器的代码。

(2) 测试并调试语法分析器。

3. 实验三:语义分析(1) 编写语义分析器的代码。

(2) 测试并调试语义分析器。

4. 实验四:中间代码(1) 编写中间代码器的代码。

(2) 测试并调试中间代码器。

5. 实验五:目标代码(1) 编写目标代码器的代码。

(2) 测试并调试目标代码器。

五、实验注意事项1. 按照实验要求编写代码,注意代码规范和可读性。

《编译原理》实验指导书

《编译原理》实验指导书

编译原理实验报告班级:计134班姓名:***学号:******实验一词法分析程序设计与实现一、实验目的通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符流形式的源程序转化为一个由各类单词序列的词法分析方法。

二、基本实验内容与要求假定一种高级程序设计语言中的单词主要包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符,试构造能识别这些单词的词法分析程序(各类单词的分类码可参见表1)。

输入:由符合和不符合所规定的单词类别结构的各类单词组成的源程序文件。

输出:把所识别出的每一单词均按形如(CLASS,V ALUE)的二元式形式输出,并将结果放到某个文件中。

对于标识符和无符号常数,CLASS字段为相应的类别码的助记符;V ALUE字段则是该标识符、常数的具体值;对于关键字和运算符,采用一词一类的编码形式,仅需在二元式的CLASS字段上放置相应单词的类别码的助记符,V ALUE字段则为“空”。

表1 语言中的各类单词符号及其分类码表要求:1、上机前完成词法分析程序的程序流图,并选择好相应的数据结构。

2、用于测试扫描器的实例源文件中至少应包含两行以上的源代码。

3、对于输入的测试用例的源程序文件,词法正确的单词分析结果在输出文件中以二元式形式输出,错误的字符串给出错误提示信息。

例如,若输入文件中的内容为:“if myid>=1.5E−2+100 then x:=y”,则输出文件中的内容应为:(IF,)(ID,’myid’)(GE,)(UCON,0.015)(PL,)(UCON,100)(THEN,)(ID,’x’)(IS,)(ID,’y’)三、实现方法1、一般实现方法说明词法分析是编译程序的第一个处理阶段,可以通过两种途径来构造词法分析程序。

其一是根据对语言中各类单词的某种描述或定义(如BNF),用手工的方式(例如可用C语言)构造词法分析程序。

编译原理课程设计教案

编译原理课程设计教案

编译原理课程设计教案第一章:编译原理概述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 编译器案例分析分析典型的编译器设计案例,如C编译器、Java编译器等讲解编译器设计中的关键问题和解决方案10.2 编译器实践项目介绍编译器实践项目的设计和实现过程指导学生完成编译器实践项目,提高编译原理应用能力10.3 编译器设计的未来发展趋势探讨编译器设计的未来发展趋势,如动态编译、云编译等激发学生对编译器设计研究的兴趣和热情重点和难点解析词法分析、语法分析、语义分析、中间代码与优化、目标代码:这些章节涵盖了编译器设计的核心部分,即编译过程中的各个阶段,对于理解编译器的工作原理至关重要。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理实验教案计算机专业教研室季玉茹实验一:词法分析程序设计实验目的1.巩固对词法分析的基本功能和原理的认识。

2.能够应用自动机的知识进行词法分析。

3.理解并处理词法分析中的异常和错误。

实验要求1.掌握词法分析的基本功能,并将其实现。

2.词法分析程序应具有较好的可扩展性,应清晰明确。

3.除对相关问题的全面考虑外,还需对局部作一些优化考虑(如符号表)。

3.明确词法分析的基本功能和原理。

4.在词法分析中哪些地方体现自动机意识。

5.词法分析的异常和错误处理。

6.编写并运行该题目程序代码,具有该题目的参考答案。

7.深刻理解题目内涵,能够清晰描述问题,掌握该题目涉及的知识点,指导学生实验时需要注意的问题。

实验原理参考教材第2章2.3节和下图算法,可以做Pascal语言的词法分析程序;单词的种类分为五种:1.Pascal常用保留字:AND,ARRAY,BEGIN,CASE,CONST,DIV,DO,DOWNTO,ELSE,END,FILE,FOR,GOTO,FUNCTION,IF,IN,LABEL,MOD,NOT,OF,OR,PACKEN,PROCEDURE,PROG RAM,RECORD,REPEAR,SET,THEN,TO,TYPE,UNTIL,V AR,WHILE,WITH2.标识符:[字母]{字母|数字}另外标识符里包括:标准常量:false,ture标准类型:integer,boolen,real,char,text标准文件:input,output标准过程:read,readln,write,writeln3.运算符:+,-,*,/,DIV,MOD,OR,AND,NOT,<,<=,=,>=,>,<>,:=4.界符:“,”,“.”,“、”,“(”,“)”,“:”,“;”5.常数:如10,25,100,14.25实验内容对一段类高级语言代码进行词法分析,并输出词法分析的结果。

四、使用算法1、模块4:识别标识符输入:CH中含标识符的首字母;输出:TOKEN(二元式形式);procedure RECOGID(CH,TOKEN);beginWORD:='';/*WORD存放标识符*/WORD:=WORD||CH;/*||表示连接*/repeatcall GETCH(CH);/*读下一字符*/if CH是字母或数字then WORD:=WORD||CH;until CH!=字母或数字;if CH是非法字符then call PRINTERR('非法字符')else 列计数-1;/*不是非法字符时列计数-1*/if WORD是关键字then TOKEN:=(关键字种别码,_)else begin/*查填符号表,ENTRY为标识符在表中的入口*/call LOOKUP(WORD,'标识符',ENTRY);TOKEN:=(标识符种别码,ENTRY)end;returnend;对于识别较为复杂单词的模块,可以先画出该单词的状态转换图或语法图,然后再根据状态图给出模块详细说明。

2、模块6:处理注解(HANDLECOM);输入:'/';进入该模块之前已扫描了一个符号'/'输出:'/'的TOKEN字或空TOKEN宇;procedure HANDLECOM(TOKEN);begin call GETCH(CH);if CH!='*'then /*'/'表示除号*/begin 列计数-1;TOKEN=('/'的种别码,_);return end,TOKEN='-1';/*置标记,以下开始处理注解*/call GETCH(CH);while 列计数≤行长-1 dobegin CH1:=CH;call GETCH(CH);if CH1='*'and CH='/' /*注解结束*/thenTOKEN:='';end while;if TOKEN!=''then call PRINTERR('注解未完');TOKEN:='';returnend;3、模块7:识别界限符(RECOGDEL)输入:CH内含单界限符;输出:各种界符的TOKEN字;procedure RECOGDEL(CH,TOKEN);begincase CH of'+':TOKEN:=('+'的种别码,_);end;end...............end case;returnend;为了简明起见,模块7的说明中对各种同类情况的处理作了省略,读者可以完善。

如果嫌该模块大了一些,还可以对它再细分。

如果模块的长度在一页打印纸(≤60行)以内,则认为模块的大小是合适的。

由于把符号表和常数表合一,增加了查填符号表模块的复杂性。

需要填入符号表的单词有标识符,字符常数和数值常数。

它们填表的方法又各不相同。

标识符和字符常数都要求把字符串先填人字符串表,然后再把字符串在串表中的起点HEADP和长度LENGTH填入符号表的名字栏内。

对字符常数来说还要在TYPE栏内填入字符常数类型。

对数值常数而言,则把其值填入符号表的V AL栏内,同时在TYPE栏内填人该值的类型。

不管是标识符,字符常数,还是数值常数,在查填符号表时,首先检查是否有同名或同值入口项,如果有则直接返回该入口地址;否则将标识符或常数填入符号表中,并返回这个入口地址。

4、模块10:查填符号表(LOOKUP)输入:WORD,KIND;/*KIND区别WORD的类型*/输出:ENTRY;/*WORD在符号表中的入口*/procedure LOOKUP(WORD,KIND,ENTRY);begincase KIND Of'标识符或字符串':begin检查WORD是否与符号表某名字栏中的名字同名;/*包括类型检查*/if不同名thenbegin把WORD存入字符串表中,开始位置是HEADP;LENGTH:=WORD中字符串的长度;ENTRY:=P;/*P是符号表新入口*/NAME(P):=(HEADP,LENGTH);if KIND=字符常数then TYPE:='字符常数';endelse/*WORD和名字栏的入口Pi同名*/ENTRY:=Plend;'数字常数':begin查检WORD是否和符号表VAL栏某入口同值;if不同值thenbegin V AL(P):=WORD;TYPE(P):=KIND;ENTRY:=P/*设P是符号表新入口*/endelse/*WORD和V AL栏的人口P1同值*/ENTRY:=P1end;end case;returnend;如果SIMPLE源程序中有以下说明语句:constant STRING1='CHAR_CONST';PI=3.1415;在执行SCANNER之后,STRING1,CHAR_CONST,PI和3.1415将要分别占用4个符号表入口项,这是不合理的。

由于词法分析程序不具备语法分析功能,也只能如此。

在语义分析阶段将可以解决这个问题,具体解决办法等到第六章再介绍。

最后再给出分类模块(SORT)的详细说明:模块3:单词分类模块(SORT)输入:CH内含单词首符;procedure SORT(CH);begincase CH Of'字母':call RECOGID(CH,TOKEN);/*识别标识符*/'/':call HANDLECOM(CH,TOKEN);/*处理注解及界限符'/'*/'数字':call RECOGDIG(CH,TOKEN);/*识别数字常数*/:call RECOGSTR(CH,TOKEN);/*识别字符常数*/otherwise call RECOGDEL(CH,TOKEN);/*识别各种界符*/end case;write TOKEN into TOKEN文件;returnend;实验报告格式编译原理课程实验报告实验:词法分析实验例子:求最大值与最小值(存到一个.txt 文件)PROGRAM maxmin(input,output);V ARx,max,min,real;i:integer;BEGINread(x);write(x);max:=x;min:=x;FOR i:=2 TO 20 DOBEGINread(x);write(x);IF i MOD 5=0THEN writeln;IF x>maxTHEN max:=xELSE IF x<minTHEN min:=xEND;END.实验输出结果举例:1.“PROGRAM”:保留字;“maxmin”:标识符;“(”:界符;“input”: 标准文件;“,”:界符;“output”:标准文件;“)”:界符;“;”:界符实验二:LL(1)文法的判别实验目的:1.通过实验掌握确定的自顶向下语法分析方法的基本思想和技术;2.进一步巩固判别一个上下文无关文法是否是LL(1)文法的基本原理的掌握。

3.能够设计出计算一个文法的FIRST、FOLLOW、SELECT集合的算法。

实验原理:1.文法满足的条件:经过压缩,无左递归,无回溯。

2.基本思想:一个上下文无关文法是LL(1)文法的充分必要条件是,对每个非终结符A的两个不同产生式,A→α,A→β,满足:SELECT(A→α)∩SELECT(A→β)=φ,其中α,β不能同时推出空。

如果对于某个非终结符,它不含有空产生式,那么只要计算出它们右部的符号串可以推导出的首符号集合不相交,就可以根据当前的输入符号是属于哪个产生式右部的首符号集合而决定选择相应产生式进行推导。

FIRST(A→α)∩FIRST(A→β)=φ,其中α,β不能推出空。

如果当某一非终结符的产生式中含有空产生式时,它的非空产生式右部的首符号集合两两不相交,并与在推导过程中紧跟该非终结符右边可能出现的终结符集也不相交,则仍可构造确定的自顶向下分析。

FIRST(A→α)∩FOLLOW(A)=φ,其中α,β不能同时推出空。

这样只要计算出所有非终结符号的FIRST、FOLLOW集合,就可以计算出选择某个产生式的选择集合SELECT集合,这样就可以判断出给定的文法是否是LL(1)文法。

实验内容:1.设计求出能推出ε的非终结符的算法,并用程序实现FIRST、FOLLOW集合。

2.根据定义构造求FIRST、FOLLOW集合的算法,并用程序实现。

相关文档
最新文档