语法分析实验报告实验二Word格式文档下载.docx
《语法分析实验报告实验二Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《语法分析实验报告实验二Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
<
程序>
-->
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条件循环语句,即是程序中红色字体部分。
在调试与算法功能扩展的过程中,理清了语法分析程序的思路。
从一开始对程序的陌生,到后来逐步了解程序的流程,当我耐心的一步一步理解程序思想,一次次的更改测试用例,一遍遍的调试,最终终于得到了预期的答案。
这次实验使我对理论的语法分析递归下降的理解更加具体清晰,受益匪浅。