一、实验目的
编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。
二、实验要求
利用C语言编制递归下降分析程序,并对简单语言进行语法分析。
2.1 待分析的简单语言的语法
用扩充的BNF表示如下:
⑴<程序>::=begin<语句串>end
⑵<语句串>::=<语句>{;<语句>}
⑶<语句>::=<赋值语句>
⑷<赋值语句>::=ID:=<表达式>
⑸<表达式>::=<项>{+<项> | -<项>}
⑹<项>::=<因子>{*<因子> | /<因子>
⑺<因子>::=ID | NUM | (<表达式>)
2.2 实验要求说明
输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。
例如:
输入 begin a:=9; x:=2*3; b:=a+xend #
输出 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-6 term分析函数示意图
否
|
|
|
是
图2-7 factor分析过程示意图
三、部分程序代码:
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)
else { printf("the error on '('\n");
kk=1;
}
}
else { printf("the expression error!\n");
kk=1;
}
return;
}