编译原理实验报告(语法分析器).docx

上传人:b****1 文档编号:167762 上传时间:2022-10-05 格式:DOCX 页数:13 大小:52.16KB
下载 相关 举报
编译原理实验报告(语法分析器).docx_第1页
第1页 / 共13页
编译原理实验报告(语法分析器).docx_第2页
第2页 / 共13页
编译原理实验报告(语法分析器).docx_第3页
第3页 / 共13页
编译原理实验报告(语法分析器).docx_第4页
第4页 / 共13页
编译原理实验报告(语法分析器).docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

编译原理实验报告(语法分析器).docx

《编译原理实验报告(语法分析器).docx》由会员分享,可在线阅读,更多相关《编译原理实验报告(语法分析器).docx(13页珍藏版)》请在冰豆网上搜索。

编译原理实验报告(语法分析器).docx

.

编译原理实验

专业:

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<<"*********************结**束*使用,再见!

**************************"<

}

三、运行结果

四、心得体会

此次实验使用的是递归子程序法,用这个方法最大的问题就是函数里的递归调用,一不小心就把人绕糊涂了。

所以在写的时候注意力需十分集中。

虽然在函数的实际调用过程中比较复杂,但是只要理清思路,在编写代码时,根据产生式来判断调用,每个部分都相对简单一点。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 党团建设

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1