《编译原理》课程实习报告.docx
《《编译原理》课程实习报告.docx》由会员分享,可在线阅读,更多相关《《编译原理》课程实习报告.docx(17页珍藏版)》请在冰豆网上搜索。
《编译原理》课程实习报告
编号:
实习
一
二
三
四
五
六
七
八
九
十
总评
教师签名
成绩
《编译原理》课程
实习报告
编号:
3
实习题目:
语法分析器
专业(班):
计科六班
学生学号:
2011301500204
学生姓名:
何子龙
任课教师:
杜卓敏
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.总结
1.本次实验让我对C语言有了更多的了解和更深刻的认知。
把以前的的知识又重新复习了一遍。
2.加深对语法分析原理的理解和对递归下降分析法的理解。
更加知道了用递归下降分析语法的步骤。