编译实习语法分析Word文档格式.docx
《编译实习语法分析Word文档格式.docx》由会员分享,可在线阅读,更多相关《编译实习语法分析Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
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编写程序的过程中,也加强了自己的编程练习。