编译原理语法分析报告+代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档