编译原理语法分析报告+代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
语法分析
一、实验目的
编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。
二、实验要求
利用C语言编制递归下降分析程序,并对简单语言进行语法分析。
2.1 待分析的简单语言的语法
用扩充的BNF表示如下:
⑴<程序>::=begin<语句串>end
⑵<语句串>::=<语句>{;<语句>}
⑶<语句>::=<赋值语句>
⑷<赋值语句>::=ID:=<表达式>
⑸<表达式>::=<项>{+<项> | -<项>}
⑹<项>::=<因子>{*<因子> | /<因子>
⑺<因子>::=ID | NUM | (<表达式>)
2.2 实验要求说明
输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。
例如:
输入begin a:=9; x:=2*3; b:=a+x end #
输出success!
输入x:=a+b*c end #
输出error
2.3 语法分析程序的酸法思想
(1)主程序示意图如图2-1所示。
图2-1 语法分析主程序示意图
(2)递归下降分析程序示意图如图2-2所示。(3)语句串分析过程示意图如图2-3所示。
图2-3 语句串分析示意图
图2-2 递归下降分析程序示意图
(4)statement语句分析程序流程如图2-4、2-5、2-6、2-7所示。
图2-4 statement语句分析函数示意图图2-5 expression表达式分析函数示意图
图2-7 factor分析过程示意图
三、语法分析程序的C语言程序源代码:
#include "stdio.h"
#include "string.h"
char prog[100],token[8],ch;
char *rwtab[6]={"begin","if","then","while","do","end"};
int syn,p,m,n,sum;
int kk;
factor();
expression();
yucu();
term();
statement();
lrparser();
scaner();
main()
{
p=kk=0;
printf("\nplease input a string (end with '#'): \n");
do
{ scanf("%c",&ch);
prog[p++]=ch;
}while(ch!='#');
p=0;
scaner();
lrparser();
getch();
}
lrparser()
{
if(syn==1)
{
scaner(); /*读下一个单词符号*/
yucu(); /*调用yucu()函数;*/
if (syn==6)
{ scaner();
if ((syn==0)&&(kk==0))
printf("success!\n");
}
else { if(kk!=1) printf("the string haven't got a 'end'!\n");
kk=1;
}
}
else { printf("haven't got a 'begin'!\n");
kk=1;
}
return;
}
yucu()
{
statement(); /*调用函数statement();*/
while(syn==26)
{
scaner(); /*读下一个单词符号*/
if(syn!=6)
statement(); /*调用函数statement();*/
}
return;
}
statement()
{ if(syn==10)
{
scaner(); /*读下一个单词符号*/
if(syn==18)
{ scaner(); /*读下一个单词符号*/ expression(); /*调用函数statement();*/ }
else { printf("the sing ':=' is wrong!\n");
kk=1;
}
}
else { printf("wrong sentence!\n");
kk=1;
}
return;
}
expression()
{ term();
while((syn==13)||(syn==14))
{ scaner(); /*读下一个单词符号*/ term(); /*调用函数term();*/
}
return;
}
term()
{ factor();
while((syn==15)||(syn==16))
{ scaner(); /*读下一个单词符号*/ factor(); /*调用函数factor(); */ }
return;
}
factor()
{ if((syn==10)||(syn==11)) scaner();
else if(syn==27)
{ scaner(); /*读下一个单词符号*/
expression(); /*调用函数statement();*/ if(syn==28)
scaner(); /*读下一个单词符号*/
else { printf("the error on '('\n");
kk=1;
}
}
else { printf("the expression error!\n");
kk=1;
}
return;