编译原理实验报告(语法分析器)Word格式文档下载.docx
《编译原理实验报告(语法分析器)Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告(语法分析器)Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
E’->
+TE’|空
T->
FT’
T’->
*FT’|空F->
i|(E)
递归子程序法:
首先计算出五个非终结符的first集合follow集,然后根据五个产生式定义了五个函数。
定义字符数组vocabulary来存储输入的句子,字符指针ch指向vocabulary。
从非终结符E函数出发,如果首字符属于E的first集,则依次进入T函数和E’函数,开始递归调用。
在每个函数中,都要判断指针所指字符是否属于该非终结符的first集,属于则根据产生式进入下一个函数进行调用,若first集中有空字符,还要判断是否属于该非终结符的follow集。
以分号作为结束符。
二、实现代码
头文件shiyan3.h
#include<
iostream>
#include<
cstdio>
string>
usingnamespacestd;
#definenum100
charvocabulary[num];
char*ch;
voidjudge_E();
voidjudge_EE();
voidjudge_T();
voidjudge_TT();
voidjudge_F();
源文件#include"
shiyan3.h"
voidjudge_E()
{
if(*ch=='
;
'
)
cout<
<
"
该句子符合此文法!
endl;
inta=0;
按1结束程序"
cin>
>
a;
if(a==1)
exit(0);
}
else
('
||*ch=='
i'
judge_T();
judge_EE();
该句子不匹配此文法!
inta=0;
if(a==1)exit(0);
voidjudge_EE()
+'
ch++;
judge_T();
#'
)'
)return;
voidjudge_T()
judge_F();
judge_TT();
voidjudge_TT()
cin>
if(a==1)
*'
judge_F();
voidjudge_F()
judge_E();
if(*ch=='
//cout<
*ch;
voidmain()
//char*ch;
cout<
*******************欢**迎*
************************"
使用语法分析器
请输入一个句子:
cin.getline(vocabulary,15);
ch=vocabulary;
judge_E();
*********************结**束*使用,再见!
**************************"
三、运行结果
四、心得体会
此次实验使用的是递归子程序法,用这个方法最大的问题就是函数里的递归调用,一不小心就把人绕糊涂了。
所以在写的时候注意力需十分集中。
虽然在函数的实际调用过程中比较复杂,但是只要理清思路,在编写代码时,根据产生式来判断调用,每个部分都相对简单一点。