ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:131KB ,
资源ID:30369238      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30369238.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(天津理工大学编译原理实验3语义分析与中间代码生成.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

天津理工大学编译原理实验3语义分析与中间代码生成.docx

1、天津理工大学编译原理实验3语义分析与中间代码生成实验报告学院(系)名称:计算机与通信工程学院姓名*学号*专业计算机科学与技术班级*实验项目实验三:语义分析与中间代码生成课程名称编译原理课程代码0668056实验时间*实验地点计算机软件实验室7-219批改意见成绩教师签字: 实验内容:可选择LL1分析法、算符优先分析法、LR分析法之一,实现如下表达式文法的语法制导翻译过程。文法GE如下所示:EE+T | E-T | TTT*F | T/F | FFPF | PP(E) | i要求构造出符合语义分析要求的属性文法描述,并在完成实验二(语法分析)的基础上,进行语义分析程序设计,最终输出与测试用例等价

2、的四元式中间代码序列。实验目的:1掌握语法制导翻译的基本功能。2巩固对语义分析的基本功能和原理的认识。3能够基于语法制导翻译的知识进行语义分析。4掌握类高级语言中基本语句所对应的语义动作。5理解并处理语义分析中的异常和错误。实验要求:1在实验二的基础上,实现语法制导翻译功能,输出翻译后所得四元式序列;2要求详细描述所选分析方法进行制导翻译的设计过程;3完成对所设计分析器的功能测试,并给出测试数据和实验结果;4为增加程序可读性,请在程序中进行适当注释说明;5整理上机步骤,总结经验和体会;6认真完成并按时提交实验报告。【实验过程记录(源程序、测试用例、测试结果及心得体会等)】分析的四元式:(+,E

3、1.place,T.place,E.place)(-,E1.place,T.place,E.place)(=,T.place,_,E.place)(*,T1.place,F.place,T.place)(/,T1.place,F.place,T.place)(=,F.place,_,T.place)(,P.place,_,F.place)(=,P.place,_,F.place)(=,E.place,_,P.place)(=,lookup(i.name),_,P.place) 根据语法分析修改的程序流程图程序运行结果:部分源代码:Main.cpp#include #include Syntax

4、.hint main(int argc, char * argv) std:string source; std:coutplease input an arithmetic expression source; ccyg:Syntax * syn = new ccyg:Syntax(source); syn-analysis(); std:cout symbolStack: inputStack: semStack: getSuccess() syn-printSymbol(); syn-printSource(); syn-printSemantic(); syn-nextStep();

5、std:cout std:endl; delete syn; system(pause);Lexical.h#pragma once#include #include namespace ccyg class Lexical public: enum letter add = 0, sub = 1, mul = 2, div = 3, pow = 4, ide = 5, lef = 6, rig = 7, sha = 8 ; Lexical(); Lexical(std:string); Lexical(); bool analysis(); void printSource(); void

6、setSourceCode(std:string); char toChar(int); std:vector identifier; std:vector source; private: std:string sourceCode; ;Lexical.cpp#include Lexical.h#include #include using namespace ccyg;Lexical:Lexical()Lexical:Lexical(std:string s) sourceCode = s;Lexical:Lexical()bool Lexical:analysis() if (sourc

7、eCode.size() = 0) std:cout source is empty ! std:endl; return false; source.clear(); identifier.clear(); int number = NULL; for (int i = 0; i = 0& sourceCodei = 9) number = number * 10 + sourceCodei - 48; else if (number != NULL) source.push_back(ide); identifier.push_back(number); number = 0; switc

8、h (sourceCodei) case +: source.push_back(add); break; case -: source.push_back(sub); break; case *: source.push_back(mul); break; case /: source.push_back(div); break; case : source.push_back(pow); break; case (: source.push_back(lef); break; case ): source.push_back(rig); break; default: std:cout c

9、an not identify : sourceCodei std:endl; return false; break; source.push_back(sha); return true;void Lexical:printSource() for (int i = 0; i source.size(); i+) std:cout toChar(sourcei); std:cout ;char Lexical:toChar(int a) switch (a) case add: return +; case sub: return -; case mul: return *; case d

10、iv: return /; case pow: return ; case ide: return i; case lef: return (; case rig: return ); case sha: return #; default: break; return 0;void Lexical:setSourceCode(std:string source) sourceCode = source;Syntax.h#pragma once#include Lexical.hnamespace ccyg class Syntax : public ccyg:Lexical public:

11、enum Relation /定义优先关系枚举 equal = 0, less = 1, greater = 2, /错误 i_i = 3, i_left = 4, left_sharp = 5, right_i = 6, right_left = 7, sharp_right = 8 ; enum Symbol E = 9, T = 10, F = 11, P = 12 ; Syntax(std:string = 0); Syntax(); bool reduced();/定义归约方法 void movein();/定义移进方法 int findOperator();/查找最近运算符 cha

12、r toChar(int); bool nextStep(); void initNext(); void printSymbol(); void printSemantic(); bool getSuccess(); std:vector symbolStack;/ 定义符号栈 std:vector inputStack; / 定义输入栈 std:vector semStack; /定义语义栈 bool isSuccess; bool isInitNext; static const int preArray99; ;Syntax.cpp#include Syntax.h#include u

13、sing namespace ccyg;const int Syntax:preArray99 = 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 4, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 5, 2, 2, 2, 2, 2, 6, 7, 2, 2, 1, 1, 1, 1, 1, 1, 1, 8, 0 ;long lo

14、ng poow(int a,int b) if (b = 1) return a; else return poow(a,b-1) * a; Syntax:Syntax(std:string s) : Lexical(s) isSuccess = false; isInitNext = false;Syntax:Syntax()void Syntax:movein() symbolStack.push_back(source0); if (source0 = ide) semStack.push_back(identifier0); std:vector:iterator iter = ide

15、ntifier.begin(); identifier.erase(iter); else semStack.push_back(NULL); std:vector:iterator it = source.begin(); source.erase(it);bool Syntax:reduced() if (symbolStacksymbolStack.size() - 1 = ide) symbolStacksymbolStack.size() - 1 = P; else switch (symbolStacksymbolStack.size() - 2) case add: symbol

16、StacksymbolStack.size() - 3 = E; symbolStack.pop_back(); symbolStack.pop_back(); semStacksemStack.size() - 3 = semStacksemStack.size() - 3 + semStacksemStack.size() - 1; semStack.pop_back(); semStack.pop_back(); break; case sub: symbolStacksymbolStack.size() - 3 = E; symbolStack.pop_back(); symbolSt

17、ack.pop_back(); semStacksemStack.size() - 3 = semStacksemStack.size() - 3 - semStacksemStack.size() - 1; semStack.pop_back(); semStack.pop_back(); break; case mul: symbolStacksymbolStack.size() - 3 = T; symbolStack.pop_back(); symbolStack.pop_back(); semStacksemStack.size() - 3 = semStacksemStack.si

18、ze() - 3 * semStacksemStack.size() - 1; semStack.pop_back(); semStack.pop_back(); break; case div: symbolStacksymbolStack.size() - 3 = T; symbolStack.pop_back(); symbolStack.pop_back(); semStacksemStack.size() - 3 =(double) semStacksemStack.size() - 3 / (double)semStacksemStack.size() - 1; semStack.

19、pop_back(); semStack.pop_back(); break; case pow: symbolStacksymbolStack.size() - 3 = F; symbolStack.pop_back(); symbolStack.pop_back(); semStacksemStack.size() - 3 = poow (semStacksemStack.size() - 3 , semStacksemStack.size() - 1 ); semStack.pop_back(); semStack.pop_back(); break; case lef: symbolS

20、tacksymbolStack.size() - 2 = E; symbolStack.pop_back(); semStacksemStack.size() - 2 = semStacksemStack.size() - 1; semStack.pop_back(); std:vector:iterator it = source.begin(); source.erase(it); break; case sha: std:cout analysis success = 0; i-) if (symbolStackiE) return symbolStacki; return -1;cha

21、r Syntax:toChar(int i) char ch = Lexical:toChar(i); if (ch != 0) return ch; switch (i) case E: return E; case T: return T; case F: return F; case P: return P; default: std:cout error: unknown symbol std:endl; return 0;void Syntax:initNext() if (isInitNext = false) symbolStack.clear(); symbolStack.pu

22、sh_back(sha); semStack.clear(); semStack.push_back(NULL); isSuccess = false; isInitNext = true; bool Syntax:nextStep() if (isSuccess = true) return true; if (!isInitNext) initNext(); int a = findOperator(); int b = source0; switch (preArrayab) case less: movein(); break; case greater: reduced(); bre

23、ak; case equal: isSuccess = reduced(); break; return isSuccess;void Syntax:printSymbol() for (int i = 0; i symbolStack.size(); i+) std:cout toChar(symbolStacki); std:cout ;bool Syntax:getSuccess() return isSuccess;void Syntax:printSemantic() for (int i = 0; i semStack.size(); i+) if (semStacki = NULL) std:cout _; else std:cout semStacki; std:cout ;心得体会:这次实验做得还是不够理想,虽然做出了语法制导翻译的全过程,但是还有部分地方不够完美。例如四元式的使用及输出,不过总体来说,也算是深入的掌握了语法制导翻译的全过程,获益匪浅。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1