编译原理综合性实验报告-分析中间代码生成程序分析
中间代码生成实验报告
一、实验目的1. 理解编译原理中中间代码生成的基本概念和作用。
2. 掌握中间代码生成的常用算法和策略。
3. 提高对编译器构造的理解和实际操作能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:Java3. 开发工具:Eclipse三、实验内容1. 中间代码生成的基本概念2. 中间代码的表示方法3. 中间代码生成算法4. 实现一个简单的中间代码生成器四、实验步骤1. 了解中间代码生成的基本概念中间代码生成是编译过程中的一个重要环节,它将源程序转换成一种中间表示形式,便于后续的优化和目标代码生成。
中间代码生成的目的是提高编译器的灵活性和可维护性。
2. 研究中间代码的表示方法中间代码通常采用三地址代码(Three-Address Code,TAC)表示。
TAC是一种低级表示,由三个操作数和一个操作符组成,例如:(t1, t2, t3) = op,其中t1、t2、t3为临时变量,op为操作符。
3. 学习中间代码生成算法中间代码生成算法主要包括以下几种:(1)栈式中间代码生成算法(2)归约栈中间代码生成算法(3)递归下降中间代码生成算法4. 实现一个简单的中间代码生成器本实验采用递归下降中间代码生成算法,以一个简单的算术表达式为例,实现中间代码生成器。
(1)定义语法规则设表达式E由以下语法规则表示:E → E + T | E - T | TT → T F | T / F | FF → (E) | i(2)设计递归下降分析器根据语法规则,设计递归下降分析器,实现以下功能:①识别表达式E②识别项T③识别因子F(3)生成中间代码在递归下降分析器中,针对不同语法规则,生成相应的中间代码。
例如:当遇到表达式E时,生成以下中间代码:(t1, t2, t3) = op1(t1, t2) // op1表示加法或减法(t4, t5, t6) = op2(t4, t5) // op2表示乘法或除法(t7, t8, t9) = op3(t7, t8) // op3表示赋值(4)测试中间代码生成器编写测试用例,验证中间代码生成器的正确性。
编译原理实验报告
编译原理实验报告一、实验目的和要求本次实验旨在对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。
三、实验内容(一)词法分析器的设计与实现词法分析是编译过程的第一个阶段,其任务是从输入的源程序中识别出一个个具有独立意义的单词符号。
在本次实验中,我们使用有限自动机的理论来设计词法分析器。
首先,我们定义了单词的种类,包括关键字、标识符、常量、运算符和分隔符等。
然后,根据这些定义,构建了相应的状态转换图,并将其转换为程序代码。
在实现过程中,我们使用了字符扫描和状态转移的方法,逐步读取输入的字符,判断其所属的单词类型,并将其输出。
(二)语法分析器的设计与实现语法分析是编译过程的核心环节之一,其任务是在词法分析的基础上,根据给定的语法规则,判断输入的单词序列是否构成一个合法的句子。
在本次实验中,我们采用了自顶向下的递归下降分析法来实现语法分析器。
首先,我们根据给定的语法规则,编写了相应的递归函数。
每个函数对应一种语法结构,通过对输入单词的判断和递归调用,来确定语法的正确性。
在实现过程中,我们遇到了一些语法歧义的问题,通过仔细分析语法规则和调整函数的实现逻辑,最终解决了这些问题。
(三)语义分析与中间代码生成语义分析的任务是对语法分析所产生的语法树进行语义检查,并生成中间代码。
在本次实验中,我们使用了四元式作为中间代码的表示形式。
在语义分析过程中,我们检查了变量的定义和使用是否合法,类型是否匹配等问题。
同时,根据语法树的结构,生成相应的四元式中间代码。
(四)代码优化代码优化的目的是提高生成代码的质量和效率。
在本次实验中,我们实现了一些基本的代码优化算法,如常量折叠、公共子表达式消除等。
通过对中间代码进行分析和转换,减少了代码的冗余和计算量,提高了代码的执行效率。
编译原理语义分析与中间代码生成
编译原理语义分析与中间代码生成在编译原理中,语义分析是编译器的重要组成部分之一,它负责验证和处理源代码中的语义信息,为后续的中间代码生成做准备。
本文将介绍语义分析的基本概念和流程,并探讨中间代码生成的相关技术。
一、语义分析的基本概念和流程语义分析是指对源代码进行语义检查和语义信息提取的过程。
其主要目标是确保源代码在语义上是正确的,并从中提取出各种语义信息,以便后续阶段使用。
语义分析的基本流程如下:1. 词法分析和语法分析:在进行语义分析之前,需要先对源代码进行词法分析和语法分析,以便将代码转化为具有结构的中间表示形式(如抽象语法树)。
2. 符号表的构建:符号表是语义分析的重要数据结构,用于存储程序中出现的各种标识符及其相关信息,如类型、作用域等。
在语义分析阶段,需要构建符号表并实时更新。
3. 类型检查:类型检查是语义分析的核心任务之一。
它通过对表达式、赋值语句、函数调用等进行类型推导和匹配,来验证程序是否存在类型错误。
4. 语义规则检查:除了类型检查外,语义分析还需要检查程序是否符合语言规范中的其他语义规则,如变量是否已声明、函数调用是否正确等。
5. 语义信息提取:语义分析还负责提取源代码中的各种语义信息,如函数调用关系、变量的定义和引用关系、控制流信息等。
这些信息将为后续的代码优化和代码生成提供依据。
二、中间代码生成的相关技术中间代码是指某种形式的中间表示形式,通常与源代码和目标代码之间存在一定的映射关系。
它在编译过程中起到连接前后两个阶段的桥梁作用,并且可以进行一些优化。
常见的中间代码形式之一是三地址码。
三地址码是一种低级的代码表示形式,每条指令最多包含三个操作数。
它具有简洁明了的特点,适合进行后续的优化工作。
在进行中间代码生成时,需要考虑以下几个方面的技术:1. 表达式的翻译:在将源代码转化为中间代码时,需要将源代码中的表达式进行翻译。
这包括对表达式的计算顺序、运算符优先级等方面的处理。
2. 控制流的处理:在编译过程中,需要将源代码中的控制流转化为中间代码中的条件分支和循环结构。
编译原理实验报告
编译原理实验报告一、实验目的编译原理是计算机科学中的重要学科,它涉及到将高级编程语言转换为计算机能够理解和执行的机器语言。
本次实验的目的是通过实际操作和编程实践,深入理解编译原理中的词法分析、语法分析、语义分析以及中间代码生成等关键环节,提高我们对编译过程的认识和编程能力。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
此外,还使用了一些相关的编译工具和调试工具,如 GDB 等。
三、实验内容(一)词法分析器的实现词法分析是编译过程的第一步,其任务是将输入的源程序分解为一个个单词符号。
在本次实验中,我们使用有限自动机的理论来设计和实现词法分析器。
首先,定义了各种单词符号的类别,如标识符、关键字、常量、运算符等。
然后,根据这些类别设计了相应的状态转换图,并将其转换为代码实现。
在实现过程中,使用了正则表达式来匹配输入字符串中的单词符号。
对于标识符和常量等需要进一步处理的单词符号,使用了相应的规则进行解析和转换。
(二)语法分析器的实现语法分析是编译过程的核心环节之一,其任务是根据给定的语法规则,分析输入的单词符号序列是否符合语法结构。
在本次实验中,我们使用了递归下降的语法分析方法。
首先,根据实验要求定义了语法规则,并将其转换为相应的递归函数。
在递归函数中,通过对输入单词符号的判断和处理,逐步分析语法结构。
为了处理语法错误,在分析过程中添加了错误检测和处理机制。
当遇到不符合语法规则的输入时,能够输出相应的错误信息,并尝试进行恢复。
(三)语义分析及中间代码生成语义分析的目的是对语法分析得到的语法树进行语义检查和语义处理,生成中间代码。
在本次实验中,我们使用了三地址码作为中间代码的表示形式。
在语义分析过程中,对变量的定义和使用、表达式的计算、控制流语句等进行了语义检查和处理。
对于符合语义规则的语法结构,生成相应的三地址码指令。
四、实验步骤(一)词法分析器的实现步骤1、定义单词符号的类别和对应的正则表达式。
编译原理实验报告
编译原理实验报告编译原理实验报告一、实验目的1. 了解编译器的基本原理和工作过程;2. 掌握编译器设计和实现的基本方法和技巧;3. 通过设计和实现一个简单的编译器,加深对编程语言和计算机系统的理解和认识。
二、实验原理编译器是将高级语言程序翻译成机器语言程序的一种软件工具。
它由编译程序、汇编程序、链接程序等几个阶段组成。
本次实验主要涉及到的是编译程序的设计和实现。
编译程序的基本原理是将高级语言程序转换为中间代码,再将中间代码转换为目标代码。
整个过程可以分为词法分析、语法分析、语义分析、代码生成和代码优化几个阶段。
三、实验内容本次实验的设计目标是实现一个简单的四则运算表达式的编译器。
1. 词法分析根据规定的语法规则,编写正则表达式将输入的字符串进行词法分析,将输入的四则运算表达式划分成若干个单词(Token),例如:运算符、操作数等。
2. 语法分析根据定义的语法规则,编写语法分析程序,将词法分析得到的Token序列还原成语法结构,构建抽象语法树(AST)。
3. 语义分析对AST进行遍历,进行语义分析,判断表达式是否符合语法规则,检查语义错误并给出相应的提示。
4. 代码生成根据AST生成目标代码,目标代码可以是汇编代码或者机器码。
四、实验过程和结果1. 首先,根据输入的表达式,进行词法分析。
根据所定义的正则表达式,将输入的字符串划分成Token序列。
例如:输入表达式“2+3”,经过词法分析得到的Token序列为["2", "+", "3"]。
2. 然后,根据语法规则,进行语法分析。
根据输入的Token序列,构建抽象语法树。
3. 接着,对抽象语法树进行语义分析。
检查表达式是否符合语法规则,给出相应的提示。
4. 最后,根据抽象语法树生成目标代码。
根据目标代码的要求,生成汇编代码或者机器码。
五、实验总结通过本次实验,我对编译器的工作原理有了更深入的认识,掌握了编译器设计和实现的基本方法和技巧。
中间代码生成实验报告
一、实验目的通过在实验二的基础上,增加中间代码生成部分,使程序能够对实验二中的识别出的赋值语句,if语句和while语句进行语义分析,生成四元式中间代码。
二、实验方法实验程序由c语言完成,在Turboc 2.0环境中调试通过。
语义分析程序的基本做法是对文法中的每个产生式分别编写一个语义分析子程序,当程序语法部分进行推倒或规约时,就分别调用各自的语义分析程序。
当语法分析结束时,语义分析也就结束了。
在本实验程序中,当语法分析部分识别出语法正确的句子时,就进入content函数(当语法分析识别出不正确的句子时,不进入content函数,也就是不进行语义分析),然后根据句子的类型进行分类,进入不同的语义处理部分。
对于赋值语句,关键是产生正确的处理算术表达式E的四元式。
程序中的ec函数的功能就是产生算术表达式的四元式,在ec函数中使用了两个栈idshed,opshed,分别是算术表达式的数据栈和符号栈。
每次提取一个数字和一个算符,然后将算符与与栈顶算符进行优先级比较,优先级高则将单前数字和算符进栈,低或者相等的话则将当前栈顶元素进行合并,产生四元式。
直至整个算术表达式结束。
其中还有一些细节问题,具体的做法可以参看程序。
对于实验给定的if语句的文法格式,条件判断式C只中可能是>或者<=两种关系,不可能是布尔表达式,这样程序就简单的多了。
通过ec函数可以产生条件判断式C中的E的四元式,然后只要加上转向四元式就可以了。
本实验程序中只给出真出口的转向四元式,没有给出假出口的转向四元式,这在实际中是不可以的,但在本实验中,实际上是对每条独立的语句进行语法分析,给出假出口转向四元式实际上意义不大,而且假出口转向语句的转移目标必须要到整个语句分析结束以后才可以知道,这样就要建立栈,然后回填,这样会使程序复杂很多,所以没有加上假出口转向四元式。
对于while语句,具体的做法和if语句差不多,所不同的是当while语句结束时,要多出一条无条件转向四元式,重新转到条件判断式C的第一条四元式。
中间代码生成实验报告
中间代码生成实验报告《中间代码生成实验报告》摘要:本实验旨在通过编写中间代码生成程序,实现将高级语言源代码转换为中间代码的功能。
通过实验,我们掌握了中间代码的生成过程和相关算法,并对编译器的工作原理有了更深入的理解。
本实验采用了C语言作为源语言,通过词法分析、语法分析和语义分析,生成了对应的中间代码。
一、实验目的1. 理解编译器的工作原理,掌握中间代码生成的基本概念和方法;2. 掌握中间代码的表示方法和生成算法;3. 通过实践,提高编程能力和对编译原理的理解。
二、实验环境1. 操作系统:Windows 10;2. 编程语言:C语言;3. 开发工具:Visual Studio 2019。
三、实验内容1. 设计并实现中间代码生成程序,将给定的C语言源代码转换为中间代码;2. 实现词法分析、语法分析和语义分析,生成对应的中间代码;3. 测试程序,验证中间代码的正确性和有效性。
四、实验步骤1. 设计中间代码的表示方法,包括四元式、三地址码等;2. 实现词法分析器,将源代码转换为词法单元序列;3. 实现语法分析器,将词法单元序列转换为语法树;4. 实现语义分析器,对语法树进行语义检查并生成中间代码;5. 测试程序,验证中间代码的正确性和有效性。
五、实验结果经过测试,中间代码生成程序能够正确地将C语言源代码转换为中间代码,并且生成的中间代码能够正确地表达源代码的语义和逻辑结构。
通过实验,我们成功地掌握了中间代码的生成过程和相关算法,加深了对编译器工作原理的理解。
六、实验总结通过本次实验,我们深入了解了编译器的工作原理和中间代码生成的基本概念和方法。
通过实践,我们提高了编程能力和对编译原理的理解,为进一步深入学习编译原理和设计编译器打下了良好的基础。
希望通过不断的实践和学习,能够更加熟练地掌握编译原理的知识,为今后的学习和工作打下坚实的基础。
编译原理中间代码生成实验报告
竭诚为您提供优质文档/双击可除编译原理中间代码生成实验报告篇一:编译原理-分析中间代码生成程序实验报告课程名称编译原理实验学期至学年第学期学生所在系部年级专业班级学生姓名学号任课教师实验成绩计算机学院制开课实验室:年月日篇二:编译原理实验中间代码生成实验四中间代码生成一.实验目的:掌握中间代码的四种形式(逆波兰式、语法树、三元式、四元式)。
二.实验内容:1、逆波兰式定义:将运算对象写在前面,而把运算符号写在后面。
用这种表示法表示的表达式也称做后缀式。
2、抽象(语法)树:运算对象作为叶子结点,运算符作为内部结点。
3、三元式:形式序号:(op,arg1,arg2)4、四元式:形式(op,arg1,arg2,result)三、以逆波兰式为例的实验设计思想及算法(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。
(2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。
(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。
(4)如果不是数字,该字符则是运算符,此时需比较优先关系。
做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。
如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。
倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。
(5)重复上述操作(1)-(2)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。
四、程序代码://这是一个由中缀式生成后缀式的程序#include#include#include#include#definemaxbuffer64voidmain(){chardisplay_out(charout_ch[maxbuffer],charch[32]);//intcaculate_array(charout_ch[32]);staticinti=0;staticintj=0;charch[maxbuffer],s[maxbuffer],out[maxbuffer];cout cin>>ch;for(i=0;i {out[i]=ch[i];}cout while(out[j]!=#)cout j++;}cout display_out(s,out);//caculate_array;}chardisplay_out(charout_ch[32],charch[]) {inttop=-1;inti=0,data[maxbuffer],n;intj=0;charsta[20];while(ch[i]!=#){if(isalnum(ch[i])){while(isalnum(ch[i])){out_ch[j]=ch[i];j++;i++;}out_ch[j]=;j++;else{switch(ch[i]){case+:case-:if(sta[top]==(||top==-1) {top++;sta[top]=ch[i];i++;}else{//j--;out_ch[j]=sta[top];j++;top--;//i++;}break;//break;case*:case/:if(sta[top]==*/) {out_ch[j]=sta[top];j++;//i++;top--;}else{top++;sta[top]=ch[i];i++;}break;//break;case(:top++;sta[top]=ch[i];i++;break;case):if(sta[top]==() {top--;i++;}if(top==-1){//cout }else{//while(sta[top]!=?(?){ out_ch[j]=sta[top];top--;j++;//}break;}break;/*case?#?:out_ch[j]=?#?; j++;break;*/default:cout ch[i]=#;j=0;break;}}}while(top!=-1){out_ch[j]=sta[top];j++;top--;}out_ch[j]=#;n=0;co(:编译原理中间代码生成实验报告)utwhile(out_ch[n]!=#){cout n++;}cout j=0;returnout_ch[maxbuffer];}五、实验结果:要求:自己给出3个测试用例,观察结果。
编译原理实验四语义分析及中间代码生成
编译原理实验四语义分析及中间代码⽣成⼀、实验⽬的(1)通过上机实验,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法范畴变换为某种中间代码的语义翻译⽅法。
(2)掌握⽬前普遍采⽤的语义分析⽅法─语法制导翻译技术。
(3)给出 PL/0 ⽂法规范,要求在语法分析程序中添加语义处理,对于语法正确的表达式,输出其中间代码;对于语法正确的算术表达式,输出其计算值。
⼆、实验内容(1)语义分析对象重点考虑经过语法分析后已是正确的语法范畴,本实验重点是语义⼦程序。
已给 PL/0 语⾔⽂法,在实验⼆或实验三的表达式语法分析程序⾥,添加语义处理部分,输出表达式的中间代码,⽤四元式序列表⽰。
(2) PL/0 算术表达式的语义计算:PL/0 算术表达式,例如:2+35 作为输⼊。
输出: 17PL/0 表达式的中间代码表⽰:PL/0 表达式,例如: a(b+c)。
输出: (+,b,c,t1)(,a,t1,t2)三、设计思想1.原理属性⽂法:是在上下⽂⽆关⽂法的基础上为每个⽂法符号(终结符或⾮终结符)配备若⼲个相关的“值”(称为属性)。
属性:代表与⽂法符号相关的信息,和变量⼀样,可以进⾏计算和传递。
综合属性:⽤于“⾃下⽽上”传递信息。
在语法树中,⼀个结点的综合属性的值,由其⼦结点的属性值确定。
S—属性⽂法:仅仅使⽤综合属性的属性⽂法。
语义规则: 属性计算的过程即是语义处理的过程。
对于⽂法的每⼀个产⽣式配备⼀组属性的计算规则,则称为语义规则。
(1)终结符只有综合属性,它由词法分析器提供。
(2)⾮终结符既可以有综合属性也可以有继承属性,⽂法开始符号的所有继承属性作为属性计算前的初始值。
(3)产⽣式右边符号的继承属性和产⽣式左边符号的综合属性都必须提供⼀个计算规则。
(4)产⽣式左边符号的继承属性和产⽣式右边符号的综合属性由其它产⽣式的属性规则计算。
⼀遍扫描的处理⽅法: 与树遍历的属性计算⽅法不同,⼀遍扫描的处理⽅法是在语法分析的同时计算属性值,⽽不是语法分析构造语法树之后进⾏属性的计算,⽽且⽆需构造实际的语法树。
编译原理实验报告
编译原理实验报告一、实验目的编译原理是计算机科学中的重要课程,旨在让学生了解编译器的基本工作原理以及相关技术。
本次实验旨在通过设计和实现一个简单的编译器,来进一步加深对编译原理的理解,并掌握实际应用的能力。
二、实验环境本次实验使用了Java编程语言及相关工具。
在开始实验前,我们需要安装Java JDK并配置好运行环境。
三、实验内容及步骤1. 词法分析词法分析是编译器的第一步,它将源代码分割成一系列词法单元。
我们首先实现一个词法分析器,它能够将输入的源代码按照语法规则进行切割,并识别出关键字、标识符、数字、运算符等。
2. 语法分析语法分析是编译器的第二步,它将词法分析得到的词法单元序列转化为语法树。
我们使用自顶向下的LL(1)语法分析算法,根据文法规则递归地构建语法树。
3. 语义分析语义分析是编译器的第三步,它对语法树进行检查和转换。
我们主要进行类型检查、语法错误检查等。
如果源代码存在语义错误,编译器应该能够提供相应的错误提示。
4. 代码生成代码生成是编译器的最后一步,它将经过词法分析、语法分析和语义分析的源代码翻译为目标代码。
在本次实验中,我们将目标代码生成为Java字节码。
5. 测试与优化完成以上步骤后,我们需要对编译器进行测试,并进行优化。
通过多个测试用例的执行,我们可以验证编译器的正确性和性能。
四、实验心得通过完成这个编译器的实验,我收获了很多。
首先,我对编译原理的知识有了更深入的理解。
在实验过程中,我深入学习了词法分析、语法分析、语义分析和代码生成等关键技术,对编译器的工作原理有了更系统的了解。
其次,我提高了编程能力。
实现一个完整的编译器需要处理复杂的数据结构和算法,这对我的编程能力是一个很好的挑战。
通过实验,我学会了合理地组织代码,优化算法,并注意到细节对程序性能的影响。
最后,我锻炼了解决问题的能力。
在实验过程中,我遇到了很多困难和挑战,但我不断地调试和改进代码,最终成功地实现了编译器。
编译原理语义分析与中间代码生成实验报告
编译原理语义分析与中间代码生成实验报告专题6_语法制导翻译程序设计原理与实现技术***-***** 李若森计科1301一、实验目的语法制导的基本概念;目标代码结构分析的基本方法;赋值语句语法制导生成四元式的基本原理和方法;该过程包括语法分析和语义分析过程。
二、实验内容2.1 实验项目完成以下描述赋值语句和算术表达式文法的语法制导生成中间代码四元式的过程。
G[A]:A→V=EE→E+T|E-T|T T→T*F|T/F|F F→(E)|i V→i2.2 设计说明终结符号i为用户定义的简单变量,即标识符的定义。
2.3 设计要求(1) 设计语法制导翻译过程,给出每一产生式对应的语义动作;(2) 设计中间代码四元式的结构(暂不与符号表有关);(3) 输入串应是词法分析的输出二元式序列,即某算术表达式“专题1”的输出结果。
输出为输入串的四元式序列中间文件;(4) 设计两个测试用例(尽可能完备),并给出程序执行结果。
2.4 任务分析重点解决赋值语句文法的改写和语义动作的添加。
三、实现过程3.1 扩展文法G[s]:S→AA→V=EE→E+T|E-T|T T→T*F|T/F|F F→(E)|i V→i3.2 非终结符FOLLOW集FOLLOW(S) = { # } FOLLOW(A) = { # } FOLLOW(V) = { = }FOLLOW(E) = { +, -, ), # }FOLLOW(T) = { +, -, *, /, ), # } FOLLOW(F) = { +, -, *, /, ), # }3.3 LR(0)分析器的构造设DFA M的一个状态为i,该状态识别出的所有活前缀的有效项目集为Ci。
则DFA M的状态集Q={C0, C1, C2, … , Cn}=C。
C称为文法的LR(0)有效项目集规范族。
对Ci有三种操作:求文法的LR(0)有效项目集规范族C的算法:由上述算法可求得有效项目集规范族C={C0, C1, C2, … , C19}。
编译原理实验报告小结
一、实验背景编译原理是计算机科学的一个重要分支,主要研究如何将高级语言源代码转换为计算机可以执行的机器代码。
本实验旨在通过实践操作,加深对编译原理基本概念和算法的理解,提高编程能力和解决问题的能力。
二、实验目的1. 理解编译原理的基本概念和流程;2. 掌握词法分析和语法分析的基本方法;3. 熟悉编译过程中的中间代码生成和代码优化;4. 培养编程能力和团队协作精神。
三、实验内容1. 词法分析词法分析是编译过程的第一步,其主要任务是将源代码中的字符序列转换成一个个有意义的符号(单词)。
本实验中,我们实现了词法分析器,能够识别出标识符、关键字、运算符、常量等单词。
2. 语法分析语法分析是编译过程的核心,其主要任务是将词法分析器生成的单词序列按照一定的语法规则进行组织,形成语法树。
本实验中,我们实现了递归下降解析法,对表达式、赋值语句、函数定义等语法结构进行了分析。
3. 中间代码生成中间代码生成是编译过程中的一个重要环节,其主要任务是将语法树转换为一种抽象的、与具体机器无关的中间代码。
本实验中,我们实现了三地址代码生成,将语法树转换为三地址代码。
4. 代码优化代码优化是编译过程中的一个关键步骤,其主要任务是在保证程序正确性的前提下,提高程序的性能。
本实验中,我们实现了简单的代码优化,如常数传播、变量替换等。
四、实验结果与分析1. 实验结果通过实验,我们成功实现了词法分析、语法分析、中间代码生成和代码优化等功能。
以一个简单的C语言程序为例,我们能够将其转换为三地址代码,并进行简单的优化。
2. 实验分析(1)词法分析:本实验中,我们通过定义状态转换表和动作表,实现了对C语言源代码的词法分析。
实验结果表明,词法分析器能够准确地识别出标识符、关键字、运算符、常量等单词。
(2)语法分析:递归下降解析法是一种较为直观的语法分析方法。
本实验中,我们实现了递归下降解析法,对表达式、赋值语句、函数定义等语法结构进行了分析。
编译原理编译器综合实验报告
编译原理编译器综合实验报告
本次综合实验的目标是设计和实现一个简单的编译器,用于将一种高级程序语言转化为等效的目标代码。
该编译器的设计基于编译原理的相关知识和技术。
在实验中,我们首先进行了语法分析的设计与实现。
通过使用自顶向下的递归下降方法,我们构建了一个语法分析器,该分析器能够识别源代码中的语法结构,并生成相应的语法树。
为了提高语法分析的效率,我们还使用了一些常见的优化技术,如LL(1)文法的设计和FIRST集合的计算。
接下来,我们进行了语义分析的设计与实现。
在语义分析阶段,我们对语法树进行了类型检查和语义检查。
通过遍历语法树,我们检查了变量的声明和使用情况,以及表达式的合法性。
同时,我们还进行了符号表的设计与管理,用于记录变量和函数的相关信息。
我们进行了中间代码生成的设计与实现,在中间代码生成阶段,我们将语法树转化为一种中间表示形式,以方便后续的优化和目标代码生成。
为了提高中间代码的质量,我们使用了一些常见的优化技术,如常量折叠和公共子表达式消除。
我们进行了目标代码生成的设计与实现,在目标代码生成阶段,我们将中间代码转化为目标代码,以便于在特定的硬件平台上执行。
为了生成高效的目标代码,我们使用了一些常见的优化技术,如寄存器分配和指令选择。
通过本次综合实验,我们深入了解了编译器的各个阶段,了解了
编译原理的基本原理和技术。
同时,我们也学会了如何设计和实现一个简单的编译器,并通过实践掌握了相关的编程技能。
这对我们进一步学习和研究编译原理以及相关领域的知识具有重要意义。
编译原理实验报告
编译原理实验报告编译原理实验报告一、引言编译原理是计算机科学中的重要课程之一,它研究的是如何将高级语言程序转化为机器语言程序的过程。
在本次实验中,我们将学习并实践编译原理中的一些基本概念和技术,包括词法分析、语法分析和语义分析等。
二、词法分析词法分析是编译过程中的第一步,它负责将源程序中的字符序列转化为有意义的词法单元。
在本次实验中,我们使用了Flex工具来生成词法分析器。
通过定义一系列正则表达式和对应的动作,我们可以将源程序中的字符序列识别为不同的词法单元,如标识符、关键字、运算符等。
三、语法分析语法分析是编译过程中的第二步,它负责将词法单元序列转化为抽象语法树。
在本次实验中,我们使用了Bison工具来生成语法分析器。
通过定义一系列文法规则和对应的动作,我们可以将词法单元序列转化为抽象语法树,并进行语法错误的检测和恢复。
四、语义分析语义分析是编译过程中的第三步,它负责对抽象语法树进行语义检查和语义动作的执行。
在本次实验中,我们通过自定义语义规则和对应的动作,对抽象语法树进行类型检查、符号表管理等操作。
同时,我们还实现了一些简单的语义动作,如计算表达式的值、生成中间代码等。
五、中间代码生成中间代码生成是编译过程中的一项重要任务,它负责将源程序转化为机器无关的中间表示形式。
在本次实验中,我们使用了三地址码作为中间表示形式。
通过对抽象语法树的遍历和一系列的转换规则,我们可以将源程序转化为等价的三地址码表示形式。
六、实验结果与分析通过对一些简单的测试程序的编译,我们验证了我们所实现的词法分析、语法分析、语义分析和中间代码生成的正确性。
同时,我们还进行了一些性能测试,对比了不同算法和数据结构在编译过程中的效率差异。
实验结果表明,我们所实现的编译器在处理大规模程序时具有较好的性能。
七、结论通过本次实验,我们深入了解了编译原理中的一些基本概念和技术,并通过实践加深了对编译过程的理解。
同时,我们也意识到编译器的设计和实现是一项复杂而有挑战性的任务,需要综合运用多种算法和数据结构。
编译原理教程实验报告
一、实验目的本次实验旨在使学生通过编译原理的学习,了解编译程序的设计原理及实现技术,掌握编译程序的各个阶段,并能将所学知识应用于实际编程中。
二、实验内容1. 词法分析2. 语法分析3. 语义分析4. 中间代码生成5. 代码优化6. 目标代码生成三、实验步骤1. 词法分析(1)设计词法分析器,识别输入源代码中的各种词法单元;(2)使用C语言实现词法分析器,并进行测试。
2. 语法分析(1)根据文法规则设计语法分析器,识别输入源代码的语法结构;(2)使用C语言实现语法分析器,并进行测试。
3. 语义分析(1)设计语义分析器,检查语法分析后的语法树,确保语义正确;(2)使用C语言实现语义分析器,并进行测试。
4. 中间代码生成(1)设计中间代码生成器,将语义分析后的语法树转换为中间代码;(2)使用C语言实现中间代码生成器,并进行测试。
5. 代码优化(1)设计代码优化器,对中间代码进行优化,提高程序性能;(2)使用C语言实现代码优化器,并进行测试。
6. 目标代码生成(1)设计目标代码生成器,将优化后的中间代码转换为特定目标机的汇编语言;(2)使用C语言实现目标代码生成器,并进行测试。
四、实验结果与分析1. 词法分析实验结果:成功识别输入源代码中的各种词法单元,包括标识符、关键字、运算符、常量等。
2. 语法分析实验结果:成功识别输入源代码的语法结构,包括表达式、语句、程序等。
3. 语义分析实验结果:成功检查语法分析后的语法树,确保语义正确。
4. 中间代码生成实验结果:成功将语义分析后的语法树转换为中间代码,为后续优化和目标代码生成提供基础。
5. 代码优化实验结果:成功对中间代码进行优化,提高程序性能。
6. 目标代码生成实验结果:成功将优化后的中间代码转换为特定目标机的汇编语言,为程序在目标机上运行做准备。
五、实验心得1. 编译原理是一门理论与实践相结合的课程,通过本次实验,我对编译程序的设计原理及实现技术有了更深入的了解。
编译原理中实验报告
实验名称:编译原理实验实验时间:2023年X月X日实验地点:实验室实验指导老师:XXX一、实验目的1. 理解编译原理的基本概念和流程。
2. 掌握词法分析和语法分析的基本方法。
3. 学习编译器生成中间代码和目标代码的过程。
4. 培养编程能力和问题解决能力。
二、实验内容本次实验主要包括以下内容:1. 词法分析:编写一个简单的词法分析器,将源代码输入转换为抽象语法树(AST)。
2. 语法分析:实现一个简单的递归下降解析器,对词法分析器输出的AST进行语法分析。
3. 中间代码生成:根据AST生成三地址代码(Three-Address Code)。
4. 代码优化:对生成的三地址代码进行优化。
5. 目标代码生成:将优化后的三地址代码转换为机器代码。
三、实验步骤1. 设计词法分析器首先,我们需要设计一个能够识别源代码中各种单词的词法分析器。
在本实验中,我们定义了以下几种单词:- 关键字:如if、else、while、int、float等。
- 标识符:由字母、数字和下划线组成,不能以数字开头。
- 常量:包括整型常量和浮点型常量。
- 运算符:如+、-、、/、==、<=等。
- 分隔符:如(、)、;、,等。
根据以上定义,我们可以编写一个词法分析器,它将输入的源代码字符串逐个字符地读取,并根据定义的规则识别出相应的单词。
2. 语法分析词法分析器生成的AST是一个树形结构,其中每个节点代表源代码中的一个单词或符号。
为了进一步分析AST的结构,我们需要实现一个递归下降解析器,它能够根据语法规则对AST进行解析。
在本实验中,我们以一个简单的算术表达式为例,实现了一个递归下降解析器。
解析器从AST的根节点开始,按照语法规则递归地解析每个子节点,直到整个表达式被解析完毕。
3. 中间代码生成在完成语法分析后,我们需要将AST转换为中间代码。
在本实验中,我们选择了三地址代码作为中间代码的形式。
三地址代码是一种表示赋值、条件判断和循环等操作的方式,它使用三个操作数和两个操作符来表示一个操作。
编译原理综合性实验报告-分析中间代码生成程序分析
编译原理综合性实验报告-分析中间代码⽣成程序分析编译原理综合性实验报告-分析中间代码⽣成程序分析XXXXXX计算机系综合性实验实验报告课程名称编译原理实验学期 XXXX ⾄ XXXX 学年第 X 学期学⽣所在系部计算机系年级 X 专业班级 XXXXXX 学⽣姓名 XXX学号 XXXXXXXXXXXX 任课教师XXX 实验成绩计算机系制《编译原理》课程综合性实验报告开课实验室: 年⽉⽇实验题⽬分析中间代码⽣成程序⼀、实验⽬的分析PL/0编译程序的总体结构、代码⽣成的⽅法和过程;具体写出⼀条语句的中间代码⽣成过程。
⼆、设备与环境PC兼容机、Windows操作系统、Turbo Pascal软件等。
三、实验内容1. 分析PL/0程序的Block⼦程序,理清PL/0程序结构和语句格式。
画出Block⼦程序的流程图,写出⾄少两条PL/0程序语句的语法格式。
2. 分析PL/0程序的Block⼦程序和Gen⼦程序,了解代码⽣成的⽅法和过程。
使⽤概要算法来描述语句的代码⽣成过程。
3. ⾃⼰编写⼀个简单的PL/0程序,能够正确通过编译,得到中间代码。
列出⾃⼰编写的源程序和编译后得到的中间代码。
4. 从中选择⼀个语句或表达式,写出代码⽣成的过程。
要求从⾃⼰的源程序中选择⼀条语句,结合这条语句写出语义分析和代码⽣成过程。
在描述这个过程中,要说清楚每个功能有哪个⼦程序的哪条语句来完成,说清楚语句和参数的含义和功能。
四、实验结果及分析(⼀)Block⼦程序分析1.常量声明的分析:常量声明部分的语法结构定义为如下形式:-> const ;-> [;]->id = C其中C可以是常量标识符或字符串或整数(可带符号)或实数(可带符号)。
常量声明分析程序的主要任务是:(1).扫描整个常量声明部分。
(2).为被声明的常量标识符建⽴符号表项。
(3).检查重复的声明。
2.变量声明部分的分析:变量声明部分的语法结构定义为如下形式:-> var-> [;]->:T->id[,]其中idList是被定义的变量标识符序列,T是类型表达式。
编译技术课程设计报告-词法分析、语法分析、中间代码生成
编译技术课程设计班级学号姓名指导老师年月目录一、目的------------------------------------------------------------------------------------------ 2二、任务及要求---------------------------------------------------------------------------------2三、实验环境------------------------------------------------------------------------------------ 4四、实现过程说明------------------------------------------------------------------------------ 41.词法分析器 ------------------------------------------------------------------------------4(1)单词符号表------------------------------------------------------------------------ 4(2)数据结构--------------------------------------------------------------------------- 5(3)函数说明--------------------------------------------------------------------------- 5(4)流程图------------------------------------------------------------------------------ 62.语法分析器------------------------------------------------------------------------------6(1)分析方法说明--------------------------------------------------------------------- 6(2)文法--------------------------------------------------------------------------------- 6(3)数据结构--------------------------------------------------------------------------- 7(4)函数说明--------------------------------------------------------------------------- 73.中间代码生成器------------------------------------------------------------------------ 10(1)属性文法-------------------------------------------------------------------------- 10 (2)数据结构-------------------------------------------------------------------------- 11 (3)函数说明-------------------------------------------------------------------------- 11 (4)流程图------------------------------------------------------------------------------ 11五、程序运行结果------------------------------------------------------------------------------ 12六、总结------------------------------------------------------------------------------------------ 16一、目的<<编译技术>>是理论与实践并重的课程,而其课程设计要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。
编译原理系列实验四语义分析与中间代码生成
编译原理系列实验四语义分析与中间代码⽣成最后⼀次实验!⽬录实验四语义分析与中间代码⽣成实验⽬的通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法范畴变换为某种中间代码的语义翻译⽅法。
掌握⽬前普遍采⽤的语义分析⽅法──语法制导翻译技术。
给出 PL/0 ⽂法规范,要求在语法分析程序中添加语义处理,对于语法正确的表达式,输出其中间代码;对于语法正确的算术表达式,输出其计算值。
题⽬【问题描述】在实验⼆或实验三的表达式语法分析程序⾥,添加语义处理部分。
对于语法正确的表达式,输出其中间代码,⽤四元式序列表⽰;对于语法正确的算术表达式,输出其计算值。
例如:当输⼊为2+35时,程序输出为17;当输⼊为a(b+c)时,程序输出为四元式:(+,b,c,t1)(,a,t1,t2)要求源程序能智能判断这两种情况,并输出相应结果。
【输⼊形式】(1) PL/0算术表达式的语义计算。
PL/0算术表达式,例如:2+35作为输⼊。
(2)PL/0表达式的中间代码表⽰。
输⼊:PL/0表达式,例如: a*(b+c)。
【输出形式】2+35作为输⼊时,输出为17a(b+c)作为输⼊时,输出为(+,b,c,t1)(*,a,t1,t2)源程序#include <iostream>#include<bits/stdc++.h>using namespace std;/**词法分析及其结果存储**/pair<string, string> lexRes[50]; // 词法分析结果,每个pair的first如"ident",second如"a"int lexI = 0; // lexRes的指针void lexical()/*词法分析:读⼊⼀⾏字符串,处理该字符串的词法分析结果⾄lexRes*//*lexI终为lexRes的长度,即单词数*/{// 读⼊输⼊串string inputs; // 如,a*(b+c)cin >> inputs;// 初始化词典map<string,string> words;std::map<string,string>::iterator it;words["+"]="plus";words["-"]="minus";words["*"]="times";words["/"]="slash";words["="]="eql";words["("]="lparen";words[")"]="rparen";// 开始分析int insize=inputs.length();string word; // 输⼊符号,如"a"/"123"{// 空⽩符跳过while(inputs[i] == ' ' || inputs[i] == '\n')i++;// 标志符/基本字捕捉if(isalpha(inputs[i])){// 拿出⼀个标志符/基本字word = inputs[i++];while(isalpha(inputs[i]) || isdigit(inputs[i]))word += inputs[i++];// 在map中找到相应的词性,并输出it = words.find(word);if(it != words.end())lexRes[lexI++] = make_pair(words[word], word);// cout << "(" << words[word] << "," << word << ")" << endl; elselexRes[lexI++] = make_pair("ident", word);// cout << "(ident" << "," << word << ")" << endl;i--;}// 常数else if(isdigit(inputs[i])){// 拿出常数word=inputs[i++];while(isdigit(inputs[i]))word+=inputs[i++];lexRes[lexI++] = make_pair("number", word);//cout << "(number" << "," << word << ")" << endl;i--;}// <、<=号else if(inputs[i]=='<'){word=inputs[i++];if(inputs[i]=='>'){word+=inputs[i];lexRes[lexI++] = make_pair(words[word], word);// cout << "(" << words[word] << "," << word << ")" << endl; }else if(inputs[i]=='='){word+=inputs[i];lexRes[lexI++] = make_pair(words[word], word);// cout << "(" <<words[word] << "," << word << ")" << endl; }else if(inputs[i]!=' '||!isdigit(inputs[i])||!isalpha(inputs[i])){lexRes[lexI++] = make_pair(words[word], word);// cout << "(" << words[word] << "," << word << ")" << endl; }else{//cout << "error!" << endl;}i--;}// >、>=else if(inputs[i]=='>'){word=inputs[i++];if(inputs[i]=='='){word+=inputs[i];lexRes[lexI++] = make_pair(words[word], word);// cout<<"("<<words[word]<<","<<word<<")"<<endl;}else if(inputs[i]!=' '||!isdigit(inputs[i])||!isalpha(inputs[i])){lexRes[lexI++] = make_pair(words[word], word);// cout<<"("<<words[word]<<","<<word<<")"<<endl;}else{//cout<<"error!"<<endl;}i--;}//:=else if(inputs[i]==':'){word=inputs[i++];if(inputs[i]=='='){word+=inputs[i];lexRes[lexI++] = make_pair(words[word], word);// cout<<"("<<words[word]<<","<<word<<")"<<endl;}else{//cout<<"error!"<<endl;}//i--;}//其他的基本字word=inputs[i];it=words.find(word);if(it!=words.end()){lexRes[lexI++] = make_pair(words[word], word);// cout<<"("<<words[word]<<","<<word<<")"<<endl; }else{//cout<<"error!"<<endl;}}}}/**四元式相关,被调⽤**/struct quad{string result;string arg1;string arg2;string op;};struct quad quad[50]; // 四元式数组int quaI = 0; // 指向四元式的指针void emit(string op, string arg1, string arg2, string result)/*发射⼀⾏四元式*/{quad[quaI].op = op;quad[quaI].arg1 = arg1;quad[quaI].arg2 = arg2;quad[quaI].result = result;quaI++;}int tI = 1; // 记录当前是t1/t2...t⼏了string newT()/*产⽣⼀个t1/t2...*/{stringstream ss;ss << tI;string ti = "t" + ss.str();tI++;return ti;}/**⾮算数表达式的递归下降分析及四元式⽣成**/// 指针前进int sym=0; // 正在处理的单词void advance(){++sym;if(sym > lexI){cout << "ERROR!sym指针越界";exit(0);}}string E();string T();string F();string F()/*因⼦分析*/{string arg;if(lexRes[sym].first == "ident"){arg = lexRes[sym].second;advance();}else if(lexRes[sym].first == "number"){arg = lexRes[sym].second;advance();}else if(lexRes[sym].first == "lparen"){advance();arg = E();if(lexRes[sym].first == "rparen"){advance();}else{cout << "ERROR!未能匹配右括号!语法错误\n";exit(0);}}}string T()/*项分析*/{string op, arg1, arg2, result;arg1 = F();while(lexRes[sym].first == "times" || lexRes[sym].first == "slash"){ op = lexRes[sym].second;advance();arg2 = F();result = newT();emit(op, arg1, arg2, result);arg1 = result;}return arg1;}string E()/*表达式分析*/{string op, arg1, arg2, result;if(lexRes[sym].first == "plus" || lexRes[sym].first == "minus"){advance();}arg1 = T();while(lexRes[sym].first == "plus" || lexRes[sym].first == "minus"){ op = lexRes[sym].second;advance();arg2 = T();result = newT();emit(op, arg1, arg2, result);arg1 = result;}return arg1;}/**算数表达式的递归下降分析及四元式⽣成**/int E_();int T_();int F_();int F_(){int arg;if(lexRes[sym].first == "ident"){cout << "算数表达式含变量,⽆法计算\n";exit(0);}else if(lexRes[sym].first == "number"){arg = atoi(lexRes[sym].second.c_str());advance();}else if(lexRes[sym].first == "lparen"){advance();arg = E_();if(lexRes[sym].first == "rparen"){advance();}else{cout << "ERROR!未能匹配右括号!语法错误\n";exit(0);}}return arg;}int T_()/*项分析*/{string op;int arg1, arg2, result;arg1 = F_();while(lexRes[sym].first == "times" || lexRes[sym].first == "slash"){ op = lexRes[sym].second;advance();arg2 = F_();if(op == "*"){result = arg1 * arg2;arg1 = result;}else{result = arg1 / arg2;arg1 = result;}else {cout << "除数为0,出错!\n";exit(0);}}}return arg1;}int E_()/*表达式分析*/{string op;int arg1, arg2, result;if(lexRes[sym].first == "plus" || lexRes[sym].first == "minus"){advance();}arg1 = T_();while(lexRes[sym].first == "plus" || lexRes[sym].first == "minus"){op = lexRes[sym].second;advance();arg2 = T_();if(op == "+"){result = arg1 + arg2;arg1 = result;}else{result = arg1 - arg2;arg1 = result;}}return arg1;}int main(){lexical();if(lexRes[0].first == "number"){cout << E_();}else{E();for(int i=0; i<quaI; i++){cout<<'('<<quad[i].op<<','<<quad[i].arg1<<','<<quad[i].arg2<<','<<quad[i].result<<')'<<endl; }}return 0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理综合性实验报告-分析中间代码生成程序分析XXXXXX计算机系综合性实验
实验报告
课程名称编译原理实验学期 XXXX 至 XXXX 学年第 X 学期学生所在系部计算机系年级 X 专业班级 XXXXXX 学生姓名 XXX 学号 XXXXXXXXXXXX 任课教师XXX 实验成绩
计算机系制
《编译原理》课程综合性实验报告
开课实验室: 年月日实验题目分析中间代码生成程序
一、实验目的
分析PL/0编译程序的总体结构、代码生成的方法和过程;具体写出一条语句的中间代码生成过程。
二、设备与环境
PC兼容机、Windows操作系统、Turbo Pascal软件等。
三、实验内容
1. 分析PL/0程序的Block子程序,理清PL/0程序结构和语句格式。
画出Block
子程序的流程图,写出至少两条PL/0程序语句的语法格式。
2. 分析PL/0程序的Block子程序和Gen子程序,了解代码生成的方法和过程。
使用概要算法来描述语句的代码生成过程。
3. 自己编写一个简单的PL/0程序,能够正确通过编译,得到中间代码。
列出自
己编写的源程序和编译后得到的中间代码。
4. 从中选择一个语句或表达式,写出代码生成的过程。
要求从自己的源程序中
选择一条语句,结合这条语句写出语义分析和代码生成过程。
在描述这个过程中,要说清楚每个功能有哪个子程序的哪条语句来完成,说清楚语句和参数的含义和功能。
四、实验结果及分析
(一)Block子程序分析
1.常量声明的分析:
常量声明部分的语法结构定义为如下形式:
<ConstDecPart> -> const <ConstDefList>;
<ConstDefList> -> <ConstDef>[;<ConstDefList>]
<ConstDef>->id = C
其中C可以是常量标识符或字符串或整数(可带符号)或实数(可带符号)。
常量声明分析程序的主要任务是:
(1).扫描整个常量声明部分。
(2).为被声明的常量标识符建立符号表项。
(3).检查重复的声明。
2.变量声明部分的分析:
变量声明部分的语法结构定义为如下形式:
<VarDecPart>-> var<VarDefList>
<VarDefList>-> <VarDef>[;<VarDefList>]
<VarDef>-><idList>:T
<idList>->id[,<idList>]
其中idList是被定义的变量标识符序列,T是类型表达式。
第 1 页
变量声明分析程序的主要任务是:
(1).扫描整个变量声明部分,并进行语义错误检查。
(2).为被声明的变量标识符建立相应符号表项。
3.Block子程序流程图:
第 2 页
(二)代码生成的方法和过程:
Block子程序:首先置TX的初值,令DX=3,判读嵌套层数是否大于最允的嵌套层数,如果大于,则发出32号错误。
小于然后读入一个token,当读入的当前token 是常量保留字,转入常量声明处理。
如果sym遇到逗号则反复声明下一个常量,获取下一个token,声明以当前token为标识符的常量。
如果sym遇到分号,常量声明结束。
获取下一个token,当读入的是变量保留字,转入变量声明处理,过程与常量声明类似。
当读入的当前token是过程保留字时,把过程名和它所在的层次填入符号表,递归调用block分析过程,当前的层次加一。
如果不是过程保留字,如果是一个语句的开始,则进行语句处理,直至结束。
Gen子程序:目标代码生成过程gen,用于把生成的目标代码写入目标代码数组。
如果cx>cxmax表示当前生成的代码行号大于允许的最大代码行数,输出“program too long”。
然后,把代码写入目标代码数组的当前cx所指位置,移动cx指针指向下一个空位。
(三)编写一个简单的PL/0程序
PL/0程序为:
const a=10;
var b,c;
procedure p;
begin
c:=2*(1+b)
end;
begin
if a=10 then
begin
b:=2;
call p;
end
end.
将其保存为txt格式文件存于E盘下运行后结果如下:
第 3 页
(四)分析上述程序中c:=2*(l+w);的代码生成过程
在上述程序中,当调用block子程序分析这段语句时,遇到c,查符号表,判断是常量还是变量,入栈,遇到“:=”时,继续读下一字符,判断如c,并依次将2、1和b入栈。
第一个截图是过程p,句子就在这里,首先生成一个int的目标码,分配一个3个单元的数据区,然后又生成两条lit代码分别将2、1入栈,再后有一条lod代码,是将b入栈的。
入栈后开始计算1+b(opr 1 2),此时栈顶元素为1+b的结果,再计算乘2 (opr 1 4),次栈顶乘以栈顶然后退两栈,结果第 4 页
入栈,此时数据区中就是2*(1+b)的结果了,通过一条sto代码将结果存入偏移为4的单元中,就是c。
在主程序中也可以找到这一段,主程序中,先开辟了5
个数据区,然后跳到10的位置,把a入栈,10入栈,判断两个值是否相等,不等的话就继续往下,程序结束,如果相等的话,给b赋值后,就cal 1 2 ,即调用过程p,这段就是前面的那段了。
评定项目 A B C D 评定项目 A B C D
算法正确流程图正确
语句语法格式正确源程序正确
中间代码正确分析过程正确
报告规范回答问题正确教实验结果正确题解正确师其他: 评
价
评价教师签名:
年月日
第 5 页
古今名言
敏而好学,不耻下问——孔子
业精于勤,荒于嬉;行成于思,毁于随——韩愈兴于《诗》,立于礼,成于乐——孔子己所不欲,勿施于人——孔子
读书破万卷,下笔如有神——杜甫
读书有三到,谓心到,眼到,口到——朱熹立身以立学为先,立学以读书为本——欧阳修读万卷书,行万里路——刘彝
黑发不知勤学早,白首方悔读书迟——颜真卿书卷多情似故人,晨昏忧乐每相亲——于谦书犹药也,善读之可以医愚——刘向莫等闲,白了少年头,空悲切——岳飞发奋识遍天下字,立志读尽人间书——苏轼鸟欲高飞先振翅,人求上进先读书——李苦禅立志宜思真品格,读书须尽苦功夫——阮元非淡泊无以明
志,非宁静无以致远——诸葛亮熟读唐诗三百首,不会作诗也会吟——孙洙《唐诗三百首序》
书到用时方恨少,事非经过不知难——陆游问渠那得清如许,为有源头活水来——朱熹旧书不厌百回读,熟读精思子自知——苏轼书痴者文必工,艺痴者技必良——蒲松龄
第 6 页
声明
访问者可将本资料提供的内容用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本文档及相关权利人的合法权利。
谢谢合作~
第 7 页。