文档介绍:编译原理语法分析实验报告
软工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;