编译技术课程设计报告书
编译技术课程设计报告
编译技术课程设计班级软件1001学号姓名指导老师2013年 6 月目录一、目的 (2)二、任务及要求 (2)三、实验环境 (4)四、实现过程说明 (4)1.词法分析器 (4)(1)单词符号表 (4)(2)数据结构 (4)(3)函数说明 (5)(4)流程图 (5)2.语法分析器 (7)(1)分析方法说明 (7)(2)文法 (7)(3)数据结构 (9)(4)函数说明 (10)3.中间代码生成器 (10)(1)属性文法 (10)(2)数据结构 (10)(3)函数说明 (11)(4)流程图 (11)五、程序运行结果 (12)六、总结 (19)一、目的<<编译技术>>是理论与实践并重的课程,而其课程设计要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。
从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。
二、任务及要求基本要求:1.词法分析器产生下述小语言的单词序列这个小语言的所有的单词符号,以及它们的种别编码和内码值如下表:对于这个小语言,有几点重要的限制:首先,所有的关键字(如if﹑while等)都是“保留字”。
所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。
例如,下面的写法是绝对禁止的: if(5)=x其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。
也就是说,对于关键字不专设对应的转换图。
但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。
当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。
再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。
例如,一个条件语句应写为 if i>0 i= 1;而绝对不要写成ifi>0 i=1;因为对于后者,我们的分析器将无条件地将ifi看成一个标识符。
《编译技术》课程设计
《编译技术》课程设计一、课程目标知识目标:1. 理解编译技术的概念、原理及作用,掌握编译程序的基本结构;2. 掌握词法分析、语法分析、语义分析及中间代码生成的相关方法;3. 了解目标代码生成、代码优化及运行时存储管理的基本原理。
技能目标:1. 能够运用编译技术进行简单程序的设计与调试;2. 能够运用编译原理对实际问题进行分析,提出解决方案;3. 能够运用相关工具和软件进行编译过程的实践操作。
情感态度价值观目标:1. 培养学生对编译技术学科的兴趣,激发学生主动学习的热情;2. 培养学生严谨的科学态度和良好的团队协作精神;3. 增强学生对我国计算机事业发展的自豪感,树立为祖国信息技术事业作贡献的信念。
课程性质:本课程属于计算机科学与技术专业核心课程,以理论与实践相结合的方式进行教学。
学生特点:学生具备一定的编程基础和计算机科学理论知识,具有较强的逻辑思维能力。
教学要求:结合课程性质、学生特点,注重理论与实践相结合,强调动手实践,培养学生的编译技术实际应用能力。
通过课程学习,使学生能够掌握编译技术的基本知识,具备一定的编译程序设计与调试能力。
同时,注重培养学生的团队合作精神和价值观。
将课程目标分解为具体的学习成果,以便后续的教学设计和评估。
二、教学内容1. 编译技术基础:包括编译程序的作用、编译过程概述、编译程序的组成及结构。
- 教材章节:第1章 编译技术概述2. 词法分析:涉及词法分析器的功能、词法规则、状态转换图、词法分析程序设计。
- 教材章节:第2章 词法分析3. 语法分析:介绍语法分析器的功能、上下文无关文法、递归下降分析、LL(1)分析法、自底向上的语法分析、算符优先分析。
- 教材章节:第3章 语法分析4. 语义分析:语义分析任务、属性文法、语法制导翻译、类型检查、中间代码生成。
- 教材章节:第4章 语义分析5. 代码优化与目标代码生成:包括代码优化方法、基本块优化、目标代码生成、指令选择、寄存器分配。
编译课程设计报告
编译课程设计报告课程设计任务书学生姓名:马惠枝专业班级:计算机0902班指导教师:工作单位:计算机科学与技术学院题目: FOR循环语句的翻译程序设计(LL(1)法、输出四元式)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。
实践:计算机实验室提供计算机及软件环境。
如果自己有计算机可以在其上进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。
(2)完成题目要求的中间代码四元式的描述。
(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。
(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(5)设计报告格式按附件要求书写。
课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。
时间安排:设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试及测试。
周5:撰写课程设计报告。
设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。
设计报告书收取时间:设计周的次周星期一上午10点。
指导教师签名: 2010年 11月23日系主任(或责任教师)签名: 2010年 11月 23日FOR循环语句的翻译程序设计---- LL(1)法、输出四元式1.系统描述1.1程序设计要求通过设计、编制、调试一个FOR( )循环语句的词法、语法及语义分析程序,实现对于FOR( )循环语句的翻译,加深对LL(1)文法的认识,掌握这种自顶向下的文法分析方法。
首先,设计出一个关于FOR( )循环语句的文法,通过消除左递归使它符合LL(1)即递归下降法的要求;然后按照这个文法构造出文法的预测分析表、及文法橘子的分析过程,通过仔细的研究之后设计出一个集词法分析、语法分析和语义分析为一体的程序,从文法开始法号根据相应的产生式推到出相应的句子,最终输出四元式形式的中间代码。
《编译技术》课程设计文档
代码优化 文件 描述 头文件定义基本块存储类型与方法头 Cpp 文件含优化的主方法 调用公共子表达式优化 调用全局寄存器分配 含有划分基本块、生成流图的方法 全局寄存器分配 a) 划分基本块 b) 得到数据流图 c) 到达-定义分析 d) 得出定义-使用链 e) 构建定义-使用网 f) 构建网与网之间的冲突矩阵 g) 使用着色图算法得出寄存器分配结果 消除公共子表达式优化 a) 划分基本块 b) 针对块建立 DAG 图 c) 将 DAG 图反变换成为四元式
)
语句
9
情况语句
switch
(
条件
)
{
情况表
缺省
}
情况表 情况子语句
情况子语句
case
常量
:
语句
缺省
default
:
语句
赋值语句
标识符
=
表达式
条件语句
if
(
条件
)
语句
项
因子 乘法运算符 因子
10
表达式
+
项
加法运算符
项
-
变量定义
类型标识符
标识符
变量说明部分
变量定义
;
声明头部 int 标识符
float
标识符
=
实数
char
标识符
=
字符
小数部分
数字
标识符
字母
字母
数字
有返回值函数定义部分
声明头部
(
参数表
)
复合语句
无返回值函数定义部分
编译技术课程设计报告模板静
编译技术课程设计班级网络1102学号3110610035姓名徐静指导老师年轶2014年6 月目录一、目的 (2)二、题目 (2)三、要求 (2)四、实验环境 (2)五、系统实现 (2)六、程序运行结果 (8)七、总结 (9)一、目的通过《编译原理》课程设计进一步理解高级语言在计算机中的执行过程,加深对编译原理中重点算法和编译技术的理解,掌握词法分析、语法分析、语义分析、代码生成和报错处理等理论与实践的结合,提高自己的编程能力,培养好的程序设计风格。
同时通过某种可视化编程语言的应用,具备初步的Windows环境下的编程思想。
二、题目输入文法,自动生成分析表,并完成语法分析工作三、要求题目3 文法编译器的自动生成器输入文法,自动生成分析表,并完成语法分析工作。
语法分析方法可以是:LL(1)分析法或LR分析法。
为文法构造分析表,并对输入串进行语法分析,判别是否符合语法规则,如果不符合,则输出错误信息。
输入:文法,文法符号串输出:分析表、分析栈、分析结果四、实验环境开发环境Visual Studio6.0语言C++五、系统实现1.分析方法说明所谓LL(1)分析法,就是指从左到右扫描输入串(源程序),同时采用最左推导,且每次直接推导只需向前看一个输入符号,便可确定当前所应当选择的规则。
实现LL(1)分析的程序又称为LL(1)分析程序或LL(1)分析器。
我们知道一个文法要能进行LL(1)分析,那么这个文法应该满足:无二义性,无左递归,无左公因子。
当文法满足条件后,再分别构造文法每个非终结符的FIRST和FOLLOW集合,然后根据FIRST和FOLLOW集合构造LL(1)分析表,最后利用分析表,根据LL(1)语法分析构造一个分析器。
LL(1)的语法分析程序包含了三个部分,总控制程序,预测分析表函数,先进先出的语法分析栈,本程序也是采用了同样的方法进行语法分析,该程序是采用了C++语言来编写。
2.分析表的构造算法在构造LL(1)预测分析表之前,首先要构造该文法的每个非终结符的FIRST和FOLLOW 集合,按照下面描述的算法来构造这两个集合。
编译器-编译原理课程设计报告书
广西大学编译原理课程设计专业:计算机科学与技术姓名:课程:编译原理指导教师:目录一.程序简介与分析---------------------------------------------------------1 二.程序适用范围-----------------------------------------------------------1 三.词法分析---------------------------------------------------------------1 四.语法分析---------------------------------------------------------------3 五.语义分析和中间代码生成------------------------------------------------9 六.代码生成--------------------------------------------------------------11 七.流程图----------------------------------------------------------------12 八.实现------------------------------------------------------------------13 九.程序运行结果----------------------------------------------------------13 十.总结------------------------------------------------------------------18 十一.附录(源程序)--------------------------------------------------------19简单的编译程序设计一.程序简介与分析本程序由四个部分组成:词法分析子程序,语法分析子程序,语义分析子程序,目标代码生成程序。
编译技术课程设计
编译技术课程设计一、教学目标本课程的教学目标是使学生掌握编译技术的基本原理和方法,培养学生运用编译技术解决实际问题的能力。
具体分为以下三个部分:1.知识目标:学生需要了解编译程序的基本概念、编译过程、语法分析、语义分析、目标代码生成和优化技术等基本知识,掌握常用的编译算法和数据结构。
2.技能目标:学生能够运用编译技术解决实际问题,具备编写简单编译程序的能力。
通过课程学习和实践,使学生具备较强的编程能力和问题解决能力。
3.情感态度价值观目标:培养学生对编译技术的兴趣和热情,使学生认识到编译技术在计算机科学领域的重要地位,增强学生的学术追求和创新精神。
二、教学内容本课程的教学内容主要包括以下几个部分:1.编译程序概述:介绍编译程序的定义、分类和功能,编译程序的运行机制和编译过程。
2.词法分析:讲解词法分析的基本概念、词法分析器的实现方法和常用算法。
3.语法分析:介绍语法分析的基本概念、语法分析器的实现方法和常用算法,如递归下降分析法、LL分析法、LR分析法等。
4.语义分析:讲解语义分析的基本概念、语义分析器的实现方法和常用算法,包括类型检查、符号表管理、静态语义分析等内容。
5.目标代码生成与优化:介绍目标代码生成和优化的基本概念、方法和算法,如中间代码生成、代码优化技术等。
6.编译器实现:讲解编译器实现的基本方法和步骤,包括编译器前端和后端的实现技术。
三、教学方法为了提高教学效果,本课程将采用多种教学方法相结合的方式进行教学:1.讲授法:教师通过讲解、举例等方式,向学生传授编译技术的基本概念、原理和方法。
2.讨论法:学生进行课堂讨论,引导学生思考和分析问题,培养学生的创新意识和问题解决能力。
3.案例分析法:通过分析实际案例,使学生更好地理解和掌握编译技术的应用和实现方法。
4.实验法:安排实验课程,让学生亲自动手编写编译程序,培养学生的实际编程能力和实践能力。
四、教学资源为了支持本课程的教学,我们将准备以下教学资源:1.教材:选用权威、实用的编译技术教材,为学生提供系统的理论知识。
编译课程设计报告
编译课程设计报告一、教学目标本课程的教学目标是使学生掌握编译原理的基本概念、方法和算法,培养学生运用编译原理解决实际问题的能力。
具体目标如下:1.知识目标:(1)了解编译原理的基本概念,如编译器、源语言、目标语言等。
(2)掌握编译过程中的各个阶段,如词法分析、语法分析、语义分析、中间代码生成、目标代码生成等。
(3)熟悉常见编译优化技术,如代码简化、死代码消除、循环优化等。
(4)了解编译器实现的基本方法,如递归下降分析、LL分析、LR分析等。
2.技能目标:(1)能够使用编译原理相关工具,如lex、yacc等。
(2)具备简单的编译器设计与实现能力。
(3)能够分析程序的性能,并应用编译优化技术进行优化。
3.情感态度价值观目标:(1)培养学生对编译原理的兴趣,提高学生自主学习的积极性。
(2)培养学生团队合作精神,提高学生解决实际问题的能力。
二、教学内容本课程的教学内容主要包括以下几个部分:1.编译原理基本概念:介绍编译器、源语言、目标语言等基本概念。
2.编译过程及其各个阶段:讲解词法分析、语法分析、语义分析、中间代码生成、目标代码生成等阶段。
3.编译优化技术:介绍代码简化、死代码消除、循环优化等优化技术。
4.编译器实现方法:讲解递归下降分析、LL分析、LR分析等实现方法。
5.编译器工具使用:介绍lex、yacc等工具的使用方法。
6.编译器设计与实现:讲解编译器的设计与实现过程。
三、教学方法本课程采用讲授法、讨论法、案例分析法和实验法等多种教学方法,以激发学生的学习兴趣和主动性。
1.讲授法:用于讲解编译原理的基本概念、方法和算法。
2.讨论法:学生针对编译原理中的重点、难点问题进行讨论,提高学生的理解能力。
3.案例分析法:通过分析实际案例,使学生更好地掌握编译原理的应用。
4.实验法:让学生亲自动手实现简单的编译器,提高学生的实践能力。
四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备等。
1.教材:选用《编译原理》等权威教材,为学生提供系统、科学的学习资料。
编译课程方案课设报告
1.课程设计题目名称:语法高亮转换软件2.课程设计任务目的与任务目的:·通过此次课程设计更深一步了解此法分析·培养解决工程问题的能力,例如方案的制定·了解设计和实现一个实际高级语言编译器所面临的各种问题及其复杂程度。
主要任务:输入:cpp源代码文件,后缀为.cpp的文件;输出:网页文件,后缀为.html 文件;实现功能:将cpp源代码转换成网页文件,在浏览器中打开网页文件时,网页中显示C++源代码并以高亮语法表示显示。
3.设计思想和实现方法设计思想:词法分析程序完成从输入文件中读取字符形式的高级语言源程序,并把输入转化为一个由单词符号组成的流。
构造词法分析器的一种简单办法是用状态转化图来描述源语言词法记号流,然后手工把这种状态转换图翻译成为识别记号的程序。
用这种方法可以产生高效的词法分析器。
实现方法:用C++语言编写一个词法分析器,使之能识别输入串,并把分析结果(单词符号,标识符,关键字等等>输出.输入源程序,输入单词符号,本词法分析器可以辨别关键字,标识符,常数,运算符号和某些界符,运用了文件读入来获取源程序代码,再对该源程序代码进行词法分析,这就是词法分析器的基本功能.当词法分析器调用预处理子程序处理出一串输入字符放进扫描缓冲区之后,分析器就从此缓冲区中逐一识别单词符号.当缓冲区里的字符串被处理完之后,它又调用预处理子程序来处理新串.4.程序说明:程序一开始要求读入一个代码文件,接着把读入的源程序打印出来.然后进行词法分析,程序定义两个数组keyword[60]和cha[31],前者用来存放关键字,后者用来存放中断字符。
从文件中读入字符,与cha[31]中的中断字符相比较。
判断读入的是否为中断字符,如果不是继续读入字符;如果是中断字符,将前面读入的字符放入到一个字符串当中,将此字符串与keyword[60]中存放的关键字比较,如是关键字则做相应处理即着色;如果不是关键字不作处理。
《编译技术》课程设计
《编译技术》课程设计一、教学目标本课程的教学目标是使学生掌握编译技术的基本原理和方法,包括词法分析、语法分析、语义分析、中间代码生成、目标代码生成和优化等主要环节。
通过本课程的学习,学生应能理解并应用编译原理解决实际问题,提高软件开发和维护的效率。
在知识目标方面,学生应掌握编译器的基本架构和各个阶段的主要算法。
在技能目标方面,学生应能够使用现有的编译器工具,并根据实际需要进行简单的编译器设计和实现。
在情感态度价值观目标方面,学生应培养对软件工程的热爱和敬业精神,提高团队合作能力和创新意识。
二、教学内容本课程的教学内容主要包括编译原理的基本概念、编译器的各个阶段以及相关的算法和优化技术。
具体包括:1. 编译原理的基本概念,如编译器的作用、编译过程和编译器的基本架构;2. 词法分析,如词法规则、词法分析器的设计和实现;3. 语法分析,如语法规则、语法分析树和分析算法;4. 语义分析,如类型检查、语义分析和错误处理;5. 中间代码生成,如三地址码和中间代码优化;6. 目标代码生成和优化,如指令选择、代码生成和优化技术。
三、教学方法为了实现本课程的教学目标,我们将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法等。
在教学过程中,我们将注重理论教学与实践相结合,通过生动的案例和实际的编译器工具使学生更好地理解和应用编译原理。
同时,我们将鼓励学生积极参与课堂讨论,提高他们的思考能力和创新意识。
此外,我们还将通过实验课程让学生亲自动手设计和实现简单的编译器,提高他们的实践能力和团队合作能力。
四、教学资源为了支持本课程的教学内容和教学方法,我们将准备一系列教学资源,包括教材、参考书、多媒体资料和实验设备。
教材方面,我们选择《编译原理》一书作为主教材,同时推荐《现代编译原理》等参考书供学生自主学习。
多媒体资料方面,我们将提供课件、教学视频和相关的学术论文等,以丰富学生的学习体验。
实验设备方面,我们将提供计算机实验室,让学生能够在实验课程中亲自动手实践编译原理。
北航编译技术课程设计
北航编译技术课程设计一、课程目标知识目标:1. 理解编译技术的基本概念、原理和流程;2. 掌握词法分析、语法分析、语义分析等编译技术关键环节;3. 了解优化技术及其在编译过程中的应用;4. 掌握目标代码生成与代码优化方法。
技能目标:1. 能够运用编译技术对简单程序进行词法、语法和语义分析;2. 能够编写简单的编译器,实现源代码到目标代码的转换;3. 能够运用优化技术对目标代码进行优化;4. 能够运用所学知识解决实际编译过程中的问题。
情感态度价值观目标:1. 培养学生对编译技术的兴趣,激发学习热情;2. 培养学生的团队协作意识,提高沟通与协作能力;3. 培养学生严谨、细致的学习态度,提高问题解决能力;4. 引导学生关注编译技术在计算机领域的发展趋势,增强社会责任感。
本课程针对北航高年级学生,结合编译技术课程性质,强调理论与实践相结合,注重培养学生的实际动手能力。
课程目标旨在使学生掌握编译技术的基本知识和技能,同时注重培养其情感态度价值观,使学生在掌握专业知识的基础上,具备良好的综合素质。
通过本课程的学习,为学生未来从事计算机领域的研究和工作打下坚实基础。
二、教学内容本章节教学内容主要包括以下几部分:1. 编译技术基本概念:介绍编译器的定义、编译过程、编译器的结构及各阶段的作用;2. 词法分析:讲解词法分析器的功能、词法规则、正则表达式、词法分析器的实现;3. 语法分析:阐述语法分析器的任务、语法规则、自上而下和自下而上的语法分析方法、递归下降分析法、LL(1)分析法等;4. 语义分析:介绍语义分析的作用、语义错误类型、类型检查、符号表管理等;5. 中间代码生成与优化:讲解中间代码的表示、中间代码生成方法、基本优化技术及目标代码生成;6. 目标代码生成与优化:分析目标代码生成策略、汇编代码编写、指令选择、寄存器分配、指令调度等;7. 编译器构造实践:结合实例,指导学生完成一个简单编译器的编写,巩固所学知识。
编译原理课程设计报告(一个完整的编译器)
编译原理程序设计报告一个简单文法的编译器的设计与实现专业班级:计算机1406班组长姓名:宋世波组长学号: ******** 指导教师:肖桐2016年12月设计分工组长学号及姓名:宋世波20143753 分工:文法及数据结构设计词法分析语法分析(LL1)基于DAG的中间代码优化部分目标代码生成组员1学号及姓名:黄润华20143740 分工:中间代码生成(LR0)部分目标代码生成组员2学号及姓名:孙何奇20143754 分工:符号表组织部分目标代码生成摘要编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。
编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。
一.编译器的概述1.编译器的概念编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。
编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。
源代码一般为高阶语言如Pascal、C++、Java 等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。
2.编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。
另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。
交叉编译器在生成新的硬件平台时非常有用。
“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。
例如: 自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。
3.本编译器概述编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。
每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。
编译课程设计报告书
编译课程设计报告书课程设计报告( 2011 -- 2012年度第 1 学期)名称:编译技术课程设计B题目:词法分析器设计算符优先分析程序设计基于算符优先分析方法的语法制导翻译程序设计院系:计算机系班级:网络学号:学生姓名:指导教师:岳燕黄建才设计周数:1周成绩:日期:2012年1月6日一、课程设计的目的与要求1.词法分析器设计的目的与要求1.1 词法分析器设计的目的实验是为计算机科学与技术专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。
通过这个实验,使学生应用编译程序设计的原理和技术设计出词法分析器,了解扫描器的组成结构,不同种类单词的识别方法。
能使得学生在设计和调试编译程序的能力方面有所提高。
为将来设计、分析编译程序打下良好的基础。
1.2 词法分析器设计的要求设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并输出一个单词符号。
为了避免超前搜索,提高运行效率,简化扫描器的设计,假设该程序设计语言中,基本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。
单词符号及其内部表示如表1-1所示,单词符号中标识符由一个字母后跟多个字母、数字组成,常数由多个十进制数字组成。
单词符号的内部表示,即单词的输出形式为二元式:(种别编码,单词的属性值)。
表1-1 单词符号及其内部表示单词符号种别编码单词的属性值BEGIN IF 12——THEN ELSE END标识符整型常数+***()3456789101112———在名字表中的地址十进制整数—————2.算符优先分析程序设计的目的与要求2.1 算符优先分析程序设计的目的本实验是为计算机科学与技术专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。
通过这个实验,使学生应用编译程序设计的原理和技术, 设计、编写和调试算符优先分析程序,了解算符优先分析程序的组成结构,掌握实现通用算符优先分析算法的方法。
编译课程设计报告
编译原理课程设计LL(1)文法判定---c语言实现专业班号____运算机021_____学生姓名____3122020210____指导教师____齐林海________2006年 3 月 6 日目录第一章前言 (1)1.1 LL(1)文法概述 (1)1.2 设计思想概述 (1)第二章语言文法规那么 (1)2.1 语言的词法规那么 (1)2.2 语言的语法规那么 (2)第三章程序设计 (2)3.1 词法分析程序的实现 (2)3.1.1 文法输入规那么 (2)3.1.2 数据结构 (2)3.1.3 程序流程 (4)3.2 求解FIRST集、FOLLOW集和SELECT集的实现 (5)3.2.1 求出能推出的非终结符ε (5)3.2.2 求解产生式的右部的FIRST集 (6)3.2.3 求解非终结符的FOLLOW集 (7)3.2.4 求解产生式的SELECT集 (7)3.3 判定是不是是LL(1)文法的实现 (7)3.4 预测分析表的生成实现 (7)3.5 判定给定符号串是不是是文法中的句子的实现 (8)第四章系统运行及测试 (9)4.1 运行和安装环境 (9)4.2 系统运行 (9)4.2 系统测试 (9)4.2.1 测试一 (9)4.2.2 测试二 (10)第五章结论 (11)5.1 系统结论 (11)5.2 存在的不足 (12)参考文献 (12)附录 (13)源程序 (13)第一章前言本设计利用C语言实现了对简单方式描述的LL(1)文法的判定。
该设计程序实现了:⑴别离求出每一产生式的右部的FIRST 集、每一个非终结符的FOLLOW 集和每一产生式的SELECT集;⑵判定是不是是LL(1)文法;⑶画出预测分析表;⑷对给定的符号串判定是不是是文法中的句子,分析进程用运算机打印出来。
1.1 LL(1)文法概述LL(1)文法是一种2型文法,由它所描述的语言可以使用自顶向下语法分析方法进行语法分析。
LL(1)文法的含义是:第一个L表明自顶向下分析是从左向右扫描输入串,第二个L表明分析过程中将用最左推导,1表明只需向右看一个符号便可决定如何推导即选择哪一个产生式(规则)进行推导。
编译程序设计原理课程设计报告
pos=0; cout<<"请输入一个算术表达式(输入“q”退出) :"<<endl; cin>>expr; if(expr[0]=='q') //检查第一个字符,是否退出? quit=true; else { ans=E_AddSub() if(expr[pos-1]==')'&&expr[pos]!='q') Error(CHAR_AFTER_RIGHT); if(expr[pos]=='(') Error(LEFT_AFTER_NUM); if(expr[pos]!='q') Error(INVALID_CHAR_TAIL); cout<<"计算得出表达式的值为:"<<ans<<endl;exit(0); } } else { //setjmp(errjb)!=0 的情况: cout<<"请重新输入!"<<endl; } } while(!quit); return 0; } int E_AddSub() { int rtn=T_MulDiv(); //计算加减算术表达式的左元 while(expr[pos]=='+'||expr[pos]=='-') { int op=expr[pos++]; int opr2=T_MulDiv(); //计算加减算术表达式的右元 //计算求值 if(op=='+') rtn+=opr2; else rtn-=opr2; } return rtn; } int T_MulDiv() { int rtn=F_Number(); while(expr[pos]=='*'||expr[pos]=='/') {
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告( 2013 – 2014 年度第1学期)名称:编译技术课程设计A 题目:L语言编译器的设计与实现院系:计算机系班级:软件1101学号:学生姓名:指导教师:鲁斌王新颖设计周数: 2 周成绩:日期:2013 年12 月27 日《编译技术》课程设计任务书一、目的与要求1.任务:实现一个简单的编译程序,能够对指定程序设计语言进行编译。
2.目的:加深对课堂讲授知识的理解,熟练掌握编译程序设计原理及常用的技术,建立编译程序的整体概念,使得学生初步具有研究、设计、编制和调试编译程序的能力。
3.要求:熟悉有关定义、概念和实现算法,设计出程序流程框图和数据结构,编写出完整的源程序,进行静态检查,设计出输入数据、显示输出数据;基本功能完善,方便易用,操作无误;通过课程设计学会编译程序设计与实现的常用技术,具备初步分析、设计和开发编译程序的能力,具备分析与检查软件错误、解决和处理实验结果的能力。
4.学生要求人数:2人,1人负责扫描器和目标代码生成器的设计和实现,另1人负责语法分析器和语法制导翻译程序的设计和实现。
二、主要内容下面是课程设计主要内容的简介,详细内容请见《编译技术课程设计指导书》。
1.扫描器设计该扫描器是一个子程序,其输入是源程序字符串,每调用一次输出一个单词符号。
为了避免超前搜索,提高运行效率,简化扫描器的设计,假设程序设计语言中,基本字不能用作一般标识符,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。
2.语法分析器设计以算法优先分析方法为例,设计一个算符优先语法分析程序。
算符优先分析属于自下而上的分析方法,该语法分析程序的输入是终结符号串(即单词符号串,以一个“#”结尾),如果输入串是句子则输出“YES”,否则输出“NO”和错误信息。
当然,也可采用预测分析等方法设计语法分析器,具体方法自定。
3.语法制导翻译程序设计采用语法制导翻译方法,实现算术表达式、赋值语句和基本控制语句等的翻译。
本语法制导翻译程序的输入是终结符号串(即单词符号串,以一个“#”结尾),如果输入符号串是句子,则按照其语义进行翻译,输出等价的四元式序列。
4.目标代码生成器设计将程序设计语言的中间代码程序翻译为目标代码程序,其输入是四元式序列,输出是一个汇编代码文件。
四、设计成果要求1.完成规定的课程设计任务,所设计软件功能符合要求;2.完成课程设计报告,要求格式规范,内容具体而翔实,应体现自身所做的工作,注重对设计思路的归纳和对问题解决过程的总结。
五、考核方式1.平时成绩+验收答辩+实验报告;2.五级分制。
学生姓名:指导教师:鲁斌王新颖2013 年12月16 日本组组员:由我负责语法和语义分析。
一、课程设计的目的与要求1.1 目的通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。
1.2 任务在词法分析程序产生的token文件、符号表文件基础上,完成语法和语义分析,产生相应的中间代码——四元式序列。
在此,可把语法/语义分析作为独立的一遍进行处理。
图1-1采用如下四元式:表1-1二、课程设计正文2.1语法结构如下:L语言定义程序定义:〈程序〉→ program〈标识符〉〈程序体〉.〈程序体〉→〈变量说明〉〈复合句〉变量定义:〈变量说明〉→ var〈变量定义〉|ε〈变量定义〉→〈标识符表〉:〈类型〉;|〈标识符表〉:〈类型〉;〈变量定义〉〈标识符表〉→〈标识符〉,〈标识符表〉|〈标识符〉语句定义:〈复合句〉→ begin〈语句表〉end〈语句表〉→〈执行句〉;〈语句表〉|〈执行句〉〈执行句〉→〈简单句〉|〈结构句〉〈简单句〉→〈赋值句〉〈赋值句〉→〈变量〉:=〈表达式〉〈变量〉→〈标识符〉〈结构句〉→〈复合句〉|〈if句〉|〈WHILE句〉〈if句〉→ if〈布尔表达式〉then〈执行句〉| if〈布尔表达式〉then〈执行句〉else〈执行句〉〈while句〉→ while〈布尔表达式〉do〈执行句〉表达式定义:〈表达式〉→〈算术表达式〉|〈布尔表达式〉〈算术表达式〉→〈算术表达式〉+〈项〉|〈算术表达式〉-〈项〉|〈项〉〈项〉→〈项〉*〈因子〉|〈项〉/〈因子〉|〈因子〉〈因子〉→〈算术量〉|(〈算术表达式〉)〈算术量〉→〈标识符〉|〈整数〉|〈实数〉〈布尔表达式〉→〈布尔表达式〉or〈布尔项〉|〈布尔项〉〈布尔项〉→〈布尔项〉and〈布尔因子〉|〈布尔因子〉〈布尔因子〉→ not〈布尔因子〉|〈布尔量〉〈布尔量〉→〈布尔常数〉|〈标识符〉|(〈布尔表达式〉)|〈关系表达式〉〈关系表达式〉→〈标识符〉〈关系运算符〉〈标识符〉〈关系运算符〉→〈|〈=| =| 〉=| 〉|〈〉类型定义:〈类型名〉→ integer|bool | real单词定义:〈标识符〉→〈字母〉|〈标识符〉〈字母〉|〈标识符〉〈数字〉〈整数〉→〈数字〉|〈整数〉〈数字〉〈实数〉→〈整数〉.|〈实数〉〈数字〉〈布尔常数〉→ true|false字符定义:〈字母〉→A│B│C│D│E│F│G│H│I│J│K│L│M│N│O│P│Q│R│S│T│U│V│W│X│Y│Z│a│b│c│d│e│f│g│h│i│j│k│l│m│n│o│p│q│r│s│t│u│v│w│x│y│z〈数字〉→0│1│2│3│4│5│6│7│8│9源程序书写格式规定(1)单词必须在一行内写完,即:一个单词不能分两行写;(2)源程序语句的书写采用自由格式,即:一行可写多个语句,一个语句也可分多行写;(3)源程序不含注释;(4)语句以“;”结束,“end”前的一个语句的“;”不可以省略。
2.2 数据结构(1)输入token文件、符号表文件,其数据结构与词法分析产生的文件相同。
(2)输出●四元式序列文件,其纪录结构如下:public class FourPart{public string Op{get; set;}public string StrLeft{get; set;}public string StrRight{get; set;}public string JumpNum{get; set;}public bool Input{get; set;}}●符号表文件的结构与输入相同,语法分析中对于符号表不做操作。
2.3程序结构说明为方便编程,将语言文法整理如下:L→S | S ; LS→id := ES→if B then SS→if B then S else SS→while B do SS→begin L end变量说明语句的文法:S→var D|εD→L : K ; | L : K ; DL→i , L | iK→integer | bool | real其中,B表示布尔表达式,E表示算术表达式可采用递归下降分析法或其它方法进行语法分析。
语法/语义分析程序可划分为三个模块,结构如下:图2-1parser为主程序模块,Declear为说明语句分析模块,L_begin为复合语句分析模块。
其中L_begin结构图如下:图2-22.4 经常使用的过程和函数:(1)语法分析器主要算法思想:采用递归下降的方法,根据L语言的定义,依次排除错误情况,最后得出正确的分析结果。
关键在于函数嵌套时层次清晰正确。
●void parser():主要函数,通过if语句判断程序体的结构是否正确。
有关键字program和方法名的错误提醒。
●void ProBody():程序体函数,通过if语句的判断确定程序体是变量说明或复合句。
若错误则有缺少var或缺少begin的提示。
●void VarDef():变量定义函数,确保变量说明的正确结构。
●void ComSent():复合句函数,确保复合句大致结构的正确性。
如果错误将有缺少end的提醒。
●void Expression():表达式,对算术表达式和布尔表达式进行判断。
分别转入相应的子函数。
主要函数:图2-3(2)语义分析器主要算法思想:在语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。
需要进行四元式翻译的只有赋值语句、表达式和if语句、while语句等控制语句。
因此在进行语法分析的过程中只对需要翻译成四元式的输入串进行操作。
建立一个关于四元式的结构体和一个临时变量NewTemp。
●Emit(string op,string srtLeft,string strRight,string jumpNum):生成四元式●NewTemp():产生一个临时变量,返回其在符号表中的入口地址●BackPatch(int addr, int addr2):回填函数,完成四元式转移目标的回填●其他函数与语法分析类似。
三、课程设计总结或结论本次实验比较有难度,刚开始没有思路感觉无从下手,也不太明确最终的结果是什么样子。
虽然安排两周的时间,但是总体看来时间还是有些紧张。
在第一天看了很多资料和指导书之后,我和队友对任务有了一个大概的了解和掌握。
分工后我负责语法和语义的分析。
在语法分析时最后采用递归下降的方法根据L语言的定义对输入的字符串进行排错。
如果最后没有错误出现则说明是正确的。
因为程序分为了好多函数嵌套,所以在进行编程之前先对彼此之间的逻辑关系进行了梳理。
这节省了不少调试的时间。
当然之间也出现过不少的错误,很大程度上考验了我的耐心。
在语义分析器的处理上虽然思路清楚,但是也遇到了问题,即如何回填的问题。
最后在同学的帮助下终于得到解决。
此次实验出现的许多问题一方面让我感受到实际与理论之间的差距,另一方面让我再次巩固了编程的基础知识,也学到了许多书本上学不到的东西。
我认为这其间最重要的是锻炼了我自己解决实际问题的能力和自学能力。
通过对问题的处理也加强了我更上一层楼的决心。
最后,感谢老师的指导!四、参考文献【1】陈火旺, 刘春林等. 程序设计语言编译原理. 国防工业出版社,第三版. 2006.3 【2】宋雨,程晓荣,黄志强.计算机综合实验实践指导.清华大学出版社.2004.2【3】黄贤英、王柯柯,编译原理及实践教程。
北京:清华大学出版社【4】马知行、曹启君,编译方法。
机械工业出版社附录(设计流程图、程序、表格、数据等)设计流程图:程序:语法分析:using System;using System.Collections.Generic; using System.Linq;using System.Text;namespace 编译{public class Grammar{List<token> tokens;List<symble> symbles;public string error = "";int i = 0;public Grammar(Morphology m){tokens = m.tokens;symbles = m.symbles;parser();}private void Next(){if (i < tokens.Count - 1){i++;}}private void Before(){if (i > 0){i--;}}#region 主要函数private void parser(){if (tokens[i].Code == 12)//含有program {Next();if (tokens[i].Code == 18)//是标识符用于方法名 {//执行程序体Next();ProBody(); }else{error = "该程序program缺少方法名";}}else{error = "该程序缺少关键字:program";}}#endregion#region 程序体private void ProBody(){if (tokens[i].Code == 16)//判断var{Next();VarDef();}else if (tokens[i].Code == 2)//判断begin{Next();ComSent();//复合句}else{error = "程序体缺少var或begin";}}#endregion#region 变量定义private void VarDef() {if (IsIdlist()) {Next();if (tokens[i].Code == 29)//:{Next();if (tokens[i].Code == 9 || tokens[i].Code == 3 || tokens[i].Code == 13)//integer,bool,real <类型>{int j = i;j = j - 2;symbles[tokens[j].Addr].Type = tokens[i].Code;j--;while (tokens[j].Code == 28)// ,{j--;symbles[tokens[j].Addr].Type = tokens[i].Code;}Next();if (tokens[i].Code == 30)//;{Next();if (tokens[i].Code== 2){Next();ComSent();//复合句}else{VarDef();//不是则继续变量定义}}else{error = "变量定义后面缺少;";}}else{error = "变量定义缺少类型或类型定义错误"; return;}}else{error = "var后面缺少冒号";}}else{error = "变量定义标识符出错";}}#endregion#region 判断是不是标识符表private bool IsIdlist(){if (tokens[i].Code == 18)//标识符{Next();if (tokens[i].Code == 28)//,如果是,则可以继续<标识符表> {Next();return IsIdlist();}else//如果不是则结束{Before();return true;}}else{return false;}}#endregion#region 复合句〈复合句〉→ begin〈语句表〉endprivate void ComSent(){SentList();//语句表if (error == ""){if (tokens[i].Code == 6)//end{return;}else{error = "复合句末尾缺少end";}}}#endregion#region 语句表〈语句表〉→〈执行句〉;〈语句表〉|〈执行句〉private void SentList(){ExecSent();//执行句if (error == ""){Next();if (tokens[i].Code == 30)//;如果有;则继续<语句表>{Next();SentList();}}}#endregion#region 执行句〈执行句〉→〈简单句〉|〈结构句〉private void ExecSent(){if (tokens[i].Code == 18){Next();Declear();//赋值句}else if (tokens[i].Code == 2 || tokens[i].Code == 8 || tokens[i].Code == 17)//begin if while 〈结构句〉→〈复合句〉|〈if句〉|〈WHILE句〉 {L_Begin();//结构句}else{Before();}}#endregion#region 赋值句〈赋值句〉→〈变量〉:=〈表达式〉private void Declear(){if (tokens[i].Code == 31)//:={Next();Expression();//<表达式>}else{error = "赋值句变量后缺少:=";}}#endregion#region 表达式〈表达式〉→〈算术表达式〉|〈布尔表达式〉private void Expression(){if (tokens[i].Code == 7 || tokens[i].Code == 15 || (tokens[i].Addr != -1 && symbles[tokens[i].Addr].Type == 3))//false ture <布尔常数> {BoolExp();//〈布尔表达式〉→〈布尔表达式〉or〈布尔项〉|〈布尔项〉}else//若不是布尔表达式则是算术表达式{AritExp(); }}#endregion#region 布尔表达式private void BoolExp(){BoolItem();if (error == ""){Next();if (tokens[i].Code == 11){Next();BoolExp();}else//没有or 则认为〈布尔表达式〉→〈布尔项〉{Before();}}else{return;}}#endregion#region 布尔项〈布尔项〉→〈布尔项〉and〈布尔因子〉|〈布尔因子〉 private void BoolItem(){BoolFactor();//布尔因子if (error == ""){Next();if (tokens[i].Code == 1){Next();BoolItem();//<布尔项>}else{Before();}}}#endregion#region 布尔因子〈布尔因子〉→ not〈布尔因子〉|〈布尔量〉private void BoolFactor(){if (tokens[i].Code == 10){Next();BoolFactor();//<布尔因子>}else//否则是<布尔量>{BoolValue();}}#endregion#region 布尔量private void BoolValue(){if (tokens[i].Code == 15 || tokens[i].Code == 7)//ture false {return;}else if (tokens[i].Code == 18)//标识符{Next();if (tokens[i].Code == 34 || tokens[i].Code == 33 ||tokens[i].Code == 32 || tokens[i].Code == 37 || tokens[i].Code == 36 ||tokens[i].Code == 35){//判断是否是<关系运算符>Next();if (tokens[i].Code == 18) //<标识符>{}else{error = "关系运算符后缺少标识符";}}else// 否则认为是<标识符>{Before();}}else if (tokens[i].Code == 21)//( 有(则认为是(〈布尔表达式〉) {BoolExp();//布尔表达式if (tokens[i].Code == 22)//){return;}else{error = "布尔量中的布尔表达式缺少一个)";}}else{error = "布尔量出错";}}#endregion#region 算数表达式private void AritExp(){Item();//项if (error == ""){Next();if (tokens[i].Code == 23 || tokens[i].Code == 24)//+ -{Next();AritExp();}else//否则则是〈算术表达式〉→〈项〉的形式{Before();return;}}else{return;}}#endregion#region 项〈项〉→〈项〉*〈因子〉|〈项〉/〈因子〉|〈因子〉private void Item(){Factor();//因子if (error == ""){Next();if (tokens[i].Code == 25 || tokens[i].Code == 26)//* / 运算符 {Next();Item();// 因子}else //如果没有* /运算符则认为是〈项〉→〈因子〉的形式 {Before();return;}}else{return;}}#endregion#region 因子〈因子〉→〈算术量〉|(〈算术表达式〉)private void Factor(){if (tokens[i].Code == 21)//({Next();AritExp();//<算术表达式>Next();if (tokens[i].Code == 22)//){return;}else{error = "因子中算数表达式缺少)";}}elseCalQua();}}#endregion#region 算数量〈算术量〉→〈标识符〉|〈整数〉|〈实数〉private void CalQua(){if (tokens[i].Code == 18 || tokens[i].Code == 19 || tokens[i].Code == 20)//标识符整数实数{return;}else{error = "算数量出错";}}#endregion#region 结构句〈结构句〉→〈复合句〉|〈if句〉|〈WHILE句〉private void L_Begin(){if (tokens[i].Code == 2) //begin 如果是begin 则认为是<复合句> {Next();ComSent();//复合句}else if (tokens[i].Code == 8)//如果是 if 则认为是<if句>{Next();IfSent();}else if (tokens[i].Code == 17)//如果是 while 则认为是<while 句>Next();WhileSent();}}#endregion#region if语句〈if句〉→ if〈布尔表达式〉then〈执行句〉| if〈布尔表达式〉then〈执行句〉else〈执行句〉private void IfSent(){BoolExp();//<布尔表达式>if (error == ""){Next();if (tokens[i].Code == 14)//then{Next();ExecSent();//<执行句>Next();if (tokens[i].Code == 5)//else{Next();ExecSent();//<执行句>}else{Before();return;}}else{error = "if...then语句缺少then";}}else{error = "if语句布尔表达式出错";}}#endregion#region while语句〈while句〉→ while〈布尔表达式〉do〈执行句〉 private void WhileSent(){BoolExp();//<布尔表达式>if (error == ""){Next();if (tokens[i].Code == 4)//do{Next();ExecSent();//<执行句>}else{error = "while语句缺少do";}}}#endregion}}语义分析主要函数:public Semantic(Morphology m)//词法分析{tokens = m.tokens;symbles = m.symbles;Dispose();//主要函数}#region 创建临时变量private string NewTemp(){string temp = "T" + ti.ToString();ti++;symble s=new symble();=temp;symbles.Add(s);return temp;}#endregion#region 回填函数private void BackPatch(int addr, int addr2){fps[addr].JumpNum = addr2.ToString();}#endregion#region 产生四元式private void Emit(string op, string strLeft, string strRight, string jumpNum){FourPart fp = new FourPart(op, strLeft, strRight, jumpNum);fps.Add(fp);}#endregion#region 主要函数private void Dispose(){if (tokens[i].Code == 12)//含有program{Next();if (tokens[i].Code == 18)//是标识符{Emit("program", tokens[i].Name, "_", "_");//产生四元式 //执行程序体Next();ProBody();//程序体}else{error = "该程序program缺少方法名";}}else{error = "该程序缺少关键字:program";}}#endregion#region 复合句private void ComSent(){SentList();if (error == ""){if (tokens[i].Code == 6)//end{Emit("sys", "_", "_", "_");//产生四元式最后 }else{error = "复合句末尾缺少end";}}}#endregion#region 赋值句private void AssiSent(){if (tokens[i].Code == 31)//:={string temp = tokens[i - 1].Name;Next();Expression();Emit(":=", tt, "_", temp);}else{error = "赋值句变量后缺少:=";}}#endregion#region 布尔量private void BoolValue(ref E e){if (tokens[i].Code == 15 || tokens[i].Code == 7){e.t.Add(fps.Count);e.f.Add(fps.Count + 1);tt = tokens[i].Name;}else if (tokens[i].Code == 18){Next();if (tokens[i].Code == 34 || tokens[i].Code == 33 || tokens[i].Code == 32 || tokens[i].Code == 37 || tokens[i].Code == 36 || tokens[i].Code == 35){Next();if (tokens[i].Code == 18){e.t.Add(fps.Count);e.f.Add(fps.Count + 1);Emit("j" + tokens[i - 1].Name, tokens[i - 2].Name, tokens[i].Name, "-1");Emit("j", "_", "_", "-1");}else{Before();}}else{Before();e.t.Add(fps.Count);e.f.Add(fps.Count + 1);Emit("jnz", tokens[i].Name, "_", "-1");Emit("j", "_", "_", "-1");Next();}}else if (tokens[i].Code == 21) {E e1 = new E();BoolExp(ref e1);e.t = e1.t;e.f = e1.f;if (tokens[i].Code == 22) {return;}}}#endregion运行结果:读取源文件:语法分析:语义分析:。