编译原理语法分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的
(1)编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。(2)利用C语言编制递归下降分析程序,并对简单语言进行语法分析。
二、实验原理及基本技术路线图(方框原理图)
1.待分析的简单语言的语法:
2.用扩充的BNF表示如下:
(1)<程序>::=begin<语句串>end
(2)<语句串>::=<语句>{;<语句>}
(3)<语句>::=<赋值语句>
(4)<赋值语句>::=ID:=<表达式>
(5)<表达式>::=<项>{+<项> | —项>}
(6)<项>::=<因子>{*<因子> | /<因子>}
(7)<因子>::=ID | NUM | (<表达式>)
3.实验要求说明:
输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。
例如:
置初值
调用scaner读下一个单词符号
调用lrParser
结束
输入begin a:=9;x:=2*3;b:=a+x end #
输出success
输入x:=a+b*c end #
输出 error
4.语法分析程序的算法思想:
(1)主程序示意图如图C3所示。
(2)递归下降分析程序示意图如图C4所示。 (3)语句串分析过程示意图如图C5所示。
(4)statement 语句分析函数流程如图C6、C7、C8、C9所示。
是否begin?
是
否
调用scaner
调用语句串分析函数
是否end?调用scaner
syn=0&&kk=0?打印分析成功
否
是出错处理
是
图c.4递归下降分析程序示意图
否
是
调用statement 函数
是否;?调用scaner
调用statement 函数
出错处理
图c.5语句串分析示意图
图c.6statement语句分析函数示意图
图c.7 expression表达式分析函数示意图
图c.8term 分析函数示意图
是否标识符?
是否整常数
是否?调用scaner 是否)?
调用scaner
出错处理
否
否是
调用expression 函数否
是
是
是
调用scaner
图c.9factor 分析过程示意图
三、所用仪器、材料(设备名称、型号、规格等)
Microsoft Visual C++ 6.0
四、实验方法、步骤
1)复习第三章语法分析程序原理等相关知识。
2)画出程序流程图。
3)根据流程图编写语法分析程序代码
4)语法分析代码如下:
1.语法分析的主程序
void main()
{p=0;
printf("********************语法分析程序***************\n");
printf("请输入源程序:\n");
do
{ scanf("%c",&ch);
prog[p++]=ch;
}while(ch!='#');
p=0;
scaner();
lrparser();
printf("语法分析结束!\n");
}
2.编写扫描子程序
void lrparser()
{
if (syn==1) //begin
{
scaner();
yucu();
if (syn==6) //end
{
scaner();
if (syn==0 && kk==0) printf("success \n");
}
else
{
if(kk!=1) printf("error,lose 'end' ! \n");
kk=1;
}
}
else
printf("error,lose 'begin' ! \n");
kk=1;
}
return;
}
void yucu()
{
statement();
while(syn==26) //;
{
scaner();
statement();
}
return;
}
void statement()
{
if (syn==10)
{
scaner();
if (syn==18)
{
scaner();
expression();
}
else
{
printf("error!");
kk=1;
}
}
else
{
printf("error!");
kk=1;
}
return;
}
void expression()
{
term();
while(syn==13 || syn==14)
{
scaner();
term();