编译方法实验报告(中间代码生成器的设计)
编译类研究报告
编译类研究报告
1. 引言
编译是计算机科学中重要的一门技术,它负责将高级程序语言转化成计算机可
以理解和执行的机器代码。编译器是实现这一过程的软件工具,同时也是编程语言发展中的关键组成部分。本研究报告将介绍编译器的基本原理和主要功能,分析编译器在软件开发中的应用以及现有编译器技术面临的挑战和发展趋势。
2. 编译器基本原理
编译器主要有三个基本阶段:词法分析,语法分析和语义分析。词法分析器负
责将源程序分解成单个的词法单元,比如关键字、标识符等。语法分析器根据事先定义好的文法规则,将词法单元组合成语法树。语义分析器通过对语法树进行遍历和分析,生成中间代码或直接编译成目标代码。
3. 编译器的主要功能
编译器的主要功能有:词法分析、语法分析、语义分析、中间代码生成、优化
和目标代码生成等。词法分析阶段负责将源代码转化为标识符、关键字等词法单元。语法分析阶段将词法单元组合成语法树,检查语法错误。语义分析阶段进行类型检查、符号表管理等,保证程序的语义正确性。中间代码生成阶段将语法树翻译成中间代码,为后续优化做准备。优化阶段对中间代码进行优化,提高程序的执行效率。目标代码生成阶段将中间代码转化成特定机器的目标代码。
4. 编译器在软件开发中的应用
编译器在软件开发中扮演着重要的角色。首先,编译器使得程序员能够使用高
级语言进行开发,提高了开发效率。其次,编译器可以将源代码编译成可执行程序,方便程序的发布和部署。此外,编译器还能够进行代码的优化,提高程序的性能和执行效率。编译器技术的发展也为开发者提供了更多的选择和灵活性。
编译原理实验报告总结
学年第学期《编译原理》实验报告
学院(系):计算机科学与工程学院
班级:11303070A
学号:***********
姓名:无名氏
指导教师:保密式
时间:2016 年7 月
目录
1.实验目的 (1)
2.实验内容及要求 (1)
3.实验方案设计 (1)
3.1 编译系统原理介绍 (1)
3.1.1 编译程序介绍 (2)
3.1.2 对所写编译程序的源语言的描述 (2)
3.2 词法分析程序的设计 (3)
3.3 语法分析程序设计 (4)
3.4 语义分析和中间代码生成程序的设计 (4)
4. 结果及测试分析 (4)
4.1软件运行环境及限制 (4)
4.2测试数据说明 (5)
4.3运行结果及功能说明 (5)
5.总结及心得体会 (7)
1.实验目的
根据Sample语言或者自定义的某种语言,设计该语言的编译前端。包括词法分析,语法分析、语义分析及中间代码生成部分。
2.实验内容及要求
(1)词法分析器
输入源程序,输出对应的token表,符号表和词法错误信息。按规则拼单词,并转换成二元形式;滤掉空白符,跳过注释、换行符及一些无用的符号;进行行列计数,用于指出出错的行列号,并复制出错部分;列表打印源程序;发现并定位词法错误;
(2)语法分析器
输入token串,通过语法分析,寻找其中的语法错误。要求能实现Sample 语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while语句、do while语句等。
(3)语义分析和中间代码生成
输入token串,进行语义分析,修改符号表,寻找其中的语义错误,并生
编译原理实验报告
编译原理实验报告
编译原理实验报告
一、实验目的
1. 了解编译器的基本原理和工作过程;
2. 掌握编译器设计和实现的基本方法和技巧;
3. 通过设计和实现一个简单的编译器,加深对编程语言和计算机系统的理解和认识。
二、实验原理
编译器是将高级语言程序翻译成机器语言程序的一种软件工具。它由编译程序、汇编程序、链接程序等几个阶段组成。本次实验主要涉及到的是编译程序的设计和实现。
编译程序的基本原理是将高级语言程序转换为中间代码,再将中间代码转换为目标代码。整个过程可以分为词法分析、语法分析、语义分析、代码生成和代码优化几个阶段。
三、实验内容
本次实验的设计目标是实现一个简单的四则运算表达式的编译器。
1. 词法分析
根据规定的语法规则,编写正则表达式将输入的字符串进行词法分析,将输入的四则运算表达式划分成若干个单词(Token),例如:运算符、操作数等。
2. 语法分析
根据定义的语法规则,编写语法分析程序,将词法分析得到的Token序列还原成语法结构,构建抽象语法树(AST)。
3. 语义分析
对AST进行遍历,进行语义分析,判断表达式是否符合语法
规则,检查语义错误并给出相应的提示。
4. 代码生成
根据AST生成目标代码,目标代码可以是汇编代码或者机器码。
四、实验过程和结果
1. 首先,根据输入的表达式,进行词法分析。根据所定义的正则表达式,将输入的字符串划分成Token序列。例如:输入
表达式“2+3”,经过词法分析得到的Token序列为["2", "+", "3"]。
2. 然后,根据语法规则,进行语法分析。根据输入的Token
编译原理中间代码生成实验报告
竭诚为您提供优质文档/双击可除编译原理中间代码生成实验报告
篇一:编译原理-分析中间代码生成程序
实验报告
课程名称编译原理实验学期至学年第学期
学生所在系部
年级专业班级
学生姓名学号任课教师实验成绩
计算机学院制
开课实验室:年月日
篇二:编译原理实验中间代码生成
实验四中间代码生成
一.实验目的:
掌握中间代码的四种形式(逆波兰式、语法树、三元式、四元式)。
二.实验内容:
1、逆波兰式定义:将运算对象写在前面,而把运算符号写在后面。用这种表示法表示的表
达式也称做后缀式。
2、抽象(语法)树:运算对象作为叶子结点,运算符作为内部结点。
3、三元式:形式序号:(op,arg1,arg2)
4、四元式:形式(op,arg1,arg2,result)
三、以逆波兰式为例的实验设计思想及算法
(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。
(2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。
(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。
(4)如果不是数字,该字符则是运算符,此时需比较优先关系。
做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。
(5)重复上述操作(1)-(2)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。
词法分析实验原理_编译原理实验报告范文分析
词法分析实验原理_编译原理实验报告范文分析
1.实验目的根据Sample语言或者自定义的某种语言,设计该语言的
编译前端。包括词法分析,语法分析、语义分析及中间代码生成部分。
2.实验内容及要求
(1)词法分析器
输入源程序,输出对应的token表,符号表和词法错误信息。按规则
拼单词,并转换成二元形式;滤掉空白符,跳过注释、换行符及一些无用
的符号;进行行列计数,用于指出出错的行列号,并复制出错部分;列表
打印源程序;发现并定位词法错误;
(2)语法分析器
输入token串,通过语法分析,寻找其中的语法错误。要求能实现Sample语言或自定义语言中几种最常见的、基本的语法单位的分析:算
术表达式、布尔表达式、赋值语句、if语句、for语句、while语句、dowhile语句等。
(3)语义分析和中间代码生成
输入token串,进行语义分析,修改符号表,寻找其中的语义错误,
并生成中间代码。要求能实现Sample语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while语句、dowhile语句等。
实验要求:功能相对完善,有输入、输出描述,有测试数据,并介绍
不足。
3.实验方案设计
3.1编译系统原理介绍
编译器逐行扫描高级语言程序源程序,编译的过程如下:
(1).词法分析
识别关键字、字面量、标识符(变量名、数据名)、运算符、注释行(给人看的,一般不处理)、特殊符号(续行、语句结束、数组)等六类
符号,分别归类等待处理。
(2).语法分析
一个语句看作一串记号(Token)流,由语法分析器进行处理。按照
编译方法实验报告(中间代码生成器的设计)
编译方法实验报告
2011年10月
word文档可自由复制编辑
一、实验目的
熟悉算术表达式的语法分析与中间代码生成原理。
二、实验内容
(1)设计语法制导翻译生成表达式的四元式的算法;
(2)编写代码并上机调试运行通过。
输入——算术表达式;
输出——语法分析结果;
相应的四元式序列。
(3)设计LL(1)分析法或LR(0)分析法的属性翻译文法,并根据这些属性翻译文法,使用扩展的语法分析器实现语法制导翻译。
三、实验原理及基本步骤
●算术表达式文法:
G(E): E →E ω0 T | T
T →T ω1 F | F
F → i | (E)
●文法变换:
G’(E) E →T {ω0 T}
T →F {ω1 F}
F → i | (E)
●属性翻译文法:
E →T {ω0“push(SYN,w)” T “QUAT”}
T →F {ω1“push(SYN, w)” F “QUAT”}
F →i “push(SEM, entry(w))” | (E)
其中:
push(SYN, w) —当前单词w入算符栈SYN;
push(SEM, entry(w)) —当前w在符号表中的入口值压入语义栈SEM;
QUAT —生成四元式函数
i.T = newtemp;
ii.QT[j] =( SYN[k], SEM[s-1], SEM[s], T); j++;
iii.pop( SYN, _ ); pop( SEM, _ ); pop( SEM, _ );
push( SEM, T );
●递归下降子程序:
数据结构:SYN —算符栈;
SEM —语义栈;
四、数据结构设计
(精品)编译方法实验报告(中间代码生成器的设计)
编译方法实验报告
2011年10月
一、实验目的
熟悉算术表达式的语法分析与中间代码生成原理。
二、实验内容
(1)设计语法制导翻译生成表达式的四元式的算法;
(2)编写代码并上机调试运行通过。
输入——算术表达式;
输出——语法分析结果;
相应的四元式序列。
(3)设计LL(1)分析法或LR(0)分析法的属性翻译文法,并根据这些属性翻译文法,使用扩展的语法分析器实现语法制导翻译。
三、实验原理及基本步骤
●算术表达式文法:
G(E): E →E ω0 T | T
T →T ω1 F | F
F → i | (E)
●文法变换:
G’(E) E →T {ω0 T}
T →F {ω1 F}
F → i | (E)
●属性翻译文法:
E →T {ω0“push(SYN,w)” T “QUAT”}
T →F {ω1“push(SYN, w)” F “QUAT”}
F →i “push(SEM, entry(w))” | (E)
其中:
push(SYN, w) —当前单词w入算符栈SYN;
push(SEM, entry(w)) —当前w在符号表中的入口值压入语义栈SEM;
QUAT —生成四元式函数
i.T = newtemp;
ii.QT[j] =( SYN[k], SEM[s-1], SEM[s], T); j++;
iii.pop( SYN, _ ); pop( SEM, _ ); pop( SEM, _ );
push( SEM, T );
●递归下降子程序:
数据结构:SYN —算符栈;
SEM —语义栈;
PL0语言编译器分析实验报告
PL0语言编译器分析实验报告
1. 引言
1.1 PL0语言简介
PL0语言是一种早期的程序设计语言,由瑞士计算机科学家尼克劳斯·沃斯(Niklaus Wirth)于1970年左右设计。它是为了教学目的而设计的,具有简单、清晰、易于理解的特点。PL0语言是一种过程式编程语言,不支持面向对象编程。它的语法与Pascal语言相似,是许多编程语言教材中的入门语言。
1.2 编译器概述
编译器是一种将高级编程语言源代码转换为低级机器语言或中间代码的程序。它主要包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等阶段。编译器的主要目的是提高程序的可移植性、执行效率和开发效率。
1.3 实验目的与意义
本次实验通过对PL0语言编译器的分析,旨在让学生深入了解编译器的工作原理和实现方法,提高编程实践能力。实验的意义在于:
1.加深对编译原理的理解,掌握编译器各阶段的基本任务和关键技术;
2.培养学生独立分析问题、解决问题的能力;
3.提高学生的编程技巧,为后续学习更高级的编程语言打下基础;
4.通过实验,使学生了解编译器在软件开发中的重要作用,为今后从事软件开
发工作奠定基础。
2 PL0语言编译器原理
2.1 编译器的工作流程
编译器的工作流程主要包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等阶段。
1.词法分析:将源程序中的字符序列转换为记号(Token)序列。
2.语法分析:根据语法规则,将记号序列转换为抽象语法树(AST)。
3.语义分析:检查源程序是否有语义错误,如类型检查、作用域检查等。
哈工大威海编译原理实验三语义分析与中间代码生成(DOC X页)
哈工大威海编译原理实验三语义分析与中间代码生成(DOC
X页)
哈尔滨工业大学(威海)计算机学院
编译原理实验报告姓名院系计算机学院学号 090410
任课教师指导教师
实验地点宋健二楼机房实验时间
实验三语义分析及中间代码生成实验名称
同组人无
预习报告(对实验主要内容的认识) 得分
(1) 通过本次试验,我应该加深对于编译原理制导方案的理解,并且加深对
于语法变换的所起到的作用;
(2) 对于试验中要用到得中间代码的格式规范,也应该进一步的分析和掌握
(3) 能够很好的使用到前面开发出来的词法分析器和语法分析器,将它们与
语义分析器结合起来,跟好的更系统的掌握编译原理这门专业技能 (4) 关于
符号表以及token串表的维护,现在终于使其有所作用
实验内容(问题,思路,程序,结果) 得分
(1)开发环境:vs2010
(2)输入:在运行打开的软件下(win32格式),输入相应的代码(即要进行
词法分析的字符串)(比如:int a;)
(3)输出:在输入字符串后,按回车键后,既可以得到相应的词法分析的结果
(比如:int a 的输入对应的输出如下:int a;首先对于词法分析打印
出:
Int --- key //关键字
A ---str //字符串
; ---bor //边界符号
对于语法分析:
Accept //编译语句分析成功
对于输入字符串的语义分析和中间代码的生成如下中间代码:
)
(4)在相应的运行程序的文件夹中生成一个txt文件,用来存储生成的Token 链表
(5)系统功能:
(2) 开发平台(操作系统、设计语言):
1、操作系统:windows 7
编译原理教程04语义分析和中间代码生成
在本教程中,我们将探讨编译原理中的两个重要主题:语义分析和中间代码 生成。了解它们的定义、步骤、技术和应用,提升编译器质量和效率。
语义分析的定义和作用
1 作用
确保源代码符合语法和语义规则,并检测隐藏的错误和不一致性。
Βιβλιοθήκη Baidu
中间代码的定义和作用
1 作用
在后续编译过程中提供统一的中间表示,方便目标代码生成和优化。
语义分析的步骤
词法分析
将源代码转换为单词流。
语法分析
根据语法规则构建语法树。
语义处理
对语法树执行语义规则验 证和错误检测。
中间代码生成的步骤
生成语法树
通过语法分析构建抽象语法树或其他中间表示。
生成中间代码
将抽象语法树转换为可执行的中间代码。
语义分析和中间代码生成的关系
1 重要性
语义分析的准确性和质量对中间代码生成阶段至关重要。
帮助开发人员开发更强大和易于维护的程 序。
常见的语义分析和中间代码生成技术
1 语义分析器的类型和实现方法
包括语法制导翻译、类型检查和静态分析等不同技术。
2 中间代码生成的方法和实现技术
例如三地址代码、虚拟机代码和抽象语法树转换。
语义分析和中间代码生成的应用和意义
1 提高编译器的效率和质量
编译原理课程设计报告(一个完整的编译器)
编译原理程序设计报告
一个简单文法的编译器的设计与实现专业班级:计算机1406班
组长姓名:宋世波
组长学号: ******** 指导教师:肖桐
2016年12月
设计分工
组长学号及姓名:宋世波20143753 分工:文法及数据结构设计
词法分析
语法分析(LL1)
基于DAG的中间代码优化
部分目标代码生成
组员1学号及姓名:黄润华20143740 分工:中间代码生成(LR0)
部分目标代码生成
组员2学号及姓名:孙何奇20143754 分工:符号表组织
部分目标代码生成
摘要
编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。
一.编译器的概述
1.编译器的概念
编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。源代码一般为高阶语言如Pascal、C++、Java 等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。
2.编译器的种类
编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。例如: 自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言
编译原理实验 编译器 综合报告(附源代码)
编译原理编译器综合实验
---------------工程精品神刀公子一.实验背景
编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”
的程序。一个现代编译器的主要工作流程:源代码(source code) →预处理
器(preprocessor) →编译器 (compiler) →目标代码(object code) →链接器(Linker) → 可执行程序 (executables)
高级计算机语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读、运行的。
编译器将汇编或高级计算机语言源程序(Source program)作为输入,翻译成目标语言(Target language)机器代码的等价程序。源代码一般为高级语言(High-level language),如Pascal、C、C++、Java、汉语编程等或汇编语言,而目标则是机器语言的目标代码(Object code),有时也称作机器代码(Machine code)。
对于C#、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)的字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,编程最终可以被CPU直接计算的机器码(NativeCode)。
二.算法设计
典型的编译器输出是由包含入口点的名字和地址,以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的EXE,
编译原理课设实验报告
《编译技术》
课程设计报告
实验名称编译器设计
姓名
学号
班级
本课设的任务是完成一个完整的编译器,处理用户提交的符合所定文法的源程序代码,生成四元式中间代码,进而翻译成等价的X86平台上汇编语言的目标程序。
编译程序的工作过程划分为下列5个过程:词法分析,语法分析,语义分析和中间代码生成,代码优化,目标代码生成。
其中,词法分析阶段的基本任务是从以字符串表示的源程序中识别出具有独立意义的单词符号,并以二元组的形式输出,以作为语法分析阶段的输入。语法分析阶段的基本任务是将词法分析阶段产生的二元组作为输入,根据语言的语法规则,识别出各种语法成分,并判断该单词符号序列是否是该语言的一个句子。语义分析的任务是首先对每种语法单位进行静态的语义审查,然后分析其含义,并用另一种语言形式 (本课设采用四元式) 来描述这种语义。代码优化的任务是对前阶段产生的中间代码进行等价变换或改造,以期获得更为高效即省时间和空间的目标代码。目标代码生成的任务是将中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码(本课设生成汇编指令代码)。
在词法分析阶段,通过DOS环境手动输入字符串序列(以’#’作为结束标志)作为带分析的源程序,调用词法扫描子程序将字符串以二元组的形式输出(若有不属于该语言单词符号出现,则进行出错处理),词法扫描子程序包括了对源程序的预处理(忽略多余空格、回车换行符等空白字符),以及对单词的识别和分类,以形成(单词种别,单词自身的值)形式的二元组,并将用户自定义变量信息存入程序变量信息表。
编译原理-课程设计报告-简单编译器实现
编译原理-课程设计报告-简单编译器实现
成绩:
课程设计
题目:简单编译器实现
学院:信息工程学院计算机系专业:计算机科学与技术班级:计科1103班
组长:
小组成员:
指导教师:
1 概述
编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。由编译程序的五个阶段就对应了编译系统的结构。
其中词法分析器利用超前搜索、状态转换等方法,将源程序转化成为一个一个的单词符号二元式。一般程序语言的单词符号包括关键字、运算符、常数、标识符和界符。语法分析器将这些单词符号作为输入,对它进行语法分析。语法分析分为两种方法:自上而下分析法和自下而上分析法。针对不同程序语言的语法规则可以采取不同的分析方法,当然两种方法也可以同时使用。语法分析器把语法单元作为输入供语义分析器使用。一般的语义分析器主要采用的是语法制导方法,即在语法分析的同时进行语法分析,并产生一定的语义动作,来生成中间代码。上面三个过程可以与硬件无关,
而接下来的优化器和目标代码生成器是针对某一种处理器而言的。代码优化是将语义分析生成的中间代码进行优化,产生执行效率更高的代码。目标代码生成器最终生成可以在某种机器上运行的机器语言或者汇编语言。在整个编译过程中还包括对表格的操作和对错误的处理,这些也都是非常重要的环节。
1.1源、目标语言简介
使用C语言做简单语法分析器,C语言是一门高级计算机编程语言,设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言
编译原理综合性实验报告-分析中间代码生成程序分析
编译原理综合性实验报告-分析中间代码⽣成程序分析
编译原理综合性实验报告-分析中间代码⽣成程序分析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.常量声明的分析:
常量声明部分的语法结构定义为如下形式:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译方法实验报告
2011年10月
一、实验目的
熟悉算术表达式的语法分析与中间代码生成原理。
二、实验内容
(1)设计语法制导翻译生成表达式的四元式的算法;
(2)编写代码并上机调试运行通过。
输入——算术表达式;
输出——语法分析结果;
相应的四元式序列。
(3)设计LL(1)分析法或LR(0)分析法的属性翻译文法,并根据这些属性翻译文法,使用扩展的语法分析器实现语法制导翻译。
三、实验原理及基本步骤
●算术表达式文法:
G(E): E →E ω0 T | T
T →T ω1 F | F
F → i | (E)
●文法变换:
G’(E) E →T {ω0 T}
T →F {ω1 F}
F → i | (E)
●属性翻译文法:
E →T {ω0“push(SYN,w)” T “QUAT”}
T →F {ω1“push(SYN, w)” F “QUAT”}
F →i “push(SEM, entry(w))” | (E)
其中:
push(SYN, w) —当前单词w入算符栈SYN;
push(SEM, entry(w)) —当前w在符号表中的入口值压入语义栈SEM;
QUAT —生成四元式函数
i.T = newtemp;
ii.QT[j] =( SYN[k], SEM[s-1], SEM[s], T); j++;
iii.pop( SYN, _ ); pop( SEM, _ ); pop( SEM, _ );
push( SEM, T );
●递归下降子程序:
数据结构:SYN —算符栈;
SEM —语义栈;
四、数据结构设计
使用递归的结构进行四元式的设计,同时,运用堆栈结构将四元式的输出序列打印出来
while ( exp[i]=='+' || exp[i]=='-'){
syn[++i_syn]=exp[i]; //push(SYN,w)
i++; //read(w)
T();
quat();}
while ( exp[i]=='*' || exp[i]=='/'){
syn[++i_syn]=exp[i]; //push(SYN,w)
i++; //read(w)
F();
quat();}
void quat(){
strcpy(qt[j],"(, , , )");
//QT[j]:=(SYN[k],SEM[s-1],SEM[s],temp);
qt[j][1]=syn[i_syn];
qt[j][3]=sem[i_sem-1];
qt[j][5]=sem[i_sem];
qt[j][7]=temp;
j++;
i_syn--; //pop(SYN);
i_sem--; //pop(SEM);
i_sem--; //pop(SEM);
sem[++i_sem]=temp; //push(SEM,temp);
temp++;}
五、关键代码分析(带注释)及运行结果
#include
#include "string.h"
#include "stdio.h"
using namespace std;
char syn[10]; //文法符号栈
int i_syn;
char sem[10]; //运算对象栈
int i_sem;
char exp[50]; //算术表达式区
int i;
char qt[30][15]; //四元式区
int j=0;
char temp='q'; //临时变量,取值为r--z
int E();
int T();
int F();
void quat(); //生成四元式函数
int main(int argc, char* argv[]){
printf("please input your expression:");
scanf("%s",exp); //输入四元式
i=0; //read(w)
E();
if (exp[i]=='\0')
for (i=0;i printf("%s\n",qt[i]); else printf("err"); return 0;} int E(){ T(); while ( exp[i]=='+' || exp[i]=='-'){ syn[++i_syn]=exp[i]; //push(SYN,w) i++; //read(w) T(); quat();} return 1;} int T(){ F(); while ( exp[i]=='*' || exp[i]=='/'){ syn[++i_syn]=exp[i]; //push(SYN,w) i++; //read(w) F(); quat();} return 1;} int F(){ if ( exp[i]=='('){ i++; //read(w) E(); if ( exp[i]!=')'){ printf("err"); return 0;} }else if ((exp[i]>='a' && exp[i]<='p')||(exp[i]>='0' && exp[i]<='9')){ sem[++i_sem]=exp[i]; } //push(SEM,w) else{ printf("err"); return 0;} i++; //read(w) return 1;} void quat(){ strcpy(qt[j],"( , , , )"); //QT[j]:=(SYN[k],SEM[s-1],SEM[s],temp); qt[j][1]=syn[i_syn]; qt[j][3]=sem[i_sem-1]; qt[j][5]=sem[i_sem]; qt[j][7]=temp; j++; i_syn--; //pop(SYN); i_sem--; //pop(SEM); i_sem--; //pop(SEM); sem[++i_sem]=temp; //push(SEM,temp); temp++;}