编译原理实验报告Word文档格式.doc
《编译原理实验报告Word文档格式.doc》由会员分享,可在线阅读,更多相关《编译原理实验报告Word文档格式.doc(26页珍藏版)》请在冰豆网上搜索。
三、实验步骤
1.定义目标语言的可用符号表和构词规则;
2.依次读入源程序符号,对源程序进行单词切分和识别,直到源程序结束;
3.对正确的单词,按照它的种别以<
种别码,值>
的形式保存在符号表中;
4.对不正确的单词,做出错误处理。
四、实验结果
实验源代码:
运行效果:
五、结果分析以及感受
1、实验中需要识别的词
1. 关键字:
DIM、IF、DO、STOP、END单词种别码为1.2.3.4.5。
2.标识符;
单词种别码为6。
3.常数为无符号整形数;
单词种别码为7。
4.运算符包括:
=、-、*、**单词种别码为8.9.10.11。
5.分隔符包括:
、(、);
单词种别码为12.13.14。
2、设计思路
这里以开始定义的C++语言子集的源程序作为词法分析程序的输入数据。
在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查、填适当的信息表。
经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:
常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。
1.定义部分:
定义常量、变量、数据结构。
2.初始化:
从文件将源程序全部输入到字符缓冲区中。
3.取单词前:
去掉多余空白。
4.取单词:
利用实验一的成果读出单词的每一个字符,组成单词,分
5.析类型。
6.显示结果。
3、实验感受
通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;
熟悉了构造词法分析程序的手工方式的相关原理,根据识别语言单词的状态转换图,使用某种高级语言(例如C++语言)直接编写此法分析程序。
另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。
实验二递归下降分析法设计与实现
根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。
本次实验的目的主要是加深对递归下降分析法的理解。
程序输入/输出示例(以下仅供参考):
对下列文法,用递归下降分析法对任意输入的符号串进行分析:
(1)E-TG
(2)G-+TG|—TG
(3)G-ε
(4)T-FS
(5)S-*FS|/FS
(6)S-ε
(7)F-(E)
(8)F-i
输出的格式如下:
(1)递归下降分析程序,编制人:
姓名,学号,班级
(2)输入一以#结束的符号串(包括+—*/()i#):
在此位置输入符号串例如:
i+i*i#
(3)输出结果:
i+i*i#为合法符号串
备注:
输入一符号串如i+i*#,要求输出为“非法的符号串”。
注意:
1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符I,结束符#;
2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好)。
三、实验要求:
1.对语法规则有明确的定义;
2.编写的分析程序能够对实验一的结果进行正确的语法分析;
3.对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成语法分析过程;
1.程序源代码//其中的词法分析cffx()函数在实验一中已经给出
2.实验结果
五、实验分析以及感想
1文法
(1)E->
TG
(2)G->
+TG|-TG
(3)G->
ε
(4)T->
FA
(5)A->
*FA|/FA
(6)A->
(7)F->
(E)
(8)F->
i
2程序思路
0.定义部分:
1.初始化:
从文件将输入符号串输入到字符缓冲区中。
2.利用递归下降分析法分析,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。
3实验感受
需要利用程序设计语言的知识和大量编程技巧,递归下降分析法是一种较实用的分析法,通过这个练习可大大提高软件开发能力。
通过练习,掌握函数间相互调用的方法。
实验三预测分析法设计与实现
加深对语法分析器工作过程的理解;
加强对预测分析法实现语法分析程序的掌握;
能够采用一种编程语言实现简单的语法分析程序;
能够使用自己编写的分析程序对简单的程序段进行语法翻译。
在实验1的基础上,用预测分析法编制语法分析程序,语法分析程序的实现可以采用任何一种编程语言和工具。
4.实验报告要求用文法的形式对语法定义做出详细说明,说明语法分析程序的工作过程,说明错误处理的实现。
四、实验步骤
1.定义目标语言的语法规则;
2.求解预测分析方法需要的符号集和分析表;
3.依次读入实验一的分析结果,根据预测分析的方法进行语法分析,直到源程序结束;
4.对遇到的语法错误做出错误处理。
五、实验结果
1.源代码
//byyl.cpp//程序的主函数
//Stack.cpp:
implementationoftheStackclass.
//
//////////////////////////////////////////////////////////////////////
//栈的类定义头文件
//Stack.h:
interfacefortheStackclass.
2.运行效果
分析成功的效果
分析失败的效果
五、实验分析以及感想
1.LL
(1)分析法的工作过程
开始往栈stack中放“#”,然后把文件开始符号压栈。
预测分析程序总是按stack栈顶符号X和当前输入符号a行事。
①若X=a=”#”,则分析成功,停止分析
②若X=a”#”,则把X从栈顶弹出,a指向下一个
输入符号
③若X∈Vn,则查分析表。
若M[X,a]为某候选式,则弹出X,把该候选式反序压栈;
若M[X,a]=ε,则弹出X,什么也不压;
若M[X,a]=error,则报错。
2.文法
S->
aAcBe
A->
bC
C->
ε
B->
d
实验四算符优先分析法设计与实现
加强对算符优先分析法实现语法分析程序的掌握;
在实验1的基础上,用算符优先分析法编制语法分析程序,语法分析程序的实现可以采用任何一种编程语言和工具。
五、实验内容
1.实验代码
//sfyxfx.cpp程序的主入口其中Stack在上一个程序中已经实现了
2.实验运行效果
六、实验分析以及感想
构造方法以及算法
直观算符优先分析法使用两个工作栈。
OPTR--寄存操作符及#,初值为#,(输入串末尾也加#)
OPND--寄存操作数及结果,初值为空,最后为运算结果。
设Q代表OPTR栈顶的当前符号,a代表新的输入符号,则直观算符优先算法为:
1.Readnextsymboltoa;
2.Ifa=ithenpushaintoOPND,GOTO1;
3.IfQ·
>
athenCallE
(1)QE
(2);
GOTO3;
(注:
E
(1)QE
(2)指popE
(1);
popE
(2);
t:
=E
(1),&
E
(2)进行Q运算;
pusht;
popQ);
4.IfQathen
IfQ=’(‘anda=‘)’thenpopQ;
GOTO1;
IfQ=a=‘#’thensuccess;
halt.
5.IfQ<
·
athenpushaintoOPTR;
6.If(Q,a)=Err.ThenCallERROR.
26