语法分析实验报告实验二Word格式文档下载.docx

上传人:b****6 文档编号:20422770 上传时间:2023-01-22 格式:DOCX 页数:20 大小:766.85KB
下载 相关 举报
语法分析实验报告实验二Word格式文档下载.docx_第1页
第1页 / 共20页
语法分析实验报告实验二Word格式文档下载.docx_第2页
第2页 / 共20页
语法分析实验报告实验二Word格式文档下载.docx_第3页
第3页 / 共20页
语法分析实验报告实验二Word格式文档下载.docx_第4页
第4页 / 共20页
语法分析实验报告实验二Word格式文档下载.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

语法分析实验报告实验二Word格式文档下载.docx

《语法分析实验报告实验二Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《语法分析实验报告实验二Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。

语法分析实验报告实验二Word格式文档下载.docx

<

程序>

-->

function<

语句串>

endfunc

语句>

{;

}

<

赋值语句>

ID<

表达式>

项>

{+<

|-<

因子>

{*<

|/<

ID|NUM|(<

备注:

实验当中我对程序进行了扩展,增加了程序识别if条件判断语句,while循环语句的功能

2.实验要求说明

输入单词串以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。

四、程序流程图

主函数:

Scanner()函数:

irparser()函数

yucu()/*语句串分析*/

statement()/*语句分析函数*/

expression()/*表达式分析函数*/

term()/*项分析函数*/

factor()/*因子分析函数*/

五、程序代码:

递归下降分析文法:

语句串>

{;

}

|<

if条件语句>

|<

while循环语句>

{+<

|-<

ID|NUM|(<

(<

)|(ID)|(NUM)<

while条件循环语句>

红色字体部分为我对代码实现功能的主要修改与扩展部分。

/*语法分析源代码*/

#include<

stdio.h>

string.h>

charprog[80],token[8];

charch;

intsyn,p,m=0,n,sum,kk=0;

char*rwtab[6]={"

function"

"

if"

then"

while"

do"

endfunc"

};

voidyucu();

voidexpression();

voidstatement();

voidfactor();

voidterm();

voidirparser();

voidscaner()

{for(n=0;

n<

8;

n++)

token[n]=NULL;

while(ch=='

'

||ch=='

\n'

ch=prog[p++];

m=0;

if((ch<

='

z'

&

&

ch>

a'

)||(ch<

Z'

A'

))

{while((ch<

9'

0'

{token[m++]=ch;

ch=prog[p++];

}

syn=10;

for(n=0;

6;

if(strcmp(token,rwtab[n])==0)

{syn=n+1;

break;

}

token[m++]='

\0'

;

else

if(ch<

{sum=0;

while(ch<

{sum=sum*10+ch-'

ch=prog[p++];

syn=11;

else

{switch(ch)

{case'

'

:

m=0;

token[m++]=ch;

if(ch=='

{syn=22;

token[m+1]=ch;

else

{syn=20;

ch=prog[--p];

case'

>

{syn=24;

token[m++]=ch;

}

{syn=23;

p--;

:

m=0;

token[m++]=ch;

{syn=25;

token[m++]=ch;

{syn=18;

ch=prog[--p];

!

token[m++]=ch;

ch=prog[++p];

{syn=22;

syn=-1;

+'

syn=13;

token[0]=ch;

break;

-'

syn=14;

*'

syn=15;

/'

syn=16;

syn=26;

('

syn=27;

)'

syn=28;

#'

syn=0;

default:

syn=-1;

//break;

}}

voidirparser()

{if(syn==1)

{scaner();

yucu();

/*语句串分析*/

if(syn==6)/*读到endfunc*/

{scaner();

if(syn==0&

kk==0)/*程序分析识别完*/

printf("

success"

);

{if(kk!

=1)/*没以endfunc结束*/

{printf("

error!

need'

endfunc'

"

kk=1;

{printf("

need'

function'

kk=1;

voidyucu()/*语句串分析*/

{statement();

/*调用语句分析函数*/

while(syn==26)/*一个语句识别结束,继续识别*/

statement();

return;

voidstatement()/*语句分析函数*/

{if(syn==10)

if(syn==18)//如果是赋值语句

expression();

}//这个过程实现语法分析判断语句

{printf("

evaluatetagerror"

kk=1;

if(syn==6)

return;

if(syn==2)//如果是条件判断语句就判断条件表达式的语法!

if(syn==27)//判断括号匹配

{do

{scaner();

//进入括号内部进行表达式分析

}while(syn!

=28);

else{printf("

needanother'

}//()内判断完成!

scaner();

//然后进行语句块分析!

}//到这里是实现判断if语句的语法分析

//类似的往里添加循环语句!

if(syn==4)//如果是循环语句就判断条件表达式的语法!

//ch=prog[p++];

if(syn==27)

{do

else{

}//()内判断完成!

}//这里是实现判断while语句的语法分析

thestatementerror!

kk=1;

voidexpression()/*表达式分析函数*/

{term();

while(syn==13||syn==14)

term();

voidterm()/*项分析函数*/

{factor();

while(syn==15||syn==16)

factor();

voidfactor()/*因子分析函数*/

{if(syn==10||syn==11)

else/*看是否是表达式*/

{expression();

if(syn==27)

if(syn==28)

{scaner();

else

expressionerror!

voidmain()

{p=0;

printf("

\npleaseinputthestring:

\n"

do

{ch=getchar();

prog[p++]=ch;

}while(ch!

p=0;

ch=prog[p++];

irparser();

测试用例1

输出结果

测试用例2

测试用例3

function

a=1;

b=2;

c=a+b;

#

success

if(3>

1)

if(a>

b)

while(a>

b=1;

测试用例4

a=1

Pressanykeytocontinue

通过编译原理实验二语法分析实验,使得自己对语法分析的流程有了更深刻的了解,使得语法分析递归向下思想更加具体化,虽然源代码并非由自己设计,但是在调试程序的过程中,逐步理解程序递归下降思想,思路不断理清,不仅理解了程序分析赋值语句的算法,同时在这基础上,我对程序做了功能扩展,增加了语法分析条件判断语句和while条件循环语句,即是程序中红色字体部分。

在调试与算法功能扩展的过程中,理清了语法分析程序的思路。

从一开始对程序的陌生,到后来逐步了解程序的流程,当我耐心的一步一步理解程序思想,一次次的更改测试用例,一遍遍的调试,最终终于得到了预期的答案。

这次实验使我对理论的语法分析递归下降的理解更加具体清晰,受益匪浅。

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

当前位置:首页 > 高中教育 > 语文

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

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