1 / 17
文档名称:

语法分析实验报告(实验二).doc

格式:doc   大小:1,444KB   页数:17页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

语法分析实验报告(实验二).doc

上传人:mh900965 2017/12/16 文件大小:1.41 MB

下载得到文件列表

语法分析实验报告(实验二).doc

文档介绍

文档介绍:编译原理语法分析实验报告
软工082班
兰洁
200831104044
实验内容
实验目的
实验要求
程序流程图
主函数;
scanner();
irparser()函数
yucu() /*语句串分析*/
statement()/*语句分析函数*/
expression()/*表达式分析函数*/
term()/*项分析函数*/
factor()/*因子分析函数*/
程序代码
测试用例
输出结果
实验心得
一、实验内容:
编写为一上下文无关文法构造其递归下降语法分析程序,并对任给的一个输入串进行语法分析检查。程序要求能对输入串进行递归下降语法分析,能判别程序是否符合已知的语法规则,如果不符合(编译出错),则输出错误信息。
二、实验目的:
构造文法的语法分析程序,要求采用递归下降语法分析方法对输入的字符串进行语法分析,实现对词法分析程序所提供的单词序列的语法检查和结构分析,进一步掌握递归下降的语法分析方法。
三、实验要求:
利用C语言编制递归下降分析程序,并对Training语言进行语法分析。
待分析的Training语言语法。
用扩充的表示如下:
<程序>-->function<语句串>endfunc
<语句串>--><语句>{;<语句>}
<语句>à<赋值语句>
<赋值语句>àIDà<表达式>
<表达式>à<项>{+<项>|-<项>}
<项>à<因子>{*<因子>|/<因子>}
<因子>àID|NUM|(<表达式>)
备注:实验当中我对程序进行了扩展,增加了程序识别if条件判断语句,while循环语句的功能
实验要求说明
输入单词串以“#”结束,如果是文法正确的句子,则输出成功信息,打印“ess”,否则输出“error”。
四、程序流程图
主函数:
Scanner()函数:
irparser()函数
yucu() /*语句串分析*/
statement()/*语句分析函数*/
expression()/*表达式分析函数*/
term()/*项分析函数*/
factor()/*因子分析函数*/
五、程序代码:
递归下降分析文法:
<程序>-->function< 语句串>endfunc
<语句串>--><语句>{ ;<语句> }
<语句>à<赋值语句> |<if条件语句> | <while循环语句>
<赋值语句>à <表达式>
<表达式>à<项>{ +<项> | -<项> }
<项>à<因子>{*<因子>|/<因子>}
<因子>àID | NUM | (<表达式>)
<if条件语句>à(<表达式>)| (ID) |(NUM)à<语句>
<while条件循环语句>à(<表达式>)| (ID) |(NUM)à<语句>
备注:红色字体部分为我对代码实现功能的主要修改与扩展部分。
/*语法分析源代码*/
#include<>
#include<>
char prog[80],token[8];
char ch;
int syn,p,m=0,n,sum,kk=0;
char *rwtab[6]={"function","if","then","while","do","endfunc"};
void yucu();
void expression();
void statement();
void factor();
void term();
void irparser();
void scaner()
{ 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' && ch>='A'))
{while((ch<='z' && ch>='a') || (ch<='Z' && ch>='A') || (ch<='9' && ch>='0'))
{token[m++]=ch;
ch=prog[p++];
}
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{ syn=n+1;
break;
}
token[m++]='\0';}
else
if(ch<='9' && ch>='0')
{ sum=0;
while(ch<='9' && ch>='0')
{ sum=sum*10+ch-'0';
ch=prog[p++];
}
syn=11;