编译实习语法分析Word文档格式.docx

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

编译实习语法分析Word文档格式.docx

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

编译实习语法分析Word文档格式.docx

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

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

#

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.1实例1:

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

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

3.3非合法语法输入

A.表达式错误:

错误语句:

inti:

=3+;

表达式不完整

j:

=3*(i-3;

表达式中有“(”无“)”

=5+i)*4;

表达式中有“)”无“(”

charch:

='

c'

表达式结束无“;

B.不以program或begin开关:

C.不以end结尾:

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)

if((syn==0)&

&

(kk==0)) 

printf("

该程序是正确的\n"

}

else{if(kk!

=1)printf("

结尾无end标志!

\n"

kk=1;

getch();

exit(0);

else{printf("

开头无program或begin!

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'

A'

)))

{while(((ch<

))||((ch>

0'

(ch<

9'

{token[m++]=ch;

p--;

syn=10;

token[m++]='

\0'

for(n=0;

n<

6;

n++)

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

{syn=n+1;

break;

elseif((ch>

))

{while((ch>

{sum=sum*10+ch-'

p--;

syn=11;

elseswitch(ch)

{case'

m=0;

if(ch=='

syn=21;

elseif(ch=='

syn=22;

else

syn=20;

case'

{syn=24;

{syn=23;

{syn=18;

{syn=17;

+'

syn=13;

-'

syn=14;

*'

syn=15;

break;

/'

syn=16;

('

syn=27;

)'

syn=28;

syn=25;

syn=26;

#'

syn=0;

default:

syn=-1;

通过此次实验,自己动手写这样一个简单的语法分析器,通过设计、编制并调试语法分析器,加深对语法分析原理的理解;

了解了语法分析的运行过程,主程序大致流程为:

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

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

“先判断是否为program或begin”都不是则“出错处理”,若是其一则“调用scaner()函数”调用语句串分析函数“判断是否为end”不是则“出错处理”,若是则调用scaner函数“判断syn=0&

kk=0是否成立”成立则说明分析成功输出“该程序是正确的”。

不成立则“出错处理”,以同错误输出相应错误提示;

熟悉了构造语法分析程序的手工方式的相关原理,在使用C++中MFC编写程序的过程中,也加强了自己的编程练习。

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

当前位置:首页 > 解决方案 > 解决方案

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

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