编译方法实验报告
姓
班
名
级
实 验 名 称
开 设 学 期
实 验 时 间
评 定 成 绩
学
号
指 导 教 师
扫描器的设计
2 0 1 0 - 2 0 1 1 第 一 学 期
第 1 6 周
评 定 人 签 字
评 定 日 期
东北大学软件学院
2010 年 12 月
一、 实验目的:
熟悉并实现一个扫描器(词法分析程序)。
二、 实验内容:
(1) 设计扫描器的有限自动机(识别器);
(2) 设计翻译、生成 Token 的算法(翻译器);
(3) 编写代码并上机调试运行通过。
·输入——源程序文件或源程序字符串;
·输出——相应的 Token 序列;
关键字表和界符表;
符号表和常数表;
三、 实验原理:
1. 有限自动机原理:用计算机完成有限自动机的功能,其核心是“变换”
的实现技术。这里介绍的是把变换表按某种方式存贮起来,作为知识
源,实现机制是:控制程序+变换表。变换表的存贮结构有二维数组,
下标是:
(状态,输入符号),还有一种存储方式是:压缩变换表:方法是把
每个状态行作为子表,状态为索引,并把错误的输入符号合并在一
起。
2. 词法分析器原理:
(1)识别器 --- 识别单词的有限自动机
(2)翻译器 --- 根据有限自动机所识别出的对象,完成从单词串到单
词的 TOKEN 串的翻译。
四、 数据结构设计:
char *key[]={"program","begin","end","var","while","do","repeat",
/*关键字*/
"until","for","to","if","then","else"};
char*limit[]={";",":","(",")",",",":=","+","-","*","/",">",">=","==","<","<="};
/*运算、限界符*/
fstream outfile;//文件
int search(char *buf,int type,int command)//查找,相当于识别器
void scanner()//扫描,相当于扫描器
五、 关键代码分析(带注释)及运行结果:
#include
#include
#include
char prog[80],token[8];
char ch;
int syn,p,m=0,n,row,sum=0;
char *rwtab[6]={"begin","if","then","while","do","end"};
void scaner()
{
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'&&ch<='Z'))
{
m=0;
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
token[m++]=ch;
ch=prog[p++];
}
token[m++]='\0';
p--;
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
else if((ch>='0'&&ch<='9'))
{
{
sum=0;
while((ch>='0'&&ch<='9'))
{
}
sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;
syn=11;
if(sum>32767)
syn=-1;
}
else switch(ch)
{
case'<':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='>')
{
syn=21;
token[m++]=ch;
}
else if(ch=='=')
{
syn=22;
token[m++]=ch;
}
else
{
syn=23;
p--;
}
break;
case'>':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=24;
token[m++]=ch;
}
else
{
syn=20;
p--;
}
break;
case':':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=18;
token[m++]=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=25;token[0]=ch;break;
case';':syn=26;token[0]=ch;break;
case'(':syn=27;token[0]=ch;break;
case')':syn=28;token[0]=ch;break;
case'#':syn=0;token[0]=ch;break;
case'\n':syn=-2;break;
default: syn=-1;break;
}
}
void main()
{
p=0;
row=1;
cout<<"Please input string:"<0
then x:=2*x+1/3;
end#
2
有的 while、do 以及判断错误语句):
Begin
x<=$;
while
a<0
do
b<>9-x;
end
#
输出结果
六、 实验思考题:
(1) 扫描器的任务是什么?
答:词法分析程序又称扫描器,任务有:
识别单词——从用户的源程序中把单词分离出来;
翻译单词——把单词转换成机内表示,便于后续处理。
(2) 扫描器、识别器、翻译器三者之间的关系是怎样的?
答:扫描器、识别器、翻译器三者之间的关系是:
扫描器的实现要通过识别器和翻译器
(3) 为什么说有限自动机是词法分析的基础?
答:因为词法分析的包括:识别--- 识别单词的有限自动机。
和翻译--- 根据有限自动机所识别出的对象,完成从单词串到单
词的 TOKEN 串的翻译。我们可以看出,不论是识别还是分析,
都是应用有限自动机,所以可以说有限自动机是词法分析的基
础。