中南大学《编译原理》上机实习课程实验报告
- 格式:doc
- 大小:51.00 KB
- 文档页数:6
编译原理实验报告一、实验目的和要求本次实验旨在对PL_0语言进行功能扩充,添加新的语法特性,进一步提高编译器的功能和实用性。
具体要求如下:1.扩展PL_0语言的语法规则,添加新的语法特性;2.实现对新语法的词法分析和语法分析功能;3.对扩展语法规则进行语义分析,并生成中间代码;4.验证扩展功能的正确性。
二、实验内容1.扩展语法规则本次实验选择扩展PL_0语言的语句部分,添加新的控制语句,switch语句。
其语法规则如下:<switch_stmt> -> SWITCH <expression> CASE <case_list><default_stmt> ENDSWITCH<case_list> -> <case_stmt> , <case_stmt> <case_list><case_stmt> -> CASE <constant> : <statement><default_stmt> -> DEFAULT : <statement> ,ε2.词法分析和语法分析根据扩展的语法规则,需要对新的关键字和符号进行词法分析,识别出符号类型和记号类型。
然后进行语法分析,建立语法树。
3.语义分析在语义分析阶段,首先对switch语句的表达式进行求值,判断其类型是否为整型。
然后对case语句和default语句中的常量进行求值,判断是否与表达式的值相等。
最后将语句部分生成中间代码。
4.中间代码生成根据语法树和语义分析的结果,生成对应的中间代码。
例如,生成switch语句的跳转表,根据表达式的值选择相应的跳转目标。
5.验证功能的正确性设计一些测试用例,验证新语法的正确性和扩展功能的实用性。
三、实验步骤与结果1.扩展语法规则,更新PL_0语法分析器的词法规则和语法规则。
编译原理实验报告一、实验目的本次编译原理实验的主要目的是通过实践加深对编译原理中词法分析、语法分析、语义分析和代码生成等关键环节的理解,并提高实际动手能力和问题解决能力。
二、实验环境本次实验使用的编程语言为 C/C++,开发工具为 Visual Studio 2019,操作系统为 Windows 10。
三、实验内容(一)词法分析器的设计与实现词法分析是编译过程的第一个阶段,其任务是从输入的源程序中识别出一个个具有独立意义的单词符号。
在本次实验中,我们使用有限自动机的理论来设计词法分析器。
首先,我们定义了单词的种类,包括关键字、标识符、常量、运算符和分隔符等。
然后,根据这些定义,构建了相应的状态转换图,并将其转换为程序代码。
在实现过程中,我们使用了字符扫描和状态转移的方法,逐步读取输入的字符,判断其所属的单词类型,并将其输出。
(二)语法分析器的设计与实现语法分析是编译过程的核心环节之一,其任务是在词法分析的基础上,根据给定的语法规则,判断输入的单词序列是否构成一个合法的句子。
在本次实验中,我们采用了自顶向下的递归下降分析法来实现语法分析器。
首先,我们根据给定的语法规则,编写了相应的递归函数。
每个函数对应一种语法结构,通过对输入单词的判断和递归调用,来确定语法的正确性。
在实现过程中,我们遇到了一些语法歧义的问题,通过仔细分析语法规则和调整函数的实现逻辑,最终解决了这些问题。
(三)语义分析与中间代码生成语义分析的任务是对语法分析所产生的语法树进行语义检查,并生成中间代码。
在本次实验中,我们使用了四元式作为中间代码的表示形式。
在语义分析过程中,我们检查了变量的定义和使用是否合法,类型是否匹配等问题。
同时,根据语法树的结构,生成相应的四元式中间代码。
(四)代码优化代码优化的目的是提高生成代码的质量和效率。
在本次实验中,我们实现了一些基本的代码优化算法,如常量折叠、公共子表达式消除等。
通过对中间代码进行分析和转换,减少了代码的冗余和计算量,提高了代码的执行效率。
编译原理实验报告代码编译原理实验报告代码引言:编译原理是计算机科学中的一门重要课程,它研究的是将高级语言程序转化为机器语言的过程。
在学习编译原理的过程中,实验是不可或缺的一部分。
本文将介绍一段编译原理实验报告代码,通过对该代码的分析和解释,帮助读者更好地理解编译原理的相关概念和原理。
代码说明:本次实验的代码是一个简单的词法分析器,用于将输入的源代码转化为词法单元序列。
代码主要包括以下几个部分:输入缓冲区的定义、词法单元的定义、词法分析器的实现以及主函数的调用。
输入缓冲区:输入缓冲区是一个字符数组,用于存储待分析的源代码。
在代码中,输入缓冲区的大小被定义为一个常量,以保证在不同的机器上都能正常运行。
通过使用指针来指向输入缓冲区的当前位置,可以方便地进行字符的读取和处理。
词法单元:词法单元是编译过程中的基本单位,它由一个词法单元类型和一个属性值组成。
在代码中,词法单元类型被定义为一个枚举类型,包括关键字、标识符、常量等几种类型。
属性值则根据不同的类型而有所不同,例如对于标识符类型的词法单元,属性值是一个字符串,用于存储标识符的具体内容。
词法分析器:词法分析器是将输入的源代码转化为词法单元序列的核心部分。
在代码中,词法分析器通过一个循环来不断读取输入缓冲区中的字符,并根据字符的类型来判断当前词法单元的类型。
对于不同的词法单元类型,词法分析器会将其属性值保存到一个词法单元表中,以便后续的语法分析和语义分析过程使用。
主函数调用:在代码的主函数中,首先初始化输入缓冲区,并将源代码读入到输入缓冲区中。
然后,通过调用词法分析器来获取词法单元序列,并将其输出到屏幕上。
最后,释放输入缓冲区的内存空间,结束程序的运行。
结论:通过对上述代码的分析,我们可以看到编译原理中词法分析的基本过程。
词法分析器通过对输入源代码的扫描和字符的分类,将源代码转化为一个个词法单元,为后续的语法分析和语义分析提供了基础。
在实际的编译器设计中,词法分析器往往是整个编译过程中的第一步,它的正确性和效率对编译器的整体性能有着重要的影响。
编译原理实验报告一、实验目的编译原理是计算机科学中的重要学科,它涉及到将高级编程语言转换为计算机能够理解和执行的机器语言。
本次实验的目的是通过实际操作和编程实践,深入理解编译原理中的词法分析、语法分析、语义分析以及中间代码生成等关键环节,提高我们对编译过程的认识和编程能力。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
此外,还使用了一些相关的编译工具和调试工具,如 GDB 等。
三、实验内容(一)词法分析器的实现词法分析是编译过程的第一步,其任务是将输入的源程序分解为一个个单词符号。
在本次实验中,我们使用有限自动机的理论来设计和实现词法分析器。
首先,定义了各种单词符号的类别,如标识符、关键字、常量、运算符等。
然后,根据这些类别设计了相应的状态转换图,并将其转换为代码实现。
在实现过程中,使用了正则表达式来匹配输入字符串中的单词符号。
对于标识符和常量等需要进一步处理的单词符号,使用了相应的规则进行解析和转换。
(二)语法分析器的实现语法分析是编译过程的核心环节之一,其任务是根据给定的语法规则,分析输入的单词符号序列是否符合语法结构。
在本次实验中,我们使用了递归下降的语法分析方法。
首先,根据实验要求定义了语法规则,并将其转换为相应的递归函数。
在递归函数中,通过对输入单词符号的判断和处理,逐步分析语法结构。
为了处理语法错误,在分析过程中添加了错误检测和处理机制。
当遇到不符合语法规则的输入时,能够输出相应的错误信息,并尝试进行恢复。
(三)语义分析及中间代码生成语义分析的目的是对语法分析得到的语法树进行语义检查和语义处理,生成中间代码。
在本次实验中,我们使用了三地址码作为中间代码的表示形式。
在语义分析过程中,对变量的定义和使用、表达式的计算、控制流语句等进行了语义检查和处理。
对于符合语义规则的语法结构,生成相应的三地址码指令。
四、实验步骤(一)词法分析器的实现步骤1、定义单词符号的类别和对应的正则表达式。
编译实习报告篇一:篇一:编译原理实习报告实习报告【实习目的】1.了解编译器的工作原理2.掌握并加深本学期所学的编译原理的理论知识3.加强自己的动手能力【实习内容】1.编译并运行老师所给的编译器参考代码2.在第一步的基础上进一步改进编译器,增加输入输出功能【开发平台】window系统,free pascal编译器【实习过程】本次实习过程根据实习内容共分两大部分,第一部分,编译运行参考代码;第二部分,进一步改进编译器。
本人在上面的基础上又增加了第三部分的额外修改。
下面便总结这三部分的实习过程:一、增加读写语句前pl0编译程序由于最原始的pl0编译程序所用的pascal版本较老,有些和当前使用版本不兼容。
必须作相应修改,具体是:“object”和“procedure”为pascal的保留字,现分别改成“obj”和“proc”。
此外,原始程序中的“≠”、“≤”和“≥”,不能用ascii 码表示出来,现将其替换成“”、“=”。
作为一个编译程序,支持批量处理和永久保存是其应具备的基本功能。
为此,本程序加入了文件读写功能,即从文件读入pl0源程序,在将中间代码和运行结果写入文件。
由于源程序和原始差别很小,为节省篇幅,不将其打印出来。
二、增加读写语句前pl0调试程序下面是增加读写语句前的pl0程序,包含了乘、除法和寻找两个自然数的最大公因数的过程和主过程,很好的说明了增加读写语句前的pl0语言的使用方法。
constvarx,y,z,q,r; procedure multiply; var a,b; a:=x; begin m=7,n=85;procedure divide; var end; b:=y; z:=0; while b>0 do begin end if odd b then z:=z+a; a:=2*a; b:=b/2;w;beginr:=x;q:=0;w:=y;while wy dobegin q:=2*q; w:=w/2;if wg dobeginif f0 do 13begin13 if odd b then z:=z+a; 20 a:=2*a;24 b:=b/2; 28end28 end;2 int 0 53 lod 1 34 sto 0 35 lod 1 46 sto 0 47 lit 0 08 sto 1 59 lod 0 410 lit 0 011 opr 01212 jpc 02913 lod 0 414 opr 0 615 jpc 02016 lod 1 517 lod 0 318 opr 0 219 sto 1 520 lit 0 221 lod 0 322 opr 0 423 sto 0 324 lod 0 425 lit 0 226 opr 0 527 sto 0 428 jmp 0 929 opr 0 03030 procedure divide;30 var31w;31 begin32r:=x;34q:=0;36w:=y;38while wy do51begin q:=2*q; w:=w/2;59 if w篇二:编译原理实习报告实习报告【实习目的】1.了解编译器的工作原理2.掌握并加深本学期所学的编译原理的理论知识3.加强自己的动手能力【实习内容】1.编译并运行老师所给的编译器参考代码2.在第一步的基础上进一步改进编译器,增加输入输出功能【开发平台】Window系统,Free Pascal编译器【实习过程】本次实习过程根据实习内容共分两大部分,第一部分,编译运行参考代码;第二部分。
编译原理实验报告《编译原理》实验教学⼤纲课程编号:课程名称:编译原理/Compiler Principles实验总学时数:8学时适应专业:计算机科学与技术、软件⼯程承担实验室:计算机科学与技术学院实验中⼼⼀、实验教学的⽬的和任务1.上机实习是对学⽣的⼀种全⾯综合训练,是与课堂听讲、⾃学和练习相辅相成的必不可少的⼀个教学环节。
通常,实习题中的问题⽐平时的练习题要复杂,也更接近实际。
编译原理这门课程安排的2次上机实验都属于⼀种设计类型的实验,每个实验的训练重点在于基本的编译技术和⽅法,⽽不强调⾯⾯俱到;实验的⽬的是旨在使学⽣进⼀步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容;培养学⽣编制算法的能⼒和编程解决实际问题的动⼿能⼒。
2.要求学⽣在上机前应认真做好各种准备⼯作,熟悉机器的操作系统和语⾔的集成环境,独⽴完成算法编制和程序代码的编写;上机时应随带有关的编译原理教材或参考书;要学会程序调试与纠错;每次实验后要交实验报告。
实验报告的内容应包括:(1)封⾯:实验题⽬、班级、学号、姓名、完成⽇期;(2)简要的需求分析与概要设计;(3)详细的算法描述;(4)程序清单与运⾏结果;(5)收获与体会。
实验成绩占编译原理课程结业成绩的10-20%。
⼆、实验项⽬及学时分配三、每项实验的内容和要求要求每个实验保证每个学⽣⼀台微机。
实验⼀(4学时):单词的词法分析程序设计。
1.问题描述:对于常⽤⾼级语⾔(如Pascal、C语⾔)的各类单词进⾏词法分析。
2.实验内容:完成对某⼀种常⽤⾼级语⾔(如Pascal、C语⾔、PL/0语⾔)的各类单词进⾏词法分析,即对源程序从左到右进⾏扫描,对组成源程序的字符串拼接成为单词;并把其转换成属性字输出。
3.实验要求:(1)选择常⽤⾼级程序设计语⾔(如 Pascal、C语⾔、PL/0语⾔)的源程序作为词法分析对象。
(2)根据教学要求和学⽣具体情况,从上列语⾔之⼀中选取它的⼀个适当⼤⼩的⼦集,可以选取⼀类典型单词,也可以尽可能使各种类型的单词都能兼顾到。
编译原理实验报告一、引言编译原理是计算机科学中的重要课程,它研究了将高级语言翻译为机器语言的方法和技术。
编译器作为实现这一目标的关键工具,扮演着至关重要的角色。
本实验报告将介绍编译原理实验的相关内容,包括实验目的、实验环境、实验步骤和实验结果等。
二、实验目的编译原理实验的主要目的是通过设计和实现一个简单的编译器,来加深对编译原理相关概念和技术的理解。
具体目标包括: 1. 理解词法分析、语法分析、语义分析等编译器的基本原理和流程; 2. 掌握使用Lex和Yacc工具进行词法分析和语法分析的方法; 3. 学会使用C/C++等编程语言实现编译器的基本功能。
三、实验环境本实验使用的实验环境包括: 1. 操作系统:Windows 10; 2. 开发工具:Visual Studio Code; 3. 编程语言:C/C++; 4. 辅助工具:Lex、Yacc。
四、实验步骤本实验的主要步骤如下:4.1 设计语言文法在开始实验之前,我们首先需要设计我们要实现的编程语言的文法。
文法是描述编程语言语法结构的形式化规则,它指定了合法的语法结构和语句构造方法。
我们可以使用BNF(巴科斯范式)或EBNF(扩展巴科斯范式)来表示文法。
4.2 实现词法分析器词法分析器的主要任务是将输入的字符流转换为一个个的词法单元(token)。
词法单元是编程语言中的最小语法单位,例如关键字、标识符、常量等。
我们可以使用Lex工具来实现词法分析器,它可以根据我们定义的正则表达式规则来生成词法分析器的代码。
4.3 实现语法分析器语法分析器的主要任务是根据语言文法,将词法单元序列转换为语法树。
语法树是描述程序语法结构的一种树状数据结构,它可以帮助我们理解和处理程序的语义。
我们可以使用Yacc工具来实现语法分析器,它可以根据我们定义的文法规则来生成语法分析器的代码。
4.4 实现语义分析器语义分析器的主要任务是对语法树进行遍历和分析,检查程序中的语义错误并生成中间代码。
编译实习报告一、实习背景随着计算机技术的不断发展,编译技术在软件开发和计算机科学领域中起着至关重要的作用。
为了更好地了解编译原理在实际应用中的具体实现,提高自己的实际动手能力,我参加了为期三个月的编译实习项目。
在实习期间,我深入学习了编译原理的基本知识,并参与了编译器的开发与优化过程。
二、实习内容1. 编译原理学习在实习的第一阶段,我系统地学习了编译原理的基本知识,包括文法、语法分析、中间代码生成、代码优化和目标代码生成等。
通过学习,我掌握了编译器的基本组成部分及其工作原理,为后续的实践操作打下了坚实的基础。
2. 编译器开发在实习的第二阶段,我参与了编译器的开发过程。
首先,我使用C语言编写了一个简单的编译器前端,实现了源代码的词法分析和语法分析。
在此基础上,我进一步实现了中间代码的生成和代码优化模块。
最后,我完成了目标代码的生成和运行。
整个过程中,我深刻体会到了编译原理在实际应用中的重要性。
3. 编译器优化在实习的第三阶段,我主要负责编译器的优化工作。
通过对中间代码的分析和调整,我实现了常数折叠、死代码消除和循环优化等优化策略。
经过优化,编译器生成的目标代码在运行效率和内存占用方面都有了显著的提升。
三、实习收获1. 知识运用通过实习,我将所学的编译原理知识运用到了实际项目中,提高了自己的实际动手能力。
同时,实习过程中遇到的问题也促使我不断深入学习相关知识,提高了自己的理论水平。
2. 团队协作在实习过程中,我与团队成员密切配合,共同解决问题。
这使我更加明白了团队协作的重要性,也锻炼了我的沟通与协作能力。
3. 工程实践实习过程中,我独立完成了编译器的开发与优化任务,掌握了工程实践的基本方法。
这对我今后从事软件开发工作具有很大的帮助。
四、实习总结通过这次编译实习,我对编译原理有了更深入的了解,并在实际项目中积累了宝贵的经验。
同时,实习过程中的挑战和困难也让我明白了自身存在的不足,为我今后的学习和工作指明了方向。
一、实验目的1. 理解编译原理的基本概念和原理。
2. 掌握编译器的各个阶段及其实现方法。
3. 能够运用编译原理的知识解决实际问题。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 20194. 实验内容:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成三、实验内容1. 词法分析(1)实验目的:实现一个简单的词法分析器,将源代码中的字符序列转换为词法符号序列。
(2)实验步骤:1)定义词法符号类型,包括标识符、关键字、运算符、常量等。
2)设计词法分析器算法,对源代码进行遍历,将字符序列转换为词法符号序列。
3)实现词法分析器程序,输出词法符号序列。
(3)实验结果:输入源代码:int a = 10;输出词法符号序列:{<int, int>, <a, a>, <=, =>, <10, 10>, <;, ;>}2. 语法分析(1)实验目的:实现一个简单的语法分析器,将词法符号序列转换为抽象语法树(AST)。
(2)实验步骤:1)定义语法规则,包括产生式、非终结符、终结符等。
2)设计语法分析算法,根据语法规则对词法符号序列进行解析,生成AST。
3)实现语法分析器程序,输出AST。
(3)实验结果:输入词法符号序列:{<int, int>, <a, a>, <=, =>, <10, 10>, <;, ;>}输出AST:```AST:- ExpressionStatement- Expression- BinaryExpression- Identifier: a- Operator: =- Constant: 10```3. 语义分析(1)实验目的:实现语义分析器,对AST进行语义检查,确保程序的正确性。
(2)实验步骤:1)定义语义规则,包括类型检查、作用域检查等。
编译原理上机报告target=blank编译原理上机报告学号: 9761072姓名:褚瑞一.实习目的:通过上机实习加深对编译原理的理解和熟悉编译程序的构造方法。
二.实习方法:出于熟悉编译原理的目的,我用C语言重写了整个程序,由于工作量的原因,没有设计新的程序结构和虚拟机指令等等,全部编译程序源代码包括下列文件:symbol.cpp 用于词法分析declaration.cpp 用于语法分析的声明部分expression.cpp 用于语法分析的表达式处理部分semantic.cpp 用于语法分析的其它部分objcode.cpp 用于生成代码error.cpp 用于错误处理main.cpp 主程序另外,interpret目录下有interpret.cpp和main.cpp,用于编译成为一个虚拟机的解释程序。
全部源代码在Windows 2000 Professional,Visual C++ 6.0以及Red Hat 7.0下编译调试通过。
使用标准C语言编写,从而能在Linux下运行,是我的程序的一个特色。
三.测试程序为了测试所有可能的代码,我编写了下面的测试PL程序。
这个程序可以编译,但是运行起来是没有意义的,它仅仅是为了包括常量,变量,数组等类型,并且包括比较复杂的表达式处理和几乎所有支持的语句,以便对编译程序进行测试。
program pp;const PI=3 testconst='z' testconst1=TRUEtype testtype=BOOLEAN testarray=array[2..20,0..50] of booleanvar n,p:integer cr:charprocedure p1(n:integer;var p:integer);var in_proc:char cr1:testarraybegincr1(2,3):=cr1(n,cr1(n,p))+ p;in_proc:=2+p*(testconst+1);if n<=1 thenwhile testconst1 do n:=PIelseif p>1 thenbeginp:=n*p;n:=p/n;end;call p1(n,cr1(2,5));end;begincall read(n);call p1(n,p);call write(p)end.为了测试运行的情况,我们编写一个稍稍简单的例子,这是参考教材中求阶乘的源程序:program pp;var n,p:integerprocedure p1(n:integer;var p:integer);var in_proc:charbeginif n<=1 then p:=1elsebegincall p1(n-1,p);p:=n*pendend;begincall read(n);call p1(n,p);call write(p)end.四.编译结果采用编译程序对这两个PL源程序进行编译。
编译原理课程实验上机实习中南大学计算机0706班方文一、目的加强学生对编译过程的整体认识,而不是个别阶段的实习。
二、实习要求扩充语句部分:for语句、repeat语句、case语句;三、PL语言及其编译程序1.词法分析2.语法分析3.语义分析及中间代码生成4.汇编代码生成四、扩充1.扩充repeat语句扩充文法<循环语句>::=”repeat”<语句>”until”<表达式>扩充函数:详见文件夹Assignment运行示例:示例代码:program pp;var n,p:integer;procedure p2(n:integer);beginrepeatbegincall write(n);n:=n-1enduntil n=0end;begincall p2(5)end.生成中间代码:0 JMP 0 , 15 ------> 无条件跳转1 JMP 0 ,2 ------> 无条件跳转2 ENTP 2 , 4 ------> 进入过程3 LOD 2 , 3 ------> 装入变量值4 WRITE 0 , 0 ------> 写指令5 LODA 2 , 3 ------> 装入变量地址6 LOD 2 , 3 ------> 装入变量值7 LIT 0 , 1 ------> 装入常量8 SUB 0 , 0 ------> 减9 STO 0 , 0 ------> 将栈顶值存入栈顶次值所指单元10 LOD 2 , 3 ------> 装入变量值11 LIT 0 , 0 ------> 装入常量12 EQ 0 , 0 ------> ==13 JPC 0 , 3 ------> 栈顶值为0时跳转14 RETP 0 , 0 ------> 过程返回15 ENTP 1 , 4 ------> 进入过程16 OPAC 0 , 0 ------> 打开活动记录17 LIT 0 , 5 ------> 装入常量18 CALL 1 , 2 ------> 转子19 ENDP 0 , 0 ------> 程序结束解释运行结果:Your Output:5Your Output:4Your Output:3Your Output:2Your Output:12.扩充for语句扩充文法<循环语句>::=“for”“(”<赋值语句> “;”<表达式> “;”<语句> “)”扩充函数详见文件夹Assignment运行示例示例代码:program pp;var n,p:integer;procedure p1(n:integer;var p:integer);beginfor(p:=1;p<=5;p:=p+1)begincall write(p);endend;begincall read(n);call p1(n,p);call read(n);end.生成中间代码:0 JMP 0 , 19 ------> 无条件跳转1 JMP 0 ,2 ------> 无条件跳转2 ENTP 2 , 5 ------> 进入过程3 LOD 2 ,4 ------> 装入变量值4 LIT 0 , 1 ------> 装入常量5 STO 0 , 0 ------> 将栈顶值存入栈顶次值所指单元6 ILOD 2 , 4 ------> 间接装入7 LIT 0 , 5 ------> 装入常量8 LEQ 0 , 0 ------> <=9 JPC 0 , 18 ------> 栈顶值为0时跳转10 LOD 2 , 4 ------> 装入变量值11 ILOD 2 , 4 ------> 间接装入12 LIT 0 , 1 ------> 装入常量13 ADD 0 , 0 ------> 加14 STO 0 , 0 ------> 将栈顶值存入栈顶次值所指单元15 ILOD 2 , 4 ------> 间接装入16 WRITE 0 , 0 ------> 写指令17 JMP 0 , 6 ------> 无条件跳转18 RETP 0 , 0 ------> 过程返回19 ENTP 1 , 5 ------> 进入过程20 LODA 1 , 3 ------> 装入变量地址21 READ 0 , 0 ------> 读指令22 OPAC 0 , 0 ------> 打开活动记录23 LOD 1 , 3 ------> 装入变量值24 LODA 1 , 4 ------> 装入变量地址25 CALL 1 , 2 ------> 转子26 LODA 1 , 3 ------> 装入变量地址27 READ 0 , 0 ------> 读指令28 ENDP 0 , 0 ------> 程序结束解释运行结果:29翻译开始Your Output:2Your Output:3Your Output:4Your Output:5Your Output:6翻译结束。
3.扩充case语句文法扩充<判断语句>::= “case” <表达式> “of”<表达式> “:”<语句> “;”{<表达式>”:”<语句>”;”}“end”case E ofC1: ;C2: ;C3: S3;......C n: S nend代码结构T:=E;L1: if T!= C1 goto L2S1的代码goto nextL2: if E!= C2 goto L3S2的代码goto next......Ln: Sn的代码next:运行示例示例代码:program pp;var n,p:integer;procedure p1(n:integer;var p:integer); begincall read(p);case p of1:begincall write(1);end2:begincall write(2);endendend;begincall read(n);call p1(n,p);call read(p)end.生成中间代码:0 JMP 0 , 20 ------> 无条件跳转1 JMP 0 ,2 ------> 无条件跳转2 ENTP 2 , 5 ------> 进入过程3 LOD 2 ,4 ------> 装入变量值4 READ 0 , 0 ------> 读指令5 ILOD 2 , 4 ------> 间接装入6 LIT 0 , 1 ------> 装入常量7 EQ 0 , 0 ------> ==8 JPC 0 , 12 ------> 栈顶值为0时跳转9 LIT 0 , 1 ------> 装入常量10 WRITE 0 , 0 ------> 写指令11 JMP 0 , 19 ------> 无条件跳转12 ILOD 2 , 4 ------> 间接装入13 LIT 0 , 2 ------> 装入常量14 EQ 0 , 0 ------> ==15 JPC 0 , 19 ------> 栈顶值为0时跳转16 LIT 0 , 2 ------> 装入常量17 WRITE 0 , 0 ------> 写指令18 JMP 0 , 19 ------> 无条件跳转19 RETP 0 , 0 ------> 过程返回20 ENTP 1 , 5 ------> 进入过程21 LODA 1 , 3 ------> 装入变量地址22 READ 0 , 0 ------> 读指令23 OPAC 0 , 0 ------> 打开活动记录24 LOD 1 , 3 ------> 装入变量值25 LODA 1 , 4 ------> 装入变量地址26 CALL 1 , 2 ------> 转子27 LODA 1 , 4 ------> 装入变量地址28 READ 0 , 0 ------> 读指令29 ENDP 0 , 0 ------> 程序结束运行结果:30翻译开始case1:Your Input:1Your Input:1Your Output:1翻译结束。
Case2:Your Input:1Your Input:2Your Output:2翻译结束。
五、感受通过这次上机实习,我对编译原理这门课又有了新的认识,课上所学的知识大部分都是很理论、很抽象的,如果不自己亲手实践一下,对一些知识点还是不能很好的理解。
首先,看懂老师所给的源程序是十分场重要的,当然,这也是一个很痛苦的过程,需要花费大量的时间,而且还很可能理解得不正确(开始我对怎样回填就没弄懂)。
把源程序弄懂后,编程的任务量要相对小一些(case可能难一些),这之后的调试也是比较困难的,可能自己看自己的程序可能怎么检查都没有错(特别是在逻辑方面),所以最好是请其他一些同学一起调试。
最后,在此感谢老师给了我们一次动手实践的机会,这项活动是非常有意义的。