杭州电子科技大学 班级:12052312 专业:计算机科学与技术
实 验 报 告
【实验名称】 实验一词法分析实验
一、实验目的
设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。
二、实验内容
2.1 待分析的简单词法
(1)关键字:所有的关键字都是小写
begin if then while do end
(2)运算符和界符
:= + - * / < <= <> > >= = ; ( ) $
(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:
ID = letter (letter | digit)*
NUM = digit digit*
(4)空格有空白、制
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
符和换行符组成。空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略。
2.2 各种单词符号对应的编码(类别):
表1 各种单词符号对应的编码
单词符号
编码
单词符号
编码
begin
1
:=
17
if
2
<
18
then
3
<>
20
while
4
<=
21
do
5
>
22
end
6
>=
23
Letter (letter|digit)*
10
=
24
digit digit*
11
;
25
+
13
(
26
-
14
)
27
*
15
$
0
/
16
2.3 词法分析程序的功能:
输入:所给文法的源程序字符串。
输出:二元组(编码,值)构成的序列。
其中:syn为单词种别码;
token为存放的单词自身字符串;
num为整型常数。
例如:对源程序begin x:=9; if x>9 then x:=2*x+1/3; end $的源文件,经过词法分析后输出如下序列:
(1,begin) (10,x) (17,:=) (11,9) (25,;) (2,if)……
三、算法思想框图
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。在这里用”#”代替”$”。
4、实验要求
1. 写出程序框图、自动机。
2.写出程序源代码,并调试通过,输出实验结果。
3.完成实验报告及总结。
五、个人心得
通过该实验,主要有以下几方面收获:
1、 对实验原理有更深的理解。
二、 对词法分析在实践中的应用有深刻的理解。在实践的基础上,把所学过的知识应用于实际应用,更深刻的理解了词法分析以及编译原理的实际应用。
三、 通过本次编译原理课程设计,激发了我学习的积极性,培养了我独立发现问题、分析问题,解决问题的能力。更增强我与同学交流沟通和共同解决问题合作的能力。
四、验收时有少许错误,问题在于最后输出结果是时候,是输入相同大小的字符数组,导致出现空格。
六、代码与运行结果
(1)源代码
#include
#include
#include
char prog[80],token[8];
char ch;
int syn,p,i,n,row,num=0;
char *s[6]={"begin","if","then","while","do","end"};
void scaner()
{
for(n=0;n<8;n++)
token[n]=' ';
ch=prog[p++];
while(ch==' ')
{
ch=prog[p];
p++;
}
//判断是标示符或者变量名
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) //可能是标示符或者变量名
{
i=0;
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
token[i++]=ch;
ch=prog[p++];
}
token[i++]='\0';
p--;
syn=10;
for(n=0;n<6;n++) //将识别出来的字符和已定义的标示符作比较,
if(strcmp(token,s[n])==0)
{
syn=n+1;
break;
}
}
//数字
else if((ch>='0'&&ch<='9'))
{
{
num=0;
while((ch>='0'&&ch<='9'))
{
num=num*10+ch-'0';
ch=prog[p++];
}
}
p--;
syn=11;
if(num>32767)
syn=-1;
}
//判断运算符或者分界符
else switch(ch)
{
case'<': i=0;token[i++]=ch;
ch=prog[p++];
if(ch=='>')
{
syn=20;
token[i++]=ch;
}
else if(ch=='=')
{
syn=21;
token[i++]=ch;
}
else
{
syn=18;
p--;
}
break;
case'>': i=0;token[i++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=23;
token[i++]=ch;
}
else
{
syn=22;
p--;
}
break;
case':': i=0;token[i++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=17;
token[i++]=ch;
}
else
{
syn=17;
p--;
}
break;
case'+':syn=13;token[0]=ch;break;
case'-':syn=14;token[0]=ch;break;
case'*':syn=15;token[0]=ch;break;
case'/':syn=16;token[0]=ch;break;
case'=':syn=24;token[0]=ch;break;
case';':syn=25;token[0]=ch;break;
case'(':syn=26;token[0]=ch;break;
case')':syn=27;token[0]=ch;break;
case'#':syn=0;token[0]=ch;break;
case'\n':syn=-2;break;
default: syn=-1;break;
}
}
int main()
{
p=0;
row=1;
printf("Please input string:\n");
do
{
ch=getchar();
prog[p++]=ch;
}
while(ch!='#');
if(prog[0]>='0'&&prog[0]<='9'&&((prog[1]>='a'&&prog[1]<='z')||(prog[1]<='A'&&prog[1]<='Z')))
{
printf("Error!\n");
}
else {
p=0;
do
{
scaner();
switch(syn)
{
case 11: cout<<"("<
本文档为【词法分析器实验报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。