编译原理课程设计一个简单编译器的设计与分析
编译原理课程设计C-语言编译器
编译原理课程设计报告课题名称: C-语言编译器设计提交文档学生姓名:李杰提交文档学生学号:0743041240同组成员名单:无指导教师姓名:金军N不指导教师评阅意见:..提交报告时间: 2010年 6 月 10日1.课程设计目标实验建立C-编译器。
只含有scanner和parser部分。
2.分析与设计(1)实现方法:编程语言为C语言。
编程方法:scanner部分根据DFA图用switch-case结构实现状态转换;parser部分用递归下降分析方法实现。
(2)扫描器:C-惯用的词法1、语言的关键字:else if int return void while2、专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */3、其他标记是ID和NUM,通过下列正则表达式定义:ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|94、空格由空白、换行符和制表符组成。
空格通常被忽略,除了它必须分开ID、NUM关键字。
5. 注释用通常的C语言符号/ * . . . * /围起来。
注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。
注释不能嵌套各单词的状态转换图(DFA图如下)词法结构见文件"globals.h"中。
(3)分析器:分析树结构见文件"globals.h"中。
C-的BNF语法如下:(4)代码设计说明:程序结构:语法分析函数parse通过调用词法分析函数getToken实现语法分析。
文件和函数的设计说明:文件main.c包含相应头文件,及main函数的实现;文件golbals.h 包含符号表和分析数的数据结构及在其它文件中使用的变量;文件util.h 和util.c实现与词法分析和语法分析输出相关的函数printToken和printTree,以及分析树节点初始化相关的函数newStmtNode,newExpNode(Expkind)和copyString;文件scan.h 和scan.c实现词法分析,主要函数为getToken;文件parse.h 和parse.c实现语法分析,函数为与文法规则对应的函数。
编译原理编译器课程设计
编译原理编译器课程设计一、课程目标知识目标:1. 理解编译原理的基本概念,掌握编译器各阶段的工作原理和实现方法;2. 学会使用一种编程语言(如C、Java等)编写简单的编译器程序;3. 掌握词法分析、语法分析、语义分析及目标代码生成的基本技术和策略;4. 了解优化技术在编译器中的应用,提高程序运行效率。
技能目标:1. 能够运用所学知识独立设计并实现一个简单的编译器;2. 培养学生运用编译原理知识解决实际问题的能力;3. 提高学生的编程实践能力和团队协作能力;4. 培养学生查阅资料、分析问题、总结归纳的能力。
情感态度价值观目标:1. 培养学生对编译原理和编译器开发工作的兴趣,激发学生的学习热情;2. 培养学生勇于探索、积极创新的精神,增强克服困难的信心和毅力;3. 培养学生具备良好的编程习惯,遵循职业道德,为我国软件产业的发展贡献自己的力量。
本课程旨在通过编译原理编译器课程设计,使学生掌握编译器的基本原理和技术,提高编程实践能力,培养团队协作精神,激发学生的学习兴趣和创新精神。
课程性质为理论与实践相结合,注重培养学生的实际操作能力。
针对学生的年级特点,课程内容将逐步深入,从基本概念到实际应用,引导学生由浅入深地掌握编译器相关知识。
在教学过程中,教师需关注学生的学习进度,及时调整教学策略,确保课程目标的实现。
通过本课程的学习,学生将具备独立设计和实现简单编译器的能力,为后续相关课程的学习打下坚实基础。
二、教学内容1. 编译原理概述:介绍编译器的基本概念、发展阶段和组成部分,使学生了解编译器在整个软件开发过程中的地位和作用。
教材章节:第一章2. 词法分析:讲解词法分析器的功能、设计方法,以及正则表达式和有限自动机等基本概念。
教材章节:第二章3. 语法分析:介绍语法分析器的作用、设计方法,以及上下文无关文法、LL(1)、LR(1)等分析方法。
教材章节:第三章4. 语义分析:讲解语义分析器的任务、属性文法、语法制导翻译等概念,以及类型检查和符号表管理方法。
编译原理课程设计---一个简单编译器的设计与分析
摘要使用过现代计算机的人都知道,多数用户是应用高级语言来实现他们所需要的计算的。
现在计算机系统一般都含有不只一个的高级语言的编译程序,对有些高级语言甚至配置了几个不同性能的编译程序,供用户按不同需要进行选择。
高级语言编译程序是计算机系统软件最主要的组成部分之一,也是用户最直接关系的工具之一。
计算机上执行一个高级语言程序一般分为两步:第一,用一个编译程序把高级语言翻译成机器语言程序;第二,运行所得的机器语言程序求得计算结果。
通常说的翻译程序是指能够把某一种语言程序转换成另一种语言程序(目标语言程序)。
如果源语言诸如Fortran,Pascal,C,Ada或java这样的高级语言,而目标程序是诸如汇编语言或者机器语言这类的低级语言,这样的一个翻译程序就是称为编译程序。
一个编译程序的工作过程一般可以划分为五个阶段:词法分析、语法分析、语义分析与中间代码生成、优化、目标代码生成。
每个阶段都是从上一个阶段得到结果,对他进行分析,并且根据一些外部环境(例如符号表等)得到最终的输出结果。
要构造一个编译程序,可以按照这样的阶段来分别构造,最后来连调。
现在人们已经建立了多种编制部分编译程序或整个编译程序的有效工具。
有些能用于自动生成扫描器(如LEX),有些可以用于自动产生语法分析器(如YACC),有些甚至可以用来自动产生整个的编译程序。
这些构造编译程序的工具成为编译程序-编译程序、编译程序产生器或翻译程序书写系统,他们是按照编译程序和目标语言的形式描述而自动产生编译程序的。
编译程序是一极其庞大而又复杂的系统,掌握它比较苦难。
但是一旦对其掌握,对以后的程序语言设计,系统软件分析,系统软件设计,形式语言研究等方面都是非常有好处的。
关键字:C语言、、编译、扫描器、语法分析一、需求分析给出类C语言(C语言的子集)的词法和语法定义,并根据对应的语法定义写出一些属性文法和语法制导。
根据词法和语法的定义,构造一个编译程序,它主要可以完成如下功能:1、读入某个已经编辑好的类C源程序文件,通过词法分析器,生成二元组,同时检查词法错误;2、语法分析器将产生的二元组作为输入,进行语法分析,同时检查语法错误;3、在语法分析同时,利用属性文法和语法制导技术,产生具体的语意动作,并对符号表进行操作;4、根据语义动作产生整个源程序的四元式序列;5、将产生的四元式序列连同符号表一起输出,作为编译程序的最终输出结果;6、对最后的代码优化和目标代码生成要有所考虑,必须留有一定的接口供以后扩展;7、增大程序的可移植性,努力做到整个系统方便移植。
简单编译器编译原理课设(中版)
目录1 词法分析 (2)1.1 实验目的 (2)1.2 实验要求 (2)1.2.1待分析的简单的词法 (2)1.2.2 各种单词符号对应的种别码: (2)1.2.3 词法分析程序的功能: (3)1.3 词法分析程序的算法思想: (3)1.3.1 主程序示意图: (3)1.3.2 扫描子程序的算法思想: (4)1.3.3 词法分析程序的C语言程序源代码: (6)1.3.4 结果分析: (6)1.3.5 总结: (7)2 语法分析 (8)2.1 实验目的 (8)2.2实验要求 (8)2.2.1 待分析的简单语言的语法 (8)2.2.2 实验算法结构 (8)语法分析程序的算法思想 (8)2.3 结果分析: (13)2.4 总结: (15)3 语义分析程序 (16)3.1 实验目的: (16)3.2 实验要求: (16)3.3 算法思想: (16)3.3.1 程序结构图 (16)3.3.2 设置语义过程 (20)3.3.3 函数lrparser 在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。
在实验中我们只对表达式、赋值语句进行翻译。
(21)3.3.4 简单赋值语句的翻译文法 (21)3.4 结果分析 (22)3.5 总结: (25)1 词法分析(李梦珂 201181216 负责)1.1 实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。
1.2 实验要求设计、编制并调试一个词法分析程序,三人一组。
1.2.1待分析的简单的词法(1)关键字:int if then else while do read write所有的关键字都是小写。
(2)运算符和界符::= = + - ++ -- * / < <= != > >= = ; ( ) { } #(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID = letter (letter | digit)*NUM = digit digit*(4)空格有空白、制表符和换行符组成。
简单编译器课程设计
简单编译器课程设计一、课程目标知识目标:1. 理解编译器的基本概念,掌握编译过程的主要环节;2. 学习简单编译器的构造原理,了解词法分析、语法分析、语义分析的基本方法;3. 掌握一种编程语言的基本语法,如C语言,并能运用所学知识编写简单的编译程序。
技能目标:1. 培养学生运用所学编译原理知识,独立设计并实现简单编译器的能力;2. 培养学生运用编程语言解决实际问题的能力,提高编程实践技能;3. 培养学生团队合作意识,学会与他人共同分析问题、解决问题。
情感态度价值观目标:1. 激发学生对计算机科学领域编译原理的兴趣,提高学生的学习积极性;2. 培养学生勇于面对困难、敢于挑战的精神,增强学生的自信心;3. 培养学生严谨、踏实的科学态度,养成良好的编程习惯。
课程性质:本课程为信息技术学科选修课程,适用于高年级学生。
结合学生特点,课程旨在提高学生的编程能力、逻辑思维能力和团队合作能力。
学生特点:学生已具备一定的编程基础,对编译原理有一定了解,但缺乏实际操作经验。
教学要求:课程要求学生在理解编译原理的基础上,动手实践,独立设计并实现简单编译器。
教师需关注学生的学习进度,及时给予指导,确保课程目标的实现。
通过本课程的学习,学生能够将理论知识与实践相结合,提高自身综合素质。
二、教学内容本课程教学内容分为以下四个部分:1. 编译器基本概念与编译过程- 理解编译器的作用和基本工作原理;- 掌握编译过程的五个阶段:词法分析、语法分析、语义分析、中间代码生成和目标代码生成;- 了解编译器各阶段之间的关系和相互作用。
2. 词法分析- 学习词法分析的基本概念和方法;- 掌握正则表达式、有限自动机等词法分析工具;- 实现简单的词法分析程序。
3. 语法分析- 学习语法分析的基本概念和方法;- 掌握上下文无关文法、递归下降分析、LL(1)分析法等语法分析方法;- 实现简单的语法分析程序。
4. 语义分析与中间代码生成- 学习语义分析的基本概念和方法;- 掌握符号表、类型检查等语义分析方法;- 了解中间代码的种类及其生成方法;- 实现简单的语义分析和中间代码生成程序。
编译原理课程设计___C语言编译器的实现
扬州大学编译原理课程设计学号:*********姓名:专业:计算机科学与技术课程:编译原理指导教师:***目录一.程序简介与分析---------------------------------------------------------3 二.程序适用范围-----------------------------------------------------------3 三.词法分析---------------------------------------------------------------3 四.语法分析---------------------------------------------------------------4 五.语义分析和中间代码生成------------------------------------------------10 六.代码生成--------------------------------------------------------------12 七.流程图----------------------------------------------------------------13 八.实现------------------------------------------------------------------14 九.程序运行结果----------------------------------------------------------14 十.总结------------------------------------------------------------------18 十一.附录(源程序)--------------------------------------------------------18简单的编译程序设计一.程序简介与分析本程序由四个部分组成:词法分析子程序,语法分析子程序,语义分析子程序,目标代码生成程序。
编译原理实现一个简单的编译器
编译原理实现一个简单的编译器在编译原理领域,编译器是一种将源代码转换为目标代码的工具。
本文将探讨如何实现一个简单的编译器,并介绍编译器的基本原理和步骤。
一、引言编译器是计算机科学中的重要概念,它负责将高级语言转换为低级语言,使计算机能够理解和执行程序。
一个完整的编译器通常包括以下几个阶段:词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。
二、词法分析词法分析是编译器的第一步,它将源代码分解为一个个词法单元(token),并生成 token 流。
常见的词法单元有标识符、关键字、运算符和常量等。
在实现一个简单的编译器时,我们可以使用正则表达式来识别和提取不同类型的词法单元。
例如,使用 `\w+` 来匹配标识符,使用`if|else|while` 来匹配关键字等。
三、语法分析语法分析是编译器的第二步,它根据词法分析生成的 token 流,将其转换为抽象语法树(Abstract Syntax Tree,简称 AST)。
AST 表示了源代码的结构和语法关系。
在实现一个简单的编译器时,我们可以使用上下文无关文法(Context-Free Grammar,简称 CFG)来描述语法规则,然后使用递归下降法(Recursive Descent Parsing)来进行语法分析。
四、语义分析语义分析是编译器的第三步,它对抽象语法树进行分析,检查语法和语义错误,并进行类型推断和类型检查。
语义分析阶段还可以进行符号表的生成和管理。
在实现一个简单的编译器时,我们可以定义语义规则来检查源代码的语义正确性。
例如,检查变量的声明和使用是否匹配,检查表达式的类型是否兼容等。
五、中间代码生成中间代码生成是编译器的第四步,它将抽象语法树转换为一种中间表示形式,通常是三地址码或类似形式。
中间代码是一种介于源代码和目标代码之间的表示形式。
在实现一个简单的编译器时,我们可以使用一组规则来将抽象语法树转换为中间代码。
例如,将控制结构转换为条件跳转语句,将表达式转换为基本的算术运算等。
编译原理分析课程设计
编译原理分析课程设计一、课程目标知识目标: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.进行测试和调试:在实现过程中,要进行充分的测试和调试,保证编译器的正确性和可靠性。
编译原理课程设计
编译原理 课程设计一、课程目标知识目标:1. 理解编译原理的基本概念,掌握编译过程中的词法分析、语法分析、语义分析及目标代码生成等核心环节。
2. 学会使用一种编程语言(如C、Java等)编写简单的编译程序,实现对简单程序语言的编译功能。
3. 了解编译器优化和代码生成的基本策略,能够对编译程序进行初步优化。
技能目标:1. 培养学生运用编译原理知识分析程序语言、设计编译器的能力。
2. 培养学生运用调试工具(如GDB、JDB等)调试编译程序,找出并修复程序错误的能力。
3. 提高学生的编程实践能力,能够独立完成一个简单编译器的编写。
情感态度价值观目标:1. 培养学生对待编译原理学科的严谨态度,激发对编译技术的研究兴趣。
2. 培养学生具备良好的团队合作精神,能够在项目实践中与他人有效沟通、协作。
3. 培养学生具备解决问题的能力,面对编程挑战时,能够保持积极、自信的心态。
课程性质:本课程属于计算机科学与技术专业核心课程,旨在使学生掌握编译原理的基本知识,培养其编程实践能力。
学生特点:学生具备一定的编程基础,熟悉至少一种编程语言,对编译原理有一定了解,但缺乏实际编译器开发经验。
教学要求:结合学生特点,注重理论与实践相结合,通过案例教学、项目实践等方式,帮助学生掌握编译原理知识,提高编程实践能力。
同时,关注学生的情感态度,激发其学习兴趣,培养良好的团队合作精神。
在教学过程中,注重分解课程目标,确保学生能够达到预期学习成果。
二、教学内容1. 编译原理概述:介绍编译原理的基本概念、编译过程、编译器的组成及工作原理。
教材章节:第1章 编译原理概述内容安排:1课时2. 词法分析:讲解词法分析的基本概念、词法分析器的功能及实现方法。
教材章节:第2章 词法分析内容安排:2课时3. 语法分析:介绍语法分析的基本概念、语法分析器的构造方法、自上而下和自下而上的语法分析方法。
教材章节:第3章 语法分析内容安排:3课时4. 语义分析:讲解语义分析的基本任务、语义分析器的实现方法、类型检查等内容。
编译原理课程设计c语言编译器
编译原理课程设计 c语言编译器一、教学目标本课程的目标是让学生掌握C语言编译器的基本原理和实现方法。
通过本课程的学习,学生应能够理解编译器的主要组成部分,如词法分析器、语法分析器、中间代码生成器、优化器和目标代码生成器等;掌握编译器的设计方法和实现技巧,如有限自动机、递归下降分析和代码优化等;能够独立设计和实现一个小型的C语言编译器。
二、教学内容本课程的教学内容主要包括C语言编译器的基本原理、编译器的设计方法和实现技巧。
具体包括以下几个部分:1.C语言编译器的概述:介绍编译器的作用、编译过程和编译器的种类等。
2.词法分析:介绍词法分析器的原理和实现方法,包括正则表达式、有限自动机等。
3.语法分析:介绍语法分析器的原理和实现方法,包括递归下降分析、LL分析、LR分析等。
4.中间代码生成:介绍中间代码生成器的原理和实现方法,包括三地址码、静态单赋值码等。
5.代码优化:介绍代码优化的原理和实现方法,包括常数折叠、死代码消除等。
6.目标代码生成:介绍目标代码生成器的原理和实现方法,包括机器码生成、寄存器分配等。
三、教学方法本课程的教学方法采用讲授法、讨论法和实验法相结合的方式。
在讲授基本原理和方法的同时,通过案例分析和讨论,让学生更好地理解和掌握相关知识。
同时,通过实验环节,让学生亲手设计和实现C语言编译器的基本模块,提高学生的实践能力和创新能力。
四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备。
教材主要包括《编译原理》、《C语言编译器》等;参考书包括《编译原理学习指导》、《编译器设计实践》等;多媒体资料包括教学PPT、视频讲座等;实验设备包括计算机、编程环境等。
教学资源将全程支持教学内容和教学方法的实施,丰富学生的学习体验。
五、教学评估本课程的评估方式包括平时表现、作业、考试等多个方面,以全面客观地评价学生的学习成果。
平时表现主要考察学生的出勤、课堂参与度和团队协作能力;作业分为课后练习和实验报告,用以巩固和检验学生的学习效果;考试包括期中考试和期末考试,全面测试学生的知识掌握和应用能力。
编译原理第二章一个简单的编译器解析
形式语言简介
乔姆斯基(Chomsky),1956年 四类文法:0型、1型、2型、3型 0型文法
G=(VT, VN, S, P) G的产生式满足,∈(VN∪VT)*且至少有一个
非终结符,∈(VN∪VT)* 短语文法 能力相当于图灵机,递归可枚举的
4. 一个特定的非终结符——开始符号,start symbol
形式化定义
几个概念 Σ:有穷字母表,元素——符号 符号串:Σ中符号构成的有穷序列 空字:不含任何符号的序列,ε Σ*:符号串全体,包括空字 φ:空集{},区分ε,{},{ε} Σ*的子集U、V的积(连接)
UV { | U且 V}
例2.4
expr expr – digit
expr
expr
-
expr
+
digit
expr expr + digit
digit
2
5
digit
9
叶节点从左至右构成树的输出(yield) 开始符号推导出(生成)的单词串
语言:语法分析树生成的单词串集合
2.2.2 二义性(ambiguity)
多个语法分析树生成相同的单词串 ——多个意义
9 - 5 + digit
P4 : digit 5
9-5+2
expr expr + digit expr expr – digit expr digit digit 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
P4 : digit 2
例2.2(续)
expr
编译原理_简单编译器课程设计报告
.专业.整理.
下载可编辑
<=
35
==
36
!=
37
2.2、语法结构定义
<程序> ::= main()<语句块> <语句块> ::= ‘{‘<语句串>’}’ //程序用括号括起来 <语句串>::=<语句>{;<语句>};
<语句>::=<赋值语句>|<条件语句>|<循环语句> <赋值语句>::=ID=<表达式> //赋值语句用”=”号 <条件语句>::=if<条件><语句块> //条件怎么没有括号,囧(自己加 1 个) <循环语句>::=do <语句块>while <条件> <条件>::=<表达式><关系运算符><表达式> <表达式> ::= <项>{ +<项>|-<项>} <项> ::= <因子>{*<因子>|/<因子>} <因子> ::=ID|num|(<表达式>) num::= ( +|-|ε ) 数字*(.数字数字* | ε)( e ( +|-|ε ) 数字数字*|ε) ID::=字母(字母|d 数字)* 字母::=a|b|c…|z|A|B|C…|Z 数字::=0|1|2…|9 <关系运算符> ::= <|<=|>|>=|==|!=
课程设计进度计划
工作容 查找资料 理清思路,编写程序 完善程序,编辑文档
编译原理课程设计报告(一个完整的编译器)
编译原理程序设计报告一个简单文法的编译器的设计与实现专业班级:计算机1406班组长姓名:宋世波组长学号: ******** 指导教师:肖桐2016年12月设计分工组长学号及姓名:宋世波20143753 分工:文法及数据结构设计词法分析语法分析(LL1)基于DAG的中间代码优化部分目标代码生成组员1学号及姓名:黄润华20143740 分工:中间代码生成(LR0)部分目标代码生成组员2学号及姓名:孙何奇20143754 分工:符号表组织部分目标代码生成摘要编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。
编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。
一.编译器的概述1.编译器的概念编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。
编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。
源代码一般为高阶语言如Pascal、C++、Java 等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。
2.编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。
另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。
交叉编译器在生成新的硬件平台时非常有用。
“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。
例如: 自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。
3.本编译器概述编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。
每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。
一个简单的编译器设计和分析
《编译技术》课程设计实验报告实验名称:编译器程序目录一、课设要求 (2)二、总体设计思想 (3)三、详细算法设计 (3)四、流程框图 (4)五、函数相关说明 (8)1. 所有函数一览 (8)2. void emit(char *res,char *num1,char *op,char *num2) (8)3. char *newTemp() (9)4. int merge(int p1,int p2) (9)5. void backpatch(int p,int t) (10)6. void fuzhi() (10)7. void tiaojian(int *nChain) (11)8. void xunhuan() (12)六、程序运行结果 (14)七、编译器使用说明 (16)八、心得与体会 (16)九、源程序清单 (17)一、课设要求用C语言对下述文法和单词表定义的语言设计编制一个编译器。
(1)单词符号及种别表(2)语法结构定义<程序> ::= main()<语句块><语句块> ::= ‘{‘<语句串>’}’//程序用括号括起来<语句串>::=<语句>{;<语句>};<语句>::=<赋值语句>|<条件语句>|<循环语句><赋值语句>::=ID=<表达式> //赋值语句用”=”号<条件语句>::=if<条件><语句块> //条件怎么没有括号,囧(自己加1个)<循环语句>::=do <语句块>while <条件><条件>::=<表达式><关系运算符><表达式> //没有布尔运算,还算简单<表达式> ::= <项>{ +<项>|-<项>}<项> ::= <因子>{*<因子>|/<因子>}<因子> ::=ID|num|(<表达式>)num::=( +|-|ε) 数字*(.数字数字* | ε)( e ( +|-|ε) 数字数字*|ε)ID::=字母(字母|d数字)*字母::=a|b|c…|z|A|B|C…|Z数字::=0|1|2…|9<关系运算符> ::= <|<=|>|>=|==|!=二、总体设计思想采用递归下降(自上而下)的语法制导翻译法。
编译原理课程设计报告
编译原理课程设计报告编译原理课程设计——简单编译器的设计与实现班级:组长:组员:指导教师:设计时间: 12月摘要....................................... 错误!未定义书签。
1.概述 ..................................... 错误!未定义书签。
2.课程设计任务及要求 ....................... 错误!未定义书签。
2.1 设计任务............................ 错误!未定义书签。
2.2 设计要求............................ 错误!未定义书签。
3.算法及数据结构 ........................... 错误!未定义书签。
3.1算法的总体思想(流程)............... 错误!未定义书签。
3.2词法分析模块......................... 错误!未定义书签。
3.2.1功能........................... 错误!未定义书签。
3.2.2数据结构 ....................... 错误!未定义书签。
3.2.3算法........................... 错误!未定义书签。
3.3语法分析(含语义分析和中间代码生成)模块错误!未定义书签。
3.3.1功能........................... 错误!未定义书签。
3.3.2数据结构 ....................... 错误!未定义书签。
3.3.3算法........................... 错误!未定义书签。
3.4中间代码优化模块..................... 错误!未定义书签。
3.4.1功能........................... 错误!未定义书签。
3.4.2数据结构 ....................... 错误!未定义书签。
编译原理课程设计
编译原理课程设计1. 引言编译原理是计算机科学与技术专业中的一门核心课程,它主要研究如何将高级语言程序转换为机器语言程序,从而实现程序的执行。
编译原理课程设计是这门课程中的重要环节,通过完成一个小型编译器的设计与实现,帮助学生深入理解编译原理的基本原理与技术,提高编程能力和解决实际问题的能力。
本文档将详细介绍一个基于编译原理的课程设计的要求、流程和一些实现细节,提供实践指导和参考。
2. 课程设计要求2.1 设计目标编译原理课程设计的设计目标是实现一个基于简单语言的编译器,能够将该语言的源代码转换为目标代码,并能正确运行。
2.2 设计任务本次课程设计的任务是设计并实现一个编译器,包括词法分析、语法分析、语义分析、中间代码生成和目标代码生成等模块。
具体任务包括:•设计并实现词法分析模块,将源代码转换为词法单元序列。
•设计并实现语法分析模块,根据语法规则将词法单元序列转换为语法树。
•设计并实现语义分析模块,对语法树进行语义检查,并生成中间代码。
•设计并实现中间代码生成模块,将语法树转换为中间代码。
•设计并实现目标代码生成模块,将中间代码转换为目标代码。
2.3 设计要求•设计的编译器语言可以是一种简单的面向过程语言,或是自行设计的一种简化语言,语法规则和语义规则要符合编译原理的基本原理。
•要求设计的编译器能处理基本的数据类型、变量定义、运算符和控制语句等。
•要求课程设计过程中进行充分的测试和调试,确保编译器能正确识别语法错误、类型错误等,并能生成正确的目标代码。
•要求课程设计实现过程中使用适当的工具和技术,如Lex和Yacc等。
3. 设计流程3.1 概述设计一个编译器是一个复杂的任务,需要进行多个步骤的设计与实现。
以下是一个典型的设计流程:1.确定设计目标,确定设计任务。
2.设计词法分析器。
3.设计语法分析器。
4.设计语义分析器。
5.设计中间代码生成器。
6.设计目标代码生成器。
7.测试、调试和优化。
3.2 设计步骤详解3.2.1 确定设计目标,确定设计任务在这一步骤中,需要明确设计的目标和任务,确定设计的编译器语言和功能要求。
编译原理编译器课程设计
编译原理编译器课程设计经过一个星期的编译原理课程设计,本人在刘贞老师的指导下,顺利完成该课程设计。
通过该课程设计,收获颇多。
一、对实验原理有更深的理解通过该课程设计,掌控了什么就是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟识了编译程序总流程框图,介绍了编译程序的分解成过程、结构工具及其有关的技术对课本上的科学知识存有了更深的`认知,课本上的科学知识师机械的,表面的。
通过把该算法的内容,算法的继续执行顺序在计算机上同时实现,把原来以为很深奥的书本知识变小的更为直观,对实验原理存有更深的认知。
二、对该理论在实践中的应用有深刻的理解通过把该算法的内容,算法的继续执行顺序在计算机上同时实现,晓得和认知了该理论在计算机中就是怎样继续执行的,对该理论在实践中的应用领域存有深刻的认知。
三、激发了学习的积极性通过该课程设计,全面系统的认知了编程原理程序结构的通常原理和基本同时实现方法。
把死板的课本科学知识显得生动有趣,唤起了自学的积极性。
把段小宇的计算机编程原理的科学知识加强,能把课堂上学的科学知识通过自己设计的程序则表示出,增进了对理论知识的认知。
以前对与计算机壮作系统的认识是模糊的,概念上的,现在通过自己动手做实验,从实践上认识了操作系统是如何处理命令的,如何协调计算机内部各个部件运行,对计算机编译原理的认识更加深刻。
课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意指针,将不必要的命令去除。
在这次课程设计中,我就是按照实验指导的思想去顺利完成。
增进了认知文件系统的内部功能及内部同时实现,培育课堂教学动手能力和程序开发能力的目的。
四、理解了该知识点以及学科之间的融合渗透本次课程设计程序部分就是用c语言撰写的,把《计算机操作系统》,《编程原理》,《算法分析与设计》《c语言》四门学科联系出来,把各个学科之间的科学知识融合出来,把各门课程的科学知识联系出来,对计算机整体的重新认识更加深刻。
编译原理课程设计一个简单文法的编译器的设计与实现
课程设计报告设计题目:一个简单文法的编译器的设计与实现班级:运算机1206班组长学号:2021XXX组长姓名:XXX指导教师:XXX设计时刻:2014年12月设计分工组长学号及姓名:2021XXX XXX分工:1)读取源文件进行词法分析2)进行LL(1)分析生成份析表3)设计顶层自动机将源程序分段4)生成可执行的汇编程序组员1学号及姓名:2021XXX XXX分工:1)设计第二层自动机处置程序片段2)生成中间语言四元式3)源程序错误处置组员2学号及姓名:2021XXX XXX分工:1)设计第三层自动机处置复合表达式2)设计带动作的LL(1) 文法3)源程序错误处置摘要编译原理课程具有很强的理论性和实践性,是运算机专业的一门超级重要的专业基础课程,在系统软件中也是占有十分重要的地位。
本次课程设计咱们是在Visual C++的平台上应用了词法分析、语法分析、语义分析、中间语言生成和目口号言生成的知识设计了一个简单的编译器前端。
其中设计了一个简单的有限自动机来扫描源程序即进行语法分析,并生成了关键字表、标志符表、界符表、常数表和Token串;设计了一个LL(1)文法和一个带动作的文法来实现语法分析,并生成了Select集和LL(1)分析表;采纳了四元式序列的设计来生成中间语言;通过汇编语言设计来生成目口号言。
最后为了使该编译器加倍完善,咱们设计了简单的的错误检查机制,能够对源程序进行比较全面的错误检查同时也能够指犯错误显现的大致位置,增强了该编译器的健壮性。
关键字:编译器,前端,有限自动机,LL(1)文法,汇编语言,错误处置目录摘要 (3)一、概述 (5)二、课程设计任务及要求 (5)2.1设计任务 (5)2.2设计要求 (6)3、算法与数据结构 (6)3.1词法分析器的算法 (6)3.2 语法分析器的算法 (12)LL(1)文法设计算法 (12)递归下降子程序设计算法 (19)3.3中间语言生成器算法 (20)3.4处置复合表达式算法 (24)3.5目口号言生成器算法 (30)3.6数据结构 (39)4、程序设计与实现 (39)4.1编译程序设计与实现 (39)4.2程序实验结果 (39)待测源程序 (39)词法分析结果 (40)语法分析结果 (41)中间语言生成结果 (42)目口号言生成结果 (43)程序错误处置结果 (44)五、参考文献 (44)一、概述本次课程设计的编译程序要紧包括了词法分析器、语法分析器、中间代码生成器和目标代码生成器四部份,编译程序的输出结果包括了词法分析后的关键字表、界符表、标识符表和Token串,语法分析后的Select集和LL(1)分析表;中间代码生成器产生的四元式序列。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要使用过现代计算机的人都知道,多数用户是应用高级语言来实现他们所需要的计算的。
现在计算机系统一般都含有不只一个的高级语言的编译程序,对有些高级语言甚至配置了几个不同性能的编译程序,供用户按不同需要进行选择。
高级语言编译程序是计算机系统软件最主要的组成部分之一,也是用户最直接关系的工具之一。
计算机上执行一个高级语言程序一般分为两步:第一,用一个编译程序把高级语言翻译成机器语言程序;第二,运行所得的机器语言程序求得计算结果。
通常说的翻译程序是指能够把某一种语言程序转换成另一种语言程序(目标语言程序)。
如果源语言诸如Fortran,Pascal,C,Ada或java这样的高级语言,而目标程序是诸如汇编语言或者机器语言这类的低级语言,这样的一个翻译程序就是称为编译程序。
一个编译程序的工作过程一般可以划分为五个阶段:词法分析、语法分析、语义分析与中间代码生成、优化、目标代码生成。
每个阶段都是从上一个阶段得到结果,对他进行分析,并且根据一些外部环境(例如符号表等)得到最终的输出结果。
要构造一个编译程序,可以按照这样的阶段来分别构造,最后来连调。
现在人们已经建立了多种编制部分编译程序或整个编译程序的有效工具。
有些能用于自动生成扫描器(如LEX),有些可以用于自动产生语法分析器(如YACC),有些甚至可以用来自动产生整个的编译程序。
这些构造编译程序的工具成为编译程序-编译程序、编译程序产生器或翻译程序书写系统,他们是按照编译程序和目标语言的形式描述而自动产生编译程序的。
编译程序是一极其庞大而又复杂的系统,掌握它比较苦难。
但是一旦对其掌握,对以后的程序语言设计,系统软件分析,系统软件设计,形式语言研究等方面都是非常有好处的。
关键字:C语言、、编译、扫描器、语法分析一、需求分析给出类C 语言(C 语言的子集)的词法和语法定义,并根据对应的语法定义写出一些属性文法和语法制导。
根据词法和语法的定义,构造一个编译程序,它主要可以完成如下功能:1、读入某个已经编辑好的类C 源程序文件,通过词法分析器,生成二元组,同时检查词法错误;2、语法分析器将产生的二元组作为输入,进行语法分析,同时检查语法错误;3、在语法分析同时,利用属性文法和语法制导技术,产生具体的语意动作,并对符号表进行操作;4、根据语义动作产生整个源程序的四元式序列;5、将产生的四元式序列连同符号表一起输出,作为编译程序的最终输出结果;6、对最后的代码优化和目标代码生成要有所考虑,必须留有一定的接口供以后扩展;7、增大程序的可移植性,努力做到整个系统方便移植。
二、详细算法设计词法分析程序 → 语法分析程序 → 语义分析程序 →编译器。
三、流程图图II 递归下降分析程序示意图图III 语句块分析示意图图IV 语句串分析示意图图V 语句分析示意图四、相关函数说明void scanner(); //扫描void lrparser();void staBlock(int *nChain); //语句块void staString(int *nChain); //语句串void sta(int *nChain); //语句void fuzhi(); //赋值语句void tiaojian(int *nChain); //条件语句void xunhuan(); //循环语句char* E(); //Expresiion表达式char* T(); //Term项char* F(); //Factor因子char *newTemp(); //自动生成临时变量void backpatch(int p,int t); //回填int merge(int p1,int p2); //合并p1和p2void emit(char *res,char *num1,char *op,char *num2); //生成四元式五.运行结果图VI 赋值语句的分析图VII 条件语句的分析图VIII 循环语句的分析图IX 综合六.编译器使用说明程序提示用户输入字符串“Please input your source string:”,用户输入字符串并以“#”号结束。
回车后,程序显示运行结果。
七.程序清单#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>char prog[80]; /* 存放所有输入字符 */char token[8]; /* 存放词组 */char ch; /* 单个字符 */int syn,p,m,n,i; /* syn:种别编码 */double sum;int count;int isSignal; /* 是否带正负号(0不带,1负号,2正号) */int isError;int isDecimal; /* 是否是小数 */double decimal; /* 小数 */int isExp; /* 是否是指数 */int index; /* 指数幂 */int isNegative; /* 是否带负号 */double temp;int temp2;int repeat; /* 是否连续出现+,- */int nextq;int kk; /* 临时变量的标号 */int ntc,nfc,nnc,nnb,nna;char *rwtab[9]={"main","int","float","double","char","if","else","do","while"}; struct{char result[10]; /* 字符串(字符数组) */char arg1[10];char opera[10];char arg2[10];}fourCom[20]; /* 结构体数组 */void scanner(); /* 扫描 */void lrparser();void staBlock(int *nChain); /* 语句块 */void staString(int *nChain); /* 语句串 */void sta(int *nChain); /* 语句 */void fuzhi(); /* 赋值语句 */void tiaojian(int *nChain); /* 条件语句 */void xunhuan(); /* 循环语句 */char* E(); /* Expresiion表达式 */char* T(); /* Term项 */char* F(); /* Factor因子 */char *newTemp(); /* 自动生成临时变量 */void backpatch(int p,int t); /* 回填 */int merge(int p1,int p2); /* 合并p1和p2 */void emit(char *res,char *num1,char *op,char *num2); /* 生成四元式 */void main(){ p=0;count=0;isDecimal=0;index=0;repeat=0;kk=0;printf("\nPlease input your source string:\n");do{ch=getchar();prog[p++]=ch;}while(ch!='#');p=0;isError=0;scanner();lrparser();for(i=1;i<nextq;i++) /* 循环输出四元式 */{printf("\n%d\t",i);printf("(%5s %5s %5s \t%5s )\n",fourCom[i].arg1,fourCom[i].opera,fourCom[i].arg2,fourCom[i].result);}}void lrparser(){int nChain;nfc=ntc=1;nextq=1;if(syn==1) /* main */{scanner();if(syn==26) /* ( */{ scanner();if(syn==27) /* ) */{ scanner();staBlock(&nChain);}elseprintf("缺少右括号\n");}elseprintf("缺少左括号\n");}elseprintf("缺少main\n");}/* <语句块> ::= '{'<语句串>'}' */void staBlock(int *nChain) /* 语句块 */{ if(syn==28) /* { */{scanner();staString(nChain);/* backpatch(*nChain,nextq); */if(syn==29) /* } */scanner(); /* 读下一个 */elseprintf("缺少}号\n");}elseprintf("缺少{号\n");}/* <语句串>::=<语句>{;<语句>}; */void staString(int *nChain) /* 语句串 */{sta(nChain);backpatch(*nChain,nextq);while(syn==31) /* ; */{scanner();sta(nChain);}/* backpatch(*nChain,nextq-1); */}void sta(int *nChain) /* 语句 */{if(syn==10){fuzhi();/* *nChain=0; */}else if(syn==6) /* if */{tiaojian(nChain);}else if(syn==8) /* do */xunhuan();}/* <条件语句>->if(<条件>)<语句块> */void tiaojian(int *nChain){char res[10],num1[10],num2[10],op[10]; int nChainTemp;/* <条件>-><表达式><关系运算符><表达式> */ if(syn==6) /* if */{scanner();/* strcpy(num1,E()); */if(syn==26) /* ( */{scanner();strcpy(num1,E());if((syn<=37)&&(syn>=32)){switch(syn){case 32:strcpy(op,">");break;case 33:strcpy(op,">=");break;case 34:strcpy(op,"<");break;case 35:strcpy(op,"<=");break;case 36:strcpy(op,"==");break;case 37:strcpy(op,"!=");break;default:printf("error");}}scanner();strcpy(num2,E());strcat(num1,op);strcat(num1,num2);/* nfc=nextq+1; */ntc=nextq; /* 记住if语句位置 */emit("0","if",num1,"goto");nfc=nextq; /* if中表达式为假 */emit("0","","","goto");/* 第一个0已回填 */backpatch(ntc,nextq); /* ntc链接的所有四元式都回填nextq */ }if(syn==27) /* ) */scanner();staBlock(&nChainTemp); /* 语句块 */*nChain=merge(nChainTemp,nfc);}}/* <循环语句>::=do <语句块>while <条件> */void xunhuan(){char res[10],num1[10],num2[10],op[10];int nChainTemp;if(syn==8) /* do */{nnc=nextq; /* 记住if语句位置,emit之后nextq就变了 */ /* emit("0","if",num1,"goto"); */scanner();staBlock(&nChainTemp); /* 语句块 */if(syn==9) /* while */{scanner();if(syn==26) /* ( */{scanner();strcpy(num1,E());if((syn<=37)&&(syn>=32)){switch(syn){case 32:strcpy(op,">");break;case 33:strcpy(op,">=");break;case 34:strcpy(op,"<");break;case 35:strcpy(op,"<=");break;case 36:strcpy(op,"==");break;case 37:strcpy(op,"!=");break;default:printf("error");}}scanner();strcpy(num2,E());strcat(num1,op);strcat(num1,num2);nnb=nextq;backpatch(nnb,nnc);nna=nextq;emit("0","","","goto");backpatch(nna,nextq);}if(syn==27) /* ) */scanner();}}}void fuzhi() /* 赋值语句只有1个操作数 */ {char res[10],num[10]; /* num操作数 */ if(syn==10) /* 字符串 */{strcpy(res,token); /* 结果 */scanner();if(syn==21) /* = */{scanner();strcpy(num,E());emit(res,num,"=","");}else{printf("缺少=号\n");}}}char* E() /* Expression表达式 */{char *res,*num1,*op,*num2;res=(char *)malloc(10);num1=(char *)malloc(10);op=(char *)malloc(10);num2=(char *)malloc(10);strcpy(num1,T());while((syn==22)||(syn==23)) /* + - */ {if(syn==22) /* + */strcpy(op,"+");elsestrcpy(op,"-");strcpy(num2,T());strcpy(res,newTemp());emit(res,num1,op,num2);strcpy(num1,res);}return num1;}char* T() /* Term项 */{char *res,*num1,*op,*num2;res=(char *)malloc(10);num1=(char *)malloc(10);op=(char *)malloc(10);num2=(char *)malloc(10);strcpy(num1,F());while((syn==24)||(syn==25)) /* * / */{if(syn==24)strcpy(op,"*");elsestrcpy(op,"/");scanner();strcpy(num2,F());strcpy(res,newTemp());emit(res,num1,op,num2);strcpy(num1,res);}return num1;}char* F() /* Factor因子 */{char *res;res=(char *)malloc(10);if(syn==10) /* 字符串 */{strcpy(res,token);scanner();}else if(syn==20) /* 二进制数 */{itoa((int)sum,res,10); /* 整数转换为字符串 */ scanner();}else if(syn==26) /* ( */{res=E();if(syn==27) /* ) */{scanner();}else isError=1;}elseisError=1;return res;}char *newTemp(){char *p;char varTemp[10];p=(char *)malloc(10);kk++;itoa(kk,varTemp,10);strcpy(p+1,varTemp);p[0]='T';return p;}/* 将p所链接的每个四元式的第四个分量都回填t */void backpatch(int p,int t){int w,circle=p;while(circle) /* circle不为0的时候 */{w=atoi(fourCom[circle].result); /* 四元式circle第四分量内容 *//* strcpy(fourCom[circle].result,t); //把t填进四元式circle的第四分量 */ sprintf(fourCom[circle].result,"%d",t);circle=w; /* w记录的是链条上下一个四元式,移动! */} return;}int merge(int p1,int p2) /* 合并p1和p2 */{char circle,nResult;if(p2==0)nResult=p1;else{nResult=circle=p2;while(atoi(fourCom[circle].result)) /* 四元式第四个分量不为0 */{circle=atoi(fourCom[circle].result);sprintf(fourCom[circle].result,"%s",p1);} /* 目的是用p1的值覆盖0 */}return nResult; /* p2是头,p1覆盖0,接在p2后边 */}void emit(char *res,char *num1,char *op,char *num2){strcpy(fourCom[nextq].result,res);strcpy(fourCom[nextq].arg1,num1);strcpy(fourCom[nextq].opera,op);strcpy(fourCom[nextq].arg2,num2);nextq++;}void scanner(){sum=0;decimal=0;m=0;for(n=0;n<8;n++)token[n]=NULL;ch=prog[p++]; /* 从prog中读出一个字符到ch中 */while(ch==' '||ch=='\n') /* 跳过空字符(无效输入) */ch=prog[p++];if(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))) /* ch是字母字符 */{while(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))||((ch>='0')&&(ch<='9'))) {token[m++]=ch; /* ch=>token */ch=prog[p++]; /* 读下一个字符 */}token[m++]='\0';p--; /* 回退一格 */syn=10; /* 标识符 *//* 如果是"begin","if","then","while","do","end"标识符中的一个 */for(n=0;n<9;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}else if((ch>='0')&&(ch<='9')){if(isSignal==1){/* token[m++]='-'; */}while((ch>='0')&&(ch<='9')){sum=sum*10+ch-'0'; /* ch中数字本身是当做字符存放的 */ch=prog[p++];}if(ch=='.'){isDecimal=1;ch=prog[p++];count=0; /* 之前忘了清零,123.123+123.123#两个浮点数就无法识别 */ while((ch>='0')&&(ch<='9')){/* pow(x,y)计算x的y次幂 */temp=(ch-'0')*pow(0.1,++count);decimal=decimal+temp;/* AddToDec(); */ch=prog[p++];}sum=sum+decimal;}if(ch=='e'||ch=='E'){isExp=1;ch=prog[p++];if(ch=='-'){isNegative=1;ch=prog[p++];}while((ch>='0')&&(ch<='9')){/* 指数 */index=index*10+ch-'0';ch=prog[p++];}/* 10的幂 *//* 123e3代表123*10(3) *//* sum=sum*pow(10,index);是错误的 */if(isNegative)sum=sum*pow(0.1,index);elseif(isSignal==1){sum=-sum;isSignal=0;}p--;syn=20;}else switch(ch){case '<':m=0;token[m++]=ch;ch=prog[p++];if(ch=='='){syn=35;token[m++]=ch; }else{syn=34;p--;}break;case '>':m=0;token[m++]=ch;ch=prog[p++];if(ch=='='){syn=33;token[m++]=ch; }else{syn=32;p--;}break;case '=':m=0;token[m++]=ch;ch=prog[p++];syn=36;token[m++]=ch;}else{syn=21;p--;}break;case '+':temp2=prog[p];token[m++]=ch;if((temp2>='0')&&(temp2<='9')&&(repeat==1)){isSignal=2;ch=prog[p++];repeat=0;goto IsNum;}if(((temp2=='+')||(temp2=='-'))&&(repeat==0)) /* 如果重复出现符号,才将后边的+,-视为正负号 */{repeat=1;/* ch=prog[p++]; */}syn=22;break;case '-':temp2=prog[p];token[m++]=ch;if((temp2>='0')&&(temp2<='9')&&(repeat==1)){isSignal=1;ch=prog[p++]; /* 读"-"下一个字符 */repeat=0;goto IsNum; /* 转到数字的识别 */}if(((temp2=='+')||(temp2=='-'))&&(repeat==0)) /* 如果重复出现符号,才将后边的+,-视为正负号 */{repeat=1; /* 预言会重复 *//* ch=prog[p++]; //读下一个字符 */syn=23;break;case '*':temp2=prog[p];token[m++]=ch;if(temp2=='+'){isSignal=2;repeat=1;}else if(temp2=='-') {isSignal=1;repeat=1;}syn=24;break;case '/':syn=25;token[m++]=ch; break;case '(':temp2=prog[p];token[m++]=ch;if(temp2=='+'){isSignal=2;repeat=1;}else if(temp2=='-') {isSignal=1;repeat=1;}syn=26;break;case ')':syn=27;token[m++]=ch; break;case '{':syn=28;token[m++]=ch; break;syn=29;token[m++]=ch;break;case ',':syn=30;token[m++]=ch;break;case ';':syn=31;token[m++]=ch;break;case'#':syn=0;token[m++]=ch;break;default:syn=-1;}getch();}八、总结本次设计的C语言的子集(便于叙述,以后称之为Cxx),是本着简单、易懂、易操作,而且能够完成一定功能的原则,尽量实现最基本的,人们最常用的部分,而抛弃那些不常使用的,或者难以实现的部分。