编译原理

合集下载

(完整版)编译原理名词解释

(完整版)编译原理名词解释

(完整版)编译原理名词解释1.源语⾔:书写源程序所使⽤的语⾔2.源程序:⽤程序设计语⾔书写的程序3.⽬标语⾔:计算机的机器指令。

⽬标语⾔可以是机器语⾔,也可以是汇编语⾔,或者是其他中间语⾔,但最终结果必是机器语⾔。

4.⽬标程序:由机器指令构成的程序。

⽬标程序是经过翻译程序加⼯后⽤⽬标语⾔表⽰的程序。

5.翻译程序:能够把某⼀种语⾔程序(源程序)改造成另⼀种语⾔程序(⽬标程序)将源程序译成逻辑上等价的⽬标程序的程序。

翻译程序有两种⼯作⽅式:编译和解释。

6.编译程序:也称翻译程序7.解释程序:有些翻译程序在翻译过程中并不产⽣完整的⽬标程序,⽽是翻译⼀句,解释执⾏⼀句,这样的称为解释程序。

8.汇编程序:由汇编语⾔写成的程序9.词法分析:执⾏词法分析的程序成为词法分析器,词法分析依据的是语⾔构词规则。

词法分析器从⽂件读⼊源程序,由字符拼接单词。

每当识别出⼀个单词,词法分析器就输出这个单词的内部码。

10.语法分析:执⾏语法分析的程序叫做语法分析器。

语法分析的任务就是根据语⾔的规则,将词法分析器所提供的单词种别分成各类语法范畴。

11.中间代码⽣成:中间代码产⽣有时称为语义分析,执⾏中间代码产⽣的程序称为中间代码⽣成器。

他的任务时按照语法分析器所识别出的语法范畴产⽣相应的中间代码,并建⽴符号表、常数表,等各种表格。

12.⽬标代码⽣成:执⾏⽬标代码⽣成的程序称为⽬标代码⽣成器。

他的任务是根据中间代码和表格信息,确定各类数据在内存中的位置,选择合适的指令代码,将中间代码翻译成汇编语⾔或机器指令,这部分⼯作与计算机硬件有关。

13.符号表:⽤于记录源程序中出现的标识符,⼀个标识符往往具有⼀系列的语义值,她包括标识符的名称、种属、类型、值存放的地址等等。

14.常数表:⽤于记录在源程序中出现的常数。

15.编译程序前端:是由词法分析器、语法分析器和中间代码产⽣器组成的。

她的特点是依赖于被编译的源程序,输出结果⽤中间代码描述,和⽬标机器⽆关。

编译原理目录

编译原理目录

编译原理目录一、引言。

1.1 编译原理概述。

1.2 编译器的作用和原理。

二、词法分析。

2.1 词法分析的任务和原理。

2.2 正规表达式和有限自动机。

2.3 词法分析器的实现。

三、语法分析。

3.1 语法分析的任务和原理。

3.2 自顶向下分析和自底向上分析。

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 结语。

在编译原理的学习过程中,我们将深入了解编译器的工作原理和实现方法。

从词法分析到目标代码生成,每个环节都承担着特定的任务,而它们又相互协作,共同完成将源代码翻译成目标代码的过程。

通过本文档的学习,读者将能够全面了解编译原理的核心概念和具体实现,为日后的编译器开发和优化工作打下坚实的基础。

编译原理-课程简介

编译原理-课程简介
程序分析
编译原理中的程序分析技术可以 用于逆向工程中的程序分析,帮
助理解程序的结构和功能。
代码重构
在逆向工程中,编译原理可以帮助 对代码进行重构,提高代码的可读 性和可维护性。
病毒分析和防治
编译原理可以帮助分析和防治计算 机病毒,保护计算机系统的安全。
计算机体系结构相关应用
指令集设计
编译原理可以指导计算机指令集 的设计,提高处理器的性能。
• 向量化技术的实现方法:向量化技术的实现方法包括自动向量化和手动向量化 两种。自动向量化是指编译器自动将程序中的循环结构转换为向量运算;而手 动向量化则需要程序员手动编写向量运算的代码。在实现向量化技术时,需要 注意处理器的向量长度、数据对齐等问题。
04
CATALOGUE
运行时环境支持
存储管理策略及实现
定义不同类型的异常,如语法错误、 运行时错误等,以便程序能够识别并 处理异常情况。
控制异常在程序中的传播范围,避免异常对 程序其他部分的影响,同时提供异常恢复机 制,使程序能够从异常情况中恢复执行。
异常捕获与处理
在程序中设置异常捕获机制,当异常发 生时能够捕获异常并执行相应的处理代 码,保证程序的稳定性和可靠性。
自顶向下语法分析
从文法的开始符号出发,根据产生式 规则推导出输入符号串的过程。
自底向上语法分析
从输入符号串出发,逐步归约到文法 的开始符号的过程。
LL(1)语法分析方法
一种预测分析方法,根据当前输入符 号和上下文信息预测下一个要产生的 非终结符。
LR(1)语法分析方法
一种规范归约分析方法,根据当前输 入符号和栈顶信息确定句柄并进行归 约。
01
02
03
静态存储分配

学编译原理的作用

学编译原理的作用

学编译原理的作用
学习编译原理的作用有以下几点:
1. 理解编译过程:编译原理是研究将高级程序语言翻译成机器语言的过程。

学习编译原理可以帮助我们深入了解编译过程中各个阶段的原理和实现方法,包括词法分析、语法分析、语义分析、中间代码生成、优化和目标代码生成等,从而更好地理解编译的工作原理。

2. 改善程序设计能力:学习编译原理可以使我们更加深入地理解高级语言的语法和语义规则,理解编译器如何分析和转换程序代码。

这有助于我们提高程序设计能力,写出更高效、可读性更好、可维护性更高的代码。

3. 掌握语言设计技巧:编译原理涉及到编程语言的设计和实现,学习编译原理可以帮助我们掌握一些语言设计的技巧和原则,了解各种编程语言中常用的语法结构和语义规则,并能够根据需要设计新的语言或对现有语言进行扩充和改进。

4. 优化程序性能:编译器在编译过程中可以对程序进行一系列的优化,包括代码优化、存储器优化和并行化等,学习编译原理可以了解各种优化技术和优化原理,掌握如何通过编译器优化来提高程序的性能和效率。

5. 开发领域特定语言(DSL):学习编译原理可以了解如何设计和实现领域特定语言(Domain-Specific Language,DSL)。

DSL是专门为特定领域或特定问题而设计的编程语言,学习
编译原理可以帮助我们了解如何根据特定需求设计和实现DSL,从而在特定领域中提高开发效率和代码质量。

编译原理教学大纲

编译原理教学大纲

编译原理教学大纲一、课程介绍本课程主要介绍编译原理的相关概念、理论和实践技术,旨在培养学生对编译原理的理解和应用能力。

通过本课程的学习,学生将了解到编译器的工作原理、设计流程和实现方法,掌握常见编程语言的词法分析、语法分析、语义分析和代码生成等基本技术。

二、教学目标1. 熟悉编译原理的基本概念和基础知识;2. 掌握编译器的各个模块的设计和实现方法;3. 能够使用现有编译器工具进行编译器开发和优化;4. 培养学生的编程能力、分析问题和解决问题的能力。

三、教学大纲1. 编译原理基础1.1 编译器的作用和概念- 编译过程及其阶段- 编译器的核心功能1.2 语言文法和自动机理论- 正则文法和有限自动机- 上下文无关文法和下推自动机1.3 词法分析- 正则表达式和有限自动机实现词法分析器 - 关键字、运算符、标识符、字面量的识别 2. 语法和语义分析2.1 自顶向下语法分析- LL(1)文法及其分析方法- 预测分析表和递归下降分析2.2 自底向上语法分析- LR(0)文法及其分析方法- SLR(1)文法和LR(1)文法分析2.3 语义分析与语法制导翻译- 语义动作和属性文法- 语法制导翻译的实现方法3. 中间代码生成与优化3.1 中间代码的表示和生成- 三地址码和虚拟机- 递归下降翻译的中间代码生成3.2 基本块和流图- 基本块的概念和划分- 控制流的分析和优化3.3 数据流分析与优化- 活性变量分析- 常量传播和复写传播优化4. 目标代码生成和优化4.1 目标代码生成的基本原理- 寄存器分配和指令选择- 代码布局和指令调度4.2 目标代码优化- 数据流分析在目标代码优化中的应用- 循环优化和内存优化四、教学方法本课程采用理论课与实践相结合的教学方法。

理论课重点讲解编译原理的基本概念和原理,实践课通过编写实际编译器项目,培养学生的编程和问题解决能力。

五、考核方式1. 平时成绩占比:40%包括课堂参与、作业完成情况和实验报告等。

编译原理

编译原理

编译原理第一章:1.编译程序是现代计算机系统的基本组成部分之一2.一个计算机系统中通常配置多个高级语言的编译程序3.在一个计算机系统中可为某些高级语言配置多个不同性能的编译程序4.编译程序是一种语言翻译程序,其功能是把一种语言编写的程序翻译成另一种语言的等价程序5.被编译的程序称为源程序,编译后的等价程序称为目标程序6.编译程序的任务就是将源语言程序翻译成等价的目标语言程序7.通常将编译过程分为六个阶段:词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。

8.词法分析的主要任务是从左至右扫描字符序列,并按照此法规则识别出一个个的单词9.单词是指逻辑上紧密相连的一组字符,这些字符具有集体含义。

10.计算机语言中,单词的种类通常有保留字、标识符、数、算符、界符等11.语法分析的主要任务是:按照语言的语法规则,把词法分析所得的单词序列分解成各类语法成分。

12.词法分析和语法分析都是对源程序进行结构分析,但二者是有区别的。

13.语义分析的主要功能是审查源程序有无语义错误,伪代码生成阶段收集类型信息。

14.中间代码生成阶段的主要任务是,把源程序转换成一种中间代码15.中间代码是一种结构简单、含义明确的记号系统16.中间代码可以设计成多种形式,其设计原则有两点:一是容易生成,二是容易转换成目标代码17.代码优化的主要任务是对中间代码进行改造,使生成的目标代码更为高效18.目标代码生成阶段的任务是把中间代码转换成特定机器上的绝对指令代码或者可重定位的指令代码或者汇编指令代码19.在编译过程的每个阶段中都含有出错处理和表格管理的工作20.编译程序的结构可以按功能分为八个模块,即词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序和目标代码生成程序,此外还有与上述每个阶段都有关系的出错处理程序和表格管理程序。

21.按照编译程序的工作主要是与源语言有关还是与目标机有关,编译过程也可前端和后端22.前端的工作主要依赖于源语言而与目标机无关,包括词法分析、语法分析、语义分析、中间代码生成以及每个阶段中的出错处理和表格管理工作,还包括代码优化阶段的部分工作23.后端的工作主要与目标机有关而与源语言无关,主要是代码生成及相关的出错处理和表格管理工作24.编译过程中,对源程序或者中间语言程序从头至尾扫描一次并完成相应工作的过程称为“一遍”或者“一趟”25.解释程序是另一种语言处理程序,其工作特点是边分析边执行,不生成目标代码。

《编译原理》教学大纲

《编译原理》教学大纲

《编译原理》教学大纲一、课程概述编译原理是计算机科学与技术专业的一门重要课程,也是软件工程领域的基础课程之一、本课程通过对编译器的原理和实现技术的学习,使学生掌握编译器的设计和实现方法,培养学生独立解决实际问题的能力。

二、教学目标1.理解编译器的基本原理和工作流程;2.掌握常见编译器的构建方法和技术;3.能够设计和实现简单的编译器;4.培养分析和解决实际问题的能力。

三、教学内容和教学进度1.第一章:引论1.1编译器的定义和分类1.2编译器的基本工作流程2.第二章:词法分析2.1编译器的基本结构2.2词法单元的定义和识别方法2.3正则表达式和有限自动机3.第三章:语法分析3.1语法分析的基本概念3.2语法规则的定义和表示方法3.3自顶向下的语法分析方法3.4自底向上的语法分析方法4.第四章:语义分析4.1语义分析的基本概念4.2属性文法和语法制导翻译4.3语义动作和符号表管理5.第五章:中间代码生成5.1中间代码的定义和表示方法5.2基本块和控制流图5.3三地址码的生成方法6.第六章:优化6.1优化的基本概念和原则6.2常见的优化技术和方法6.3编译器的优化策略7.第七章:目标代码生成7.1目标代码生成的基本原理7.2目标代码的表示方法和存储管理7.3基本块的划分和目标代码生成算法8.第八章:附加主题8.1解释器和编译器的比较8.2面向对象语言的编译8.3并行编译和动态编译四、教学方法1.理论教学与实践相结合,注重教学案例的分析和实践;2.引导学生主动探索,注重培养学生的自主学习能力;3.激发学生的兴趣,鼓励学生提问和讨论。

五、考核方式1.平时成绩:包括课堂测验、作业和实验报告等;2.期末考试:闭卷笔试,主要考查学生对编译原理的理论知识和实践能力的掌握程度。

六、参考教材1.《编译原理与技术》(第2版),龙书,机械工业出版社,2024年2.《现代编译原理-C语言描述》(第2版),谢路云,电子工业出版社,2024年七、参考资源1. 实验环境:Dev-C++、gcc、llvm等2.相关网站:编译原理教学网站、编译器开源项目等八、教学团队本课程由计算机科学与技术学院的相关教师负责教学,具体安排详见教务处发布的教学计划。

编译原理教案

编译原理教案

编译原理教案说明:一、参考书:1、陈意云、张昱:《编译原理》,高等教育出版社,2003年。

2、陈意云、张昱:《编译原理习题精选》,中国科技大学出版社,2003年。

3、吕映芝、张素琴、蒋维杜:《编译原理》,清华大学出版社,1998年第二版。

4、王生原、吕映芝、张素琴:《编译原理课程辅导》,清华大学出版社,2007年。

5、伍春香:《编译原理习题与解析》,清华大学出版社,2001年。

6、Andrew W.Appel:《现代编译原理—C语言描述》,人民邮电出版社,2005年。

7、Noam Nison等:《计算机系统要素》,电子工业出版社,2007年。

8、Randall Hyde:《编程卓越之道(第二卷)》,电子工业出版社,2007年。

二、教学目的:通过学习形式语言与自动机理论、词法分析、语法分析、语义分析、代码优化和生成等内容使学生掌握构造编译程序的基本原理和基本方法,并通过上机实习使学生进一步掌握开发应用程序的基本方法,为深入理解计算机系统、程序设计语言与开发大型应用程序打下良好的基础。

三、教学时数:课堂教学51学时,上机实验30学时。

四、授课内容:第一章编译程序概述第二章 PL/0编译程序的实现第三章文法和语言第四章词法分析第五章自顶向下语法分析方法第六章自底向上优先分析方法第七章 LR分析方法第八章语法制导翻译和中间代码生成第九章符号表第一○章目标程序运行时的存储组织第一一章代码优化第一二章代码生成第一章概述一、说明:1、教学目的与要求:了解编译程序的概念、结构以及工作流程。

2、主要内容:什么是编译程序、编译过程概述、编译程序的结构、编译阶段的组合、编译技术和软件工具以及实例分析。

3、教学重点:编译程序的结构以及每一阶段的任务。

4、教学难点:理解编译程序各模块的判错功能、编译方式和解释方式执行速度上的不同。

二、教学内容第一节编译程序1、机器语言:直接用计算机能够识别的二进制代码指令来编写程序的语言。

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

课程设计任务书题目:简单编译器的设计与实现姓名:莫飞飞学号: 200712230111专业: 07本二课程:编译原理指导教师:王艳秋职称:完成时间:2009年12月--2009年1月枣庄学院计算机科学系课程设计的任务和具体要求任务:结合各章节的构造编译程序的基本理论,完成一简单编译器的设计与实现。

使学生将理论与实际应用结合起来,受到软件设计等开发过程的全面训练,从而提高学生软件开发的能力。

要求:1.用C或C++语言描述及上机调试,实现一个小编译器:2.完成符号表的构造,3.理解词法分析,语法分析,目标代码生成等重要子程序。

指导教师签字:日期:指导教师评语成绩:指导教师签字:日期:课程设计所需软件、硬件等软件:WIN-TC、Word文档硬件:一台计算机课程设计进度计划参考文献、资料索引1.《程序设计语言编译原理》,陈火旺编著,国防工业出版社2.《编译原理》,吕映芝、张素琴、蒋维杜编著,清华大学出版社3.《编译原理》,Alfred V.Aho 等,李建中译,机械工业出版社一、总体设计方案及主要思想:1.主要思想:编译器是靠编译程序实现,而编译程序是指把某一种语言程序(源程序)转换成另一种语言程序(目标程序)的翻译过程。

编译过程分为五个步骤:词法分析;语法分析;语义分析;中间代码的产生与优化;目标代四元式单词符号语法单位四元式目标代码词法分析器语法分析器语义分析与中间代码生成器优化段源程序表 格 管 理出 错 处 理目标代码生成器码生成。

编译程序的结构可以按照这五阶段的任务模块进行设计。

图一是编译程序的总框:(图一)2.设计方案:(1)设计符号表。

图二是符号表的格式:(图二)确定符号表的组织方式,一般应包括名字栏和信息栏,其中名字栏作为关键字。

要考虑能够存储有关名字的信息,并可以高效地完成如下操作:a.查找:根据给定的名字,在符号表中查找其信息。

如果该名字在符号表中不存在,则将其加入到符号表中,否则返回指向该名字的指针;b.删除:从符号表中删除给定名字的表项。

(2)设计词法分析器设计各单词的状态转换图,并为不同的单词设计种别码。

流程图见附录图三。

将词法分析器设计成供语法分析器调用的子程序。

功能包括:a.具备预处理功能。

将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序;b.能够拼出语言中的各个单词;c.将拼出的标识符填入符号表;d.返回(种别码,属性值)。

算法代码:int code, value;strToken := “”; /*置strToken为空串*/GetChar(); GetBC();if (IsLetter())beginwhile (IsLetter() or IsDigit())beginConcat(); GetChar();endRetract();code := Reserve();if (code = 0)beginvalue := InsertId(strToken);return ($ID, value);endelsereturn (code, -);Endelse if (IsDigit())beginwhile (IsDigit())beginConcat( ); GetChar( );endRetract();value := InsertConst(strToken);return($INT, value);endelse if (ch =‘=’) return ($ASSIGN, -);Else if (ch =‘+’) return ($PLUS, -);else if (ch =‘*’)beginGetChar();if (ch =‘*’) return ($POWER, -);Retract(); return ($STAR, -);endelse if (ch =‘;’) return ($SEMICOLON, -);else if (ch =‘(’) return ($LPAR, -);else if (ch =‘)’) return ($RPAR, -);else ProcError( ); /* 错误处理*/(3)语法分析器综合来说,有预测分析法、递归下降分析法、算符优先分析法、SLR分析法,实现对表达式、各种说明语句、控制语句进行语法分析。

这里我用来递归下降法来完成语法分析。

(代码见实现部分)(4)目标代码生成器能完成指定寄存器个数的情况下将一中间代码程序段翻译成汇编语言目标代码(汇编指令应包括加、减、乘、除),要求指令条数最少的情况下,尽量使用寄存器,尽量少访问内存,这样才能做到运行效率高。

附录:图三.词法转换状态转换图二.实现及主要代码【流程图】(图四)1、符号表的设计:struct{//定义符号表结构char name[8];int address;}vartable[maxvartablep];//改符号表最多容纳maxvartablep个记录2、词法分析程序设计与实现://下面定义保留字,为简化程序,使用字符指针数组保存所有保留字。

//如果想增加保留字,可继续添加,并修改保留字数目#define keywordSum 8Char*keyword[keywordSum]={ "if","else","for","while","do","int","read ","write"};//下面定义纯单分界符,如需要可添加char singleword[50]="+-*(){};,:";//下面定义双分界符的首字符char doubleword[10]="><=!";extern char Scanin[300], Scanout[300]; //用于接收输入输出文件名,在extern FILE *fin,*fout; //用于指向输入输出文件的指针,在TEST_main.c中定义int TESTscan()//词法分析函数{........//文件打开程序略ch=getc(fin);while(ch!=EOF){while (ch==' '||ch=='\n'||ch=='\t') ch=getc(fin);if (isalpha(ch)) //如果是字母,则进行标识符处理{token[0]=ch; j=1;ch=getc(fin);while(isalnum(ch)) //如果是字母数字则组合标识符{token[j++]=ch; //组合的标识符保存在token中ch=getc(fin); //读下一个字符}token[j]='\0'; //标识符组合结束 //查保留字n=0;while ((n<keywordSum) && strcmp(token,keyword[n])) n++;if (n>=keywordSum) //不是保留字,输出标识符fprintf(fout,"%s\t%s\n","ID",token); //输出标识符符号else//是保留字,输出保留字fprintf(fout,"%s\t%s\n",token,token); //输出保留字符号} else if (isdigit(ch))//数字处理{token[0]=ch; j=1;ch=getc(fin); //读下一个字符while (isdigit(ch)) //如果是数字则组合整数{token[j++]=ch; //组合整数保存在token中ch=getc(fin); //读下一个字符}token[j]='\0'; //整数组合结束fprintf(fout,"%s\t%s\n","NUM",token); //输出整数符号} else if (strchr(singleword,ch)>0) //单分符处理{token[0]=ch; token[1]='\0';ch=getc(fin);//读下一个符号以便识别下一个单词fprintf(fout,"%s\t%s\n",token,token); //输出单分界符符号}else if (strchr(doubleword,ch)>0) //双分界符处理{token[0]=ch;ch=getc(fin); //读下一个字符判断是否为双分界符if (ch=='=') //如果是=,组合双分界符{token[1]=ch;token[2]='\0'; //组合双分界符结束ch=getc(fin); //读下一个符号以便识别下一个单词} else//不是=则为单分界符token[1]='\0';fprintf(fout,"%s\t%s\n",token,token); //输出单或双分界符符号} else if (ch=='/') //注释处理{ch=getc(fin); //读下一个字符if (ch=='*') //如果是*,则开始处理注释{ char ch1;ch1=getc(fin); //读下一个字符do{ ch=ch1;ch1=getc(fin);} //删除注释while ((ch!='*' || ch1!='/')&&ch1!=EOF); //直到遇到注释结束符*/或文件尾ch=getc(fin);//读下一个符号以便识别下一个单词} else //不是*则处理单分界符/{token[0]='/'; token[1]='\0';fprintf(fout,"%s\t%s\n",token,token); //输出单分界符/ }} else//错误处理{token[0]=ch;token[1]='\0';ch=getc(fin); //读下一个符号以便识别下一个单词es=3; //设置错误代码fprintf(fout,"%s\t%s\n","ERROR",token); //输出错误符号}}fclose(fin);//关闭输入输出文件fclose(fout);return(es); //返回主程序}3、语法与语义分析的实现及主要代码语法规则:/*<程序>::={<声明序列><语句序列>}program::={<declaration_list><statement_list>}*//*<声明序列>::=<声明序列><声明语句>|<声明语句><declaration_list>::=<declaration_list><declaration_stat>|<declaration_stat>改成<declaration_list>::={<declaration_stat>} *//*<声明语句> ::=int <变量>;<declaration_stat>::=int ID; *//*<语句序列>::=<语句序列><语句>|<语句>//<statement_list>::=<statement_list><statement>|<statement>改成<statement_list>::={<statement>}*//*<语句>::=<if语句>|<while语句>|<for语句>|<read语句>|<write语句>|<复合语句>|<表达式语句><statement>::= <if_stat>|<while_stat>|<for_stat>|<compound_stat>|<expression_stat>*//*<IF 语句>::= if (<表达式>) <语句> [else <语句>]<IF_stat>::= if (<expr>) <statement > [else < statement >]其中动作符号的含义如下@BRF↑label1 :输出 BRF label1,@BR↑label2:输出 BR label2,@SETlabel↓label1:设置标号label1@SETlabel↓label2:设置标号label2*//*<while语句>::=while(<表达式>) <语句><while_stat>::= while (<expr >) < statement >//动作解释如下://@SETlabel↑label1:设置标号label1//@BRF↑label2 :输出 BRF label2,//@BR↓label1:输出 BR label1,//@SETlabel↓label2:设置标号label2*//*<for语句>::=for(<表达式>;<表达式>;<表达式>) <语句><for_stat>::= for(<expr>,<expr>,<expr>)<statement>//动作解释如下://@SETlabel↑label1:设置标号label1//@BRF↑label2 :输出 BRF label2,//@BR↓label1:输出 BR label1,//@SETlabel↓label2:设置标号label2 *//*<write_语句>::=write <表达式>;<write_stat>::=write <expression>;动作解释:1. @SETlabel↓label1:设置标号label12. @BRF↑label2 :输出 BRF label2,3. @BR↑label3:输出 BR label3,4. @SETlabel↓label4:设置标号label45. @BR↑label1:输出 BR label1,6. @SETlabel↓label3:设置标号label37. @BR↑label4:输出 BR label4,8. @SETlabel↓label2:设置标号label2 *//*<read_语句>::=read <变量>;<read_stat>::=read ID;//动作解释://@ OUT:输出 OUT*//*<复合语句>::={<语句序列>}<compound_stat>::={<statement_list>}//动作解释://@LOOK↓n↑d:查符号表n,给出变量地址d; 没有,变量没定义//@IN:输出IN//@STI↓d:输出指令代码STI d*//*<表达式语句>::=<<表达式>;|;<expression_stat>::=<expression>;|;*//*<表达式>::=<标识符>=<布尔表达式>|<布尔表达式><expr>::=ID=<bool_expr>|<bool_expr>*//*<布尔表达式>::=<算术表达式>|<算术表达式>(>|<|>=|<=|==|!=)<算术表达式><bool_expr>::=<additive_expr>|< additive_expr >(>|<|>=|<=|==|!=)< additive_expr > *//*<算术表达式>::=<项>{(+|-)<项>}<additive_expr>::=<term>{(+|-)< term >} *//*<项>::=<因子>{(*|/)<因子>}< term >::=<factor>{(*| /)< factor >} *//*<因子>::=(<算术表达式>)|<标识符>|<无符号整数>< factor >::=(<additive_expr>)| ID|NUM */子函数的定义及部分代码:int program();int compound_Stat();int statement();int expression_Stat();int expression();int bool_expr();int additive_expr();int term();int factor();int if_stat();int while_stat();int for_stat();int write_stat();int read_stat();int declaration_stat();int declaration_list();int statement_list();int compound_stat();char token[20],token1[40];/*token保存单词符号,token1保存单词值*/ extern char Scanout[300]; /*保存词法分析输出文件名*/FILE *fp; /*用于指向输入输出文件的指针*/int TESTparse(){int es=0;if((fp=fopen(Scanout,"r"))==NULL){printf("\n打开%s错误!\n",Scanout);es=10;return(es);}if (es==0) es=program();switch(es){case 0: printf("语法分析成功!\n");break;case 10: printf("打开文件 %s失败!\n",Scanout);break;case 1: printf("缺少{!\n");break;case 2: printf("缺少}!\n");break;case 3: printf("缺少标识符!\n");break;case 4: printf("少分号!\n");break;case 5: printf("缺少(!\n");break;case 6: printf("缺少)!\n");break;case 7: printf("缺少操作数!\n");break;case 21: printf("符号表溢出!\n");break;case 22: printf("变量重复定义!\n");break;case 23: printf("变量未声明!\n");break;}fclose(fp);fclose(fout);return(es);}4.主函数:void main(){int es=0;es=TESTscan();//调词法分析if (es>0) printf("词法分析有错,编译停止!");else printf("词法分析成功!\n");if (es==0){ es=TESTparse(); //调语法、语义分析并生成代码}}四、测试与分析把代码写在1.txt文档里,经词法分析的结果放在12.Txt里,语法分析器把12.Txt 当作输入文件,把分析的结果放在122.Txt里。

相关文档
最新文档