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