- 121
- 0
- 约9.28千字
- 约 15页
- 2018-12-21 发布于浙江
- 举报
第 PAGE 2页 共 NUMPAGES 15页
实验报告
学院(系)名称:计算机与通信工程学院
姓名
*****
学号
*****
专业
计算机科学与技术
班级
*****
实验项目
实验三:语义分析与中间代码生成
课程名称
编译原理
课程代码
0668056
实验时间
*******
实验地点
计算机软件实验室7-219
批改意见
成绩
教师签字:
实验内容:
可选择LL1分析法、算符优先分析法、LR分析法之一,实现如下表达式文法的语法制导翻译过程。文法G[E]如下所示:
E→E+T | E-T | T
T→T*F | T/F | F
F→P^F | P
P→(E) | i
要求构造出符合语义分析要求的属性文法描述,并在完成实验二(语法分析)的基础上,进行语义分析程序设计,最终输出与测试用例等价的四元式中间代码序列。
实验目的:
1.掌握语法制导翻译的基本功能。
2.巩固对语义分析的基本功能和原理的认识。
3.能够基于语法制导翻译的知识进行语义分析。
4.掌握类高级语言中基本语句所对应的语义动作。
5.理解并处理语义分析中的异常和错误。
实验要求:
1.在实验二的基础上,实现语法制导翻译功能,输出翻译后所得四元式序列;
2.要求详细描述所选分析方法进行制导翻译的设计过程;
3.完成对所设计分析器的功能测试,并给出测试数据和实验结果;
4.为增加程序可读性,请在程序中进行适当注释说明;
5.整理上机步骤,总结经验和体会;
6.认真完成并按时提交实验报告。
【实验过程记录(源程序、测试用例、测试结果及心得体会等)】
分析的四元式:
E→
(+,E1.place,T.place,E.place)
E→
(-,E1.place,T.place,E.place)
E→T
(=,T.place,_,E.place)
T→
(*,T1.place,F.place,T.place)
T→
(/,T1.place,F.place,T.place)
T→F
(=,F.place,_,T.place)
F→
(^,P.place,_,F.place)
F→P
(=,P.place,_,F.place)
P→
(=,E.place,_,P.place)
P→i
(=,lookup(i.name),_,P.place)
根据语法分析修改的程序流程图
程序运行结果:
部分源代码:
Main.cpp
#include iostream
#include Syntax.h
int main(int argc, char ** argv)
{
std::string source;
std::coutplease input an arithmetic expression std::endl;
std::cin source;
ccyg::Syntax * syn = new ccyg::Syntax(source);
syn-analysis();
std::cout symbolStack: inputStack: semStack: std::endl;
while (!syn-getSuccess())
{
syn-printSymbol();
syn-printSource();
syn-printSemantic();
syn-nextStep();
std::cout std::endl;
}
delete syn;
system(pause);
}
Lexical.h
#pragma once
#include string
#include vector
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 setSourceCode(std::string);
char toChar(int);
std::vectorint identifier;
std::vectorint source;
private:
std::string sourceCode;
};
}
Lexical.cpp
#include Lexic
原创力文档

文档评论(0)