LL(1)语法分析设计原理与实现技术实验报告文档Word文档下载推荐.doc
《LL(1)语法分析设计原理与实现技术实验报告文档Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《LL(1)语法分析设计原理与实现技术实验报告文档Word文档下载推荐.doc(17页珍藏版)》请在冰豆网上搜索。
![LL(1)语法分析设计原理与实现技术实验报告文档Word文档下载推荐.doc](https://file1.bdocx.com/fileroot1/2022-10/2/41b51a8f-7bd7-4c61-b8a8-426a2ecb5c1c/41b51a8f-7bd7-4c61-b8a8-426a2ecb5c1c1.gif)
M→*|/
[实验说明]
终结符号i为用户定义的简单变量,即标识符的定义。
[设计要求]
(1)输入串应是词法分析的输出二元式序列.即某算术表达式“实验项目一”的输出结果。
输出为输入串是否为该文法定义的算术表达式的判断结果;
(2)LL
(1)分析过程应能发现输入串出错;
(3)设计两个测试用例(尽可能完备.正确和出错).并给出测试结果。
三、实验环境:
操作系统:
Windows7
软件:
VC++6.0
四、程序功能描述:
l提供了文件输入方式.且输入的内容为二元式序列;
l能够对输入的字符串做出正确的LL
(1)分析判断.并给出判断结果.判断结果输出到文件.并显示在屏幕;
l能发现输入串中的错误.包含非法字符.输入不匹配等;
l能够处理一些可预见性的错误.如文件不存在.输入非法等。
五、数据结构设计:
全局:
局部(main()中):
六、程序结构描述:
l设计方法:
本程序采用从文件读取的输入方式.输入的内容需为二元式序列.然后按照LL
(1)分析的方法对输入的字符串进行分析判断.并输出判断结果.程序通过对输入串的检查能够发现输入串中的错误。
程序规定的单词符号及其种别码见下表:
单词符号及其种别码表
单词符号
种别码
(
1
*
5
)
2
/
6
+
3
i
7
-
4
#
8
分析表
E
E→TG
G
G→ATG
G→ε
T
T→FH
H
H→ε
H→MFH
F
F→i
F→(E)
A
A→+
A→-
M
M→*
M→/
l主要函数说明:
check_VT(charch):
bool型函数.检查ch是否为终结字符.是则返回true;
create_analyseTable():
构建分析表函数.无返回值;
error(FILE*fp):
输出错误.表示不是该文法的句子,参数fp用于退出前将打开的文件关闭;
getnum_VN(charch):
int型函数.查找ch在非终结字符中的位置并返回;
getnum_VT(charch):
int型函数.查找ch在终结字符中的位置并返回;
justify():
bool型函数.判断文件读取内容是否合法.包括检查非法字符和不匹配现象.出错返回false.否则返回true;
main():
主函数。
l函数调用关系说明:
main()调用check_VT(charch)、create_analyseTable()、error(FILE*fp)、getnum_VN(charch)、getnum_VT(charch)、justify();
l执行框图:
七、实验过程结果截图:
l测试用例一:
i+i*i/i#
l测试用例二:
i+i*i/#
八、实验总结:
l实验心得:
通过本次实验我锻炼了自己的上机操作能力及编程能力.并对理论知识有了进一步的了解。
老师提供的LL
(1)分析法的流程图给了我很大的帮助.使得本实验基本思路变得很清晰.用较为简单的算法就能实现.程序的难点是产生式结构体的构造、分析表的构造、解决实验中遇到的问题也花费了一部分时间.我增长了处理关于文件错误的能力。
l实验中遇到的问题及解决方法:
问题主要有
i.从文件输入二元式时.需要检查输入的内容是否符合程序规定的字符种别码.解决方法是用了两个字符数组token,token2.分别记录种别码和字符.并增加了一个函数justify()根据既定的种别码表判断;
ii.当输入内容不匹配或输入内容非法时要退出程序.此时若不关闭已经打开的文件可能导致文件内容受到破坏;
解决方法是给error()函数设置一个文件指针变量参数FILE*fp.在退出程序之前通过fp关闭文件
l程序的自我评价:
此程序实现了要求中的所有功能.并增加了输入串错误检测的功能.但因编程能力及经验的有限.其中有的地方不免有些繁杂.还有一些潜藏的问题.需要进一步测试与修改来提高程序的健壮性。
九、程序清单:
/****************************************************
课题名称:
作者:
房皓进修生13410801
最后修改时间:
2014.4.30
***************************************************/
/**************************************************单词符号及其分类编码
单词符号 种别码
( 1
) 2
+ 3
- 4
* 5
/ 6
i 7
# 8
/**********************文法**********************
E→TE′
T→FT′
F→(E)|i
A→+|-
M→*|/
/********************改为等价文法**************
G→ATG|ε
H→MFH|ε
F→(E)|i
M→*|/
/*********************分析表************************
i + - * / ( ) #
E E→TG E→TG
G G→ATG G→ATG G→ε G→ε
T T→FH T→FH
H H→ε H→ε H→MFH H→MFH H→ε H→ε
F F→i F→(E)
A A→+ A→-
M M→* M→/
/***************************************************/
#include<
iostream>
conio.h>
string.h>
usingnamespacestd;
#defineMAX50
charanalyseStack[MAX];
//分析栈
chartoken[MAX];
//输入串
typedefstructCSS //产生式结构体
{
charleft;
charright[5];
intright_length;
}CSS;
CSSE,G,G1,T,H,H1,F,F1,A,A1,M,M1;
CSSanalyseTable[7][8];
voiderror(FILE*fp)
fprintf(fp,"
%s"
"
FAIL!
"
);
fclose(fp);
cout<
<
endl;
exit(0);
}
booljustify(charch,inti) //判断文件读取内容是否合法.包括检查非法字符和不匹配现象
switch(ch)
{
case'
1'
:
if(token[i]!
='
('
returnfalse;
break;
2'
)'
3'
+'
4'
-'
5'
*'
6'
/'
7'
i'
8'
#'
default:
returnfalse;
}
returntrue;
boolcheck_VT(charch)
if(ch=='
||ch=='
returntrue;
returnfalse;
intgetnum_VN(charch)
charVN[7]={'
E'
'
G'
T'
H'
F'
A'
M'
};
inti;
for(i=0;
i<
7;
i++)
if(ch==VN[i])
returni;
intgetnum_VT(charch)
charVT[8]={'
8;
if(ch==VT[i])
brea