编译原理实验报告(语法分析器).docx
《编译原理实验报告(语法分析器).docx》由会员分享,可在线阅读,更多相关《编译原理实验报告(语法分析器).docx(13页珍藏版)》请在冰豆网上搜索。
![编译原理实验报告(语法分析器).docx](https://file1.bdocx.com/fileroot1/2022-10/5/02acb55a-6d67-4d70-a813-98a8e7274532/02acb55a-6d67-4d70-a813-98a8e72745321.gif)
.
编译原理实验
专业:
13级网络工程
Word资料
语法分析器1
一、实现方法描述
所给文法为G【E】;E->TE’
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#include
#includeusingnamespacestd;#definenum100
charvocabulary[num];char*ch;
voidjudge_E();voidjudge_EE();voidjudge_T();voidjudge_TT();voidjudge_F();
源文件#include"shiyan3.h"voidjudge_E()
{
if(*ch==';')
{
cout<<"该句子符合此文法!
"<inta=0;
cout<<"按1结束程序"<>a;
if(a==1)
exit(0);
}
else
if(*ch=='('||*ch=='i')
{
judge_T();judge_EE();
}
else
{
cout<<"该句子不匹配此文法!
"<cout<<"按1结束程序"<>a;
if(a==1)exit(0);
}
}
voidjudge_EE()
{
if(*ch==';')
{
cout<<"该句子符合此文法!
"<cout<<"按1结束程序"<>a;
if(a==1)
exit(0);
}
if(*ch=='+')
{
ch++;judge_T();judge_EE();
}
else
if(*ch=='#'||*ch==')')return;
else
{
cout<<"该句子不匹配此文法!
"<cout<<"按1结束程序"<>a;
if(a==1)exit(0);
}
}
voidjudge_T()
{
if(*ch==';')
{
cout<<"该句子符合此文法!
"<cout<<"按1结束程序"<>a;
if(a==1)
exit(0);
}
if(*ch=='('||*ch=='i')
{
judge_F();judge_TT();
}
else
{
cout<<"该句子不匹配此文法!
"<cout<<"按1结束程序"<>a;
if(a==1)
exit(0);
}
}
voidjudge_TT()
{
if(*ch==';')
{
cout<<"该句子符合此文法!
"<cout<<"按1结束程序"<cin>>a;if(a==1)
exit(0);
}
if(*ch=='*')
{
ch++;judge_F();judge_TT();
}
else
if(*ch==')'||*ch=='+'||*ch=='#')return;
else
{
cout<<"该句子不匹配此文法!
"<cout<<"按1结束程序"<>a;
if(a==1)exit(0);
}
}
voidjudge_F()
{
if(*ch==';')
{
cout<<"该句子符合此文法!
"<cout<<"按1结束程序"<>a;
if(a==1)
exit(0);
}
if(*ch=='(')
{
ch++;judge_E();if(*ch==')')
{
ch++;
}
else
{
cout<<"该句子不匹配此文法!
"<cout<<"按1结束程序"<>a;
if(a==1)exit(0);
}
}
else
if(*ch=='i')
{
ch++;
//cout<<*ch;
}
else
{
cout<<"该句子不匹配此文法!
"<cout<<"按1结束程序"<>a;
if(a==1)exit(0);
}
}
voidmain()
{
//char*ch;cout<<"*******************欢**迎*
************************"<使用语法分析器
cout<<"请输入一个句子:
"<judge_E();cout<cout<<"*********************结**束*使用,再见!
**************************"<}
三、运行结果
四、心得体会
此次实验使用的是递归子程序法,用这个方法最大的问题就是函数里的递归调用,一不小心就把人绕糊涂了。
所以在写的时候注意力需十分集中。
虽然在函数的实际调用过程中比较复杂,但是只要理清思路,在编写代码时,根据产生式来判断调用,每个部分都相对简单一点。