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

上传人:枫** 文档编号:393488566 上传时间:2022-09-06 格式:DOCX 页数:16 大小:110.01KB
返回 下载 相关 举报
天津理工大学编译原理实验3:语义分析与中间代码生成_第1页
第1页 / 共16页
天津理工大学编译原理实验3:语义分析与中间代码生成_第2页
第2页 / 共16页
天津理工大学编译原理实验3:语义分析与中间代码生成_第3页
第3页 / 共16页
天津理工大学编译原理实验3:语义分析与中间代码生成_第4页
第4页 / 共16页
天津理工大学编译原理实验3:语义分析与中间代码生成_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《天津理工大学编译原理实验3:语义分析与中间代码生成》由会员分享,可在线阅读,更多相关《天津理工大学编译原理实验3:语义分析与中间代码生成(16页珍藏版)》请在金锄头文库上搜索。

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

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

3、析的四元式:E T El +T(+,E1.place,T.place,E.place)E t EiT(-,E1.place,T.place,E.place)E tT(=,T.place,E.place)T t Ti * F(*,T1.place,F.place,T.place)T tTi/F(/,T1.place,F.place,T.place)T t F(二,F.place,T.place)F T PFC,P.place,F.place)FtP(二,P.place,F.place)Pt(E)(=,E.place,P.place)P t i(=,lookup( i.n ame),P.place

4、)N与符号栈比较关系是否成功开始结束根据语法分析修改的程序流程图将符号移进符号栈从输入串获取字符输出结果根据四元式修改语义栈从标识符中查找数值 压入语义栈Error出错处理归约i-i人/i-iAi# /it-Ci+i/i-i-iAHEana Ips is success#E-F_22_1667_6561#E-_23_10_12_23_10_12 _23_0.833333 _22.ifc6? _22.1667_#P4-#P+i5_ 5_3.5jSi/nbolStack:inputStack:semStack:i+i*i/i-iAi#please input an arithmetic expre

5、ssion -/12-3A8Press ankey to continue .1#-33333333 2- 2- 2- 2- 2- 2- 2-2#P+P#P+P*P ttF+T ME - #E- #E- #E-i #E-(F BtE-P+ BtE-P+i #E-P+P #E-#include Syntax.h int main(int argc, char * argv)std:string source;std:coutplease input an arithmetic expression source;ccyg:Syntax * syn = new ccyg:Syntax (sourc

6、e);synanalysis ();std:cout symbolstack: inputStack: semStack:getSuccess ()syn-printSymbol ();syn-printSource (); syn-printSemantic();syn-nextStep(); std:cout std:endl;delete syn;system (pause);Lexical.h#pragma once #include string #include namespace ccygclass Lexicalpublic:enum letteradd = 0,sub = 1

7、,mul = 2,div = 3,pow = 4,ide = 5,lef = 6,rig = 7,sha = 8; Lexical ();Lexical(std:string); Lexical ();bool analysis(); void printSource ();void setSourceCode (std:string); char toChar(int);std:vector identifier;std:vectorint source; private:std:string sourceCode;;Lexical.cpp#include Lexical.h#include

8、 #include stdio.husing namespace ccyg;Lexical:Lexical()Lexical:Lexical(std:string s)sourceCode = s;Lexical: Lexical ()bool Lexical:analysis()if (sourceCode. size() = 0)std:cout source is empty ! std:endl; return false;source. clear ();identif ier. clear ();int number = NULL;for (int i = 0; i= source

9、Code. size(); i+)if (i = sourceCode.size()if (number != NULL)source. push_back(ide); identifier. push_back(number);number = 0;source. push_back(sha);return true;else if (sourceCodei = O& sourceCodei = 9)number = number * 10 + sourceCode i - 48;elseif (number != NULL)source. push_back(ide);identifier

10、. push_back(number);number = 0;switch (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);b

11、reak;default:std:cout can 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:ret urn +;case sub:ret urn -;case mul:re

12、t urn *;case div:ret urn /;case pow:return ;case ide:ret urn i;case lef:ret urn (;case rig:return );case sha:ret urn #;default:break;return 0;void Lexical:setSourceCode(std:string source)sourceCode = source;Syntax.h#pragma once#include Lexical.hnamespace ccygclass Syntax : public ccyg:Lexicalpublic:enum Relation /定义优先关系枚举equal = 0, less = 1, grea ter = 2,/错误 i_i = 3, i_le ft = 4, left _sharp = 5, righ t_i = 6, righ t_ lef t = 7, sharp_right = 8;enum SymbolE=9,T=10,F=11,P=12;Syntax (std:string = 0);Syntax ();bool reduced。;/定义归约方法 void movein (); /定义

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号