编译实习语法分析.docx

上传人:b****5 文档编号:6659960 上传时间:2023-01-08 格式:DOCX 页数:17 大小:510.97KB
下载 相关 举报
编译实习语法分析.docx_第1页
第1页 / 共17页
编译实习语法分析.docx_第2页
第2页 / 共17页
编译实习语法分析.docx_第3页
第3页 / 共17页
编译实习语法分析.docx_第4页
第4页 / 共17页
编译实习语法分析.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

编译实习语法分析.docx

《编译实习语法分析.docx》由会员分享,可在线阅读,更多相关《编译实习语法分析.docx(17页珍藏版)》请在冰豆网上搜索。

编译实习语法分析.docx

编译实习语法分析

编号:

实习

总评

教师签名

成绩

 

《编译原理》课程

实习报告

编号:

实习题目:

语法分析器

专业(班):

学生学号:

学生姓名:

任课教师:

2011 年1月12日

 

1.问题定义和分析

1.1实习目的

1.2实习要求

1.3要求分析

2.程序设计

2.1.数据结构

2.2.算法及程序流程图

2.3.界面

3.程序运行实例

3.1实例1

3.2实例2

3.3非合法语法输入

4.部分程序核心源代码

5.总结

 

1.问题定义与分析

1.1实习目的

构造一个小语言的语法分析程序。

1.2实习要求

(1)输入属性字文件,输出源程序是否符合语法要求的结果:

正确——该程序符合语法要求。

错误——指出错误位置。

(2)运行实例:

例1:

输入i:

=1+;

输出表达式错误。

例2:

输入programex1;begini:

=1end.

输出该程序是正确的。

1.3要求分析

1.3.1输入部分

输入为文法源程序,定义CString类型变量m_EnterString,用于获取编辑框1的输入,将其转换为char类型的数组,用s保存,即char*s=m_EnterString.GetBuffer()。

1.3.2输出部分

对于错误的程序,输出相应错误类型;对于正确的程序,输出该程序是正确的。

定义CString类型变量m_OutputString,用于输出词法分析结果到编辑框2,用如下函数给m_OutputString添加输出内容,如程序正确时代码:

m_OutputString.Insert(m_OutputString.GetLength(),"该程序是正确的");

如图所示:

1.3.3待分析的简单语言的语法

用扩充的BNF表示如下:

⑴<程序>:

=programbegin<语句串>end|begin<语句串>end

⑵<语句串>:

=<语句>{;<语句>}

⑶<语句>:

=<赋值语句>

⑷<赋值语句>:

=ID:

=<表达式>

⑸<表达式>:

=<项>{+<项>|-<项>}

⑹<项>:

=<因子>{*<因子>|/<因子>

⑺<因子>:

=ID|NUM|(<表达式>)

 

1.3.4语法中的各种单词符号对应的类别码

单词符号

类别码

单词符号

类别码

begin

1

<

18

end

2

<=

19

if

3

<<

20

then

4

<>

21

else

5

>

22

while

6

>=

23

program

7

>>

24

int

8

25

char

9

26

标识符

10

{

27

常数

11

}

28

+

12

'

29

-

13

;

30

*

14

31

/

15

[

32

=

16

]

33

:

=

17

#

0

program

34

其中对应于在词法分析程序中,变化的是将关键字do改为program,和begin两者至少出现一个作为程序的开始标志。

2.设计

2.1数据结构

定义了以下字符串类型数据:

CStringm_EnterString:

用于接受编辑框1输入的源程序

CStringm_OutputString;:

用于保存输出到编辑框2的内容,即输出源程序是正确的还是错误的,对于错误的程序还需要说明错误类型

char*s=m_EnterString.GetBuffer():

用于将输入的Cstring类型转换为字符数组

类型

界面数据结构:

(仅在词法分析程序的基础上改变了以下组件的位置与大小)

IDC_STATIC1(Group-boxControl)放输入框的框

IDC_STATIC2(Group-boxControl)放输出框的框

IDC_EDIT1(EditControl)输入编辑框

IDC_EDIT2(EditControl)输出编辑框

IDOK(ButtonControl)确定按钮

IDCANCEL(ButtonControl)取消按钮

IDD_CIFA_DIALOG(Dialog)整个界面框

界面如下图所示:

2.2.算法及程序流程图

2.2.1算法设计:

算法的基本任务是在已完成的词法分析程序的基础上,对源程序的语法的正确性进行判断,编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析,对于输入的程序无语法错误的源程序,则输出该程序是正确的,若输入的源程序有语法错误,则输出相应的错误类型,具体见流程图。

2.2.1程序流程图如下:

A.主程序示意图如下图所示:

 

B.

递归下降分析程序示意图如下图所示:

 

C.

语句串分析过程示意图如下图所示:

 

D.statement语句分析程序流程:

 

E.expression表达式分析函数如下图所示:

 

F.term分析函数如下图所示:

 

G.

Factor函数分析过程如下图所示:

 

 

以上流程图中的出错处理部分,对于不同部分的出错处理在程序中并不一致,而是对应于不同的错误作出相应的错误处理,本程序中即为输出不同的源程序语法错误提示。

如:

2.3.界面

3.程序运行实例

3.1实例1:

以program开头,以end结尾,且无语法错误的程序

3.2实例2

以begin开头,以end结尾,且无语法错误的程序

3.3非合法语法输入

A.表达式错误:

错误语句:

inti:

=3+;表达式不完整

错误语句:

j:

=3*(i-3;表达式中有“(”无“)”

错误语句:

j:

=5+i)*4;表达式中有“)”无“(”

错误语句:

charch:

='c'表达式结束无“;”

B.不以program或begin开关:

C.不以end结尾:

4.部分程序核心源代码

voidCcyufaDlg:

:

Start()

{

char*s=m_EnterString.GetBuffer();

scaner();

 lrparser();

m_OutputString.Insert(m_OutputString.GetLength(),"#0\r\n");

}

intCyufaDlg:

:

lrparser()

{

intschain=0;

   kk=0;

   if(syn==1)

     {scaner();

 schain=yucu();

 if(syn==6)

 {scaner();

   if((syn==0)&&(kk==0)) printf("该程序是正确的\n");

 }

 else{if(kk!

=1)printf("结尾无end标志!

\n");

       kk=1;

       getch();

       exit(0);

     }

     }

   else{printf("开头无program或begin!

\n");

   kk=1;

   }

   return(schain);

}

voidCyufaDlg:

:

scaner()

 { sum=0;

   for(m=0;m<8;m++)token[m++]=NULL;

   m=0;

   ch=prog[p++];

   while(ch=='')ch=prog[p++];

   if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))

     {while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))

  {token[m++]=ch;

   ch=prog[p++];

  }

     p--;

     syn=10;

     token[m++]='\0';

     for(n=0;n<6;n++)

 if(strcmp(token,rwtab[n])==0)

   {syn=n+1;

     break;

   }

     }

   elseif((ch>='0')&&(ch<='9'))

     {while((ch>='0')&&(ch<='9'))

 {sum=sum*10+ch-'0';

  ch=prog[p++];

 }

 p--;

 syn=11;

     }

   elseswitch(ch)

      {case'<':

m=0;

   ch=prog[p++];

   if(ch=='>')

     { syn=21;

     }

   elseif(ch=='=')

     { syn=22;

     }

   else

     { syn=20;

        p--;

     }

   break;

 case'>':

m=0;

   ch=prog[p++];

   if(ch=='=')

     {syn=24;

     }

   else

     {syn=23;

       p--;

     }

   break;

 case':

':

m=0;

   ch=prog[p++];

   if(ch=='=')

     {syn=18;

     }

   else

     {syn=17;

       p--;

     }

   break;

 case'+':

syn=13;break;

 case'-':

syn=14;break;

 case'*':

syn=15;break;

 case'/':

syn=16;break;

 case'(':

syn=27;break;

 case')':

syn=28;break;

 case'=':

syn=25;break;

 case';':

syn=26;break;

 case'#':

syn=0;break;

 default:

syn=-1;break;

      }

   }

5.总结

通过此次实验,自己动手写这样一个简单的语法分析器,通过设计、编制并调试语法分析器,加深对语法分析原理的理解;了解了语法分析的运行过程,主程序大致流程为:

“置初值”调用scaner函数读下一个单词符号调用lrparser()结束。

递归下降分析的大致流程为:

“先判断是否为program或begin”都不是则“出错处理”,若是其一则“调用scaner()函数”调用语句串分析函数“判断是否为end”不是则“出错处理”,若是则调用scaner函数“判断syn=0&&kk=0是否成立”成立则说明分析成功输出“该程序是正确的”。

不成立则“出错处理”,以同错误输出相应错误提示;熟悉了构造语法分析程序的手工方式的相关原理,在使用C++中MFC编写程序的过程中,也加强了自己的编程练习。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 电力水利

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1