编译原理实验报告一简单样本语言的词法分析器Word下载.docx
《编译原理实验报告一简单样本语言的词法分析器Word下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告一简单样本语言的词法分析器Word下载.docx(10页珍藏版)》请在冰豆网上搜索。
![编译原理实验报告一简单样本语言的词法分析器Word下载.docx](https://file1.bdocx.com/fileroot1/2022-12/13/4f37df19-12e8-4835-992b-5ca52bc31d8c/4f37df19-12e8-4835-992b-5ca52bc31d8c1.gif)
从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;
培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。
调试并完成一个词法分析程序,加深对词法分析原理的理解。
二、实验原理及基本技术路线图(方框原理图或程序流程图)
1、待分析的简单语言的词法
(1)关键字:
beginifthenwhiledoend
所有关键字都是小写。
(2)运算符和界符:
:
=+–*/<
<
=<
>
>
==;
()#
(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:
ID=letter(letter|digit)*
NUM=digitdigit*
(4)空格由空白、制表符和换行符组成。
空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。
2、各种单词符号对应的种别码
单词符号
种别码
begin
1
17
if
2
=
18
then
3
20
while
4
<
21
do
5
22
end
6
23
letter(letter|digit)*
10
24
digitdigit*
11
25
*
13
;
26
/
14
(
27
+
15
)
28
-
16
#
3、词法分析程序的功能
输入:
所给文法的源程序字符串。
输出:
二元组(syn,token或sum)构成的序列。
其中:
syn为单词种别码;
token为存放的单词自身字符串;
sum为整型常数。
二、所用仪器、材料(设备名称、型号、规格等或使用软件)
1台PC以及VISUALC++6.0软件。
三、实验方法、步骤(或:
程序代码或操作过程)
(1)程序代码:
#include<
stdio.h>
string.h>
iostream.h>
charprog[80],token[8];
charch;
intsyn,p,m=0,n,row,sum=0;
char*rwtab[6]={"
begin"
"
if"
then"
while"
do"
end"
};
voidscaner()
{
for(n=0;
n<
8;
n++)token[n]=NULL;
ch=prog[p++];
while(ch=='
'
{
ch=prog[p];
p++;
}
if((ch>
='
a'
&
ch<
z'
)||(ch>
A'
Z'
))
m=0;
while((ch>
0'
9'
{
token[m++]=ch;
ch=prog[p++];
}
token[m++]='
\0'
p--;
syn=10;
for(n=0;
6;
n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
elseif((ch>
sum=0;
while((ch>
sum=sum*10+ch-'
ch=prog[p++];
syn=11;
if(sum>
32767)
syn=-1;
elseswitch(ch)
case'
'
m=0;
token[m++]=ch;
if(ch=='
syn=21;
token[m++]=ch;
elseif(ch=='
syn=22;
else
syn=23;
break;
syn=24;
syn=20;
syn=18;
syn=17;
*'
syn=13;
token[0]=ch;
break;
/'
syn=14;
+'
syn=15;
-'
syn=16;
syn=25;
syn=26;
('
syn=27;
)'
syn=28;
#'
syn=0;
\n'
syn=-2;
default:
syn=-1;
}
voidmain()
p=0;
row=1;
cout<
"
Pleaseinputstring:
endl;
do
cin.get(ch);
prog[p++]=ch;
while(ch!
);
scaner();
switch(syn)
case11:
("
syn<
sum<
)"
case-1:
Errorinrow"
row<
!
case-2:
row=row++;
default:
token<
while(syn!
=0);
(2)创建编辑程序
(3)连接、编译和调试程序
(4)运行程序
五、实验过程原始记录(测试数据、图表、计算等)
(1)给定源程序
beginx:
=8;
ifx>
0thenx:
=2*x+1/5;
end#
输出结果
(2)源程序(包括上式未有的while、do以及判断错误语句):
x<
=$;
a<
b<
9-x;
六、实验结果、分析和结论(误差分析与数据处理、成果总结等。
其中,绘制曲线图时必须用计算纸或程序运行结果、改进、收获)
词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
通过本试验的完成,更加加深了对词法分析原理的理解。
通过这次实验,我对编译原理这门专业必修课有了进一步的深层次了解,把理论
知识应用于实验中,也让我重新熟悉了C++语言的相关内容,加深了对C++语言知识的深化和用途的理解。
相信在以后的毕业设计以及读研自己做项目时可以有更大的提升。
同时这次试验让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;
熟悉了构造词法分析程序的手工方式的相关原理,根据识别语言单词的状态转换图,使用某种高级语言(例如C++语言)直接编写此法分析程序。
另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。
比如:
main()函数中,用cin>
ch;
语句得到ch值的话,给定源程序的结果第一行得到的是(10,beginx),因为得到的字符串中省略了空格,改用cin.get(ch);
问题便解决了。
另外,我在程序中加入了row变量,以便能够准确得到错误所在。