编译原理实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
院系:计算机科学学院
专业、年级: 07计科2大班
课程名称:编译原理
学号姓名:
指导教师:
2010 年11月17 日
组员学号姓名
实验
名称
实验一:词法分析实验室9205
实验目的或要求
通过设计一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。
具体要求:输入为某语言源代码,达到以下功能:
程序输入/输出示例:如源程序为C语言。输入如下一段:
main()
{
int a,b;
a=10;
b=a+20;
}
要求输出如下(并以文件形式输出或以界面的形式输出以下结果)。
(2,”main”)
(5,”(“)
(5,”)“)
(5,”{“}
(1,”int”)
(2,”a”)
(5,”,”)
(2,”b”)
(5,”;”)
(2,”a”)
(4,”=”)
(3,”10”)
(5,”;”)
(2,”b”)
(4,”=”)
(2,”a”)
(4,”+”)
(3,”20”)
(5,”;”)
(5,”}“)
要求:
识别保留字:if、int、for、while、do、return、break、continue等等,单词种别码为1。
其他的标识符,单词种别码为2。常数为无符号数,单词种别码为3。
运算符包括:+、-、*、/、=、>、<等;可以考虑更复杂情况>=、<=、!= ;单词种别码为4。分隔符包括:“,”“;”“(”“)”“{”“}”等等,单词种别码为5。
实验原理(算法流程)1.程序思路:
2.定义部分:定义常量、变量、数据结构。
3.初始化:从文件将源程序输入到字符缓冲区中。
4.取单词前:去掉多余空白。调用过程GETNB();
5.提取字符组成单词,构造单词扫描过程SCAN()。
6.判断单词的种别码,调用过程LOOKUP();
7.显示(导出)结果。
a)实验的具体流程图如下:
程序界面(效果图)词法分析器主窗口:
输入源程序:
点击“分析”,显示实验结果:
单击“另存为”,保存分析结果:
单击“清空”,清空对话框中的内容,进行下一分析:以上就是程序执行时的窗口效果
源程序代码#include
#include
//#include"pl0.h"
#define al 10/*符号的最大长度*/
#define nmax 14/*number的最大位数*/
#define norw 8/*关键字个数*/
char ch;/*获取字符的缓冲区,getch使用*/
int cc,ll;/*cc表示当前字符(ch)的位置*/
char line[81];/*读取行缓冲区*/
char a[al+1];/*临时符号,多处的字节用于存放0*/
char anum[nmax+1];/*临时符号,存放number*/
char inum[nmax+1];/*存放常数*/
char word[norw][al];/*保留字*/
char fname[al];/*文件名*/
char id[al+1];/*存放标识符或保留字*/
int num;/*常数*/
int err;//错误计数器
FILE * fin;
FILE * fout;
FILE * fas;/*词法分析结果文件*/
/*函数执行出错,退出程序*/
#define getchdo if(-1==getch()) return -1
#define getsymdo if(-1==getsym()) return -1
int getch();/*读取一行字符*/
int getsym();/*读取一个分词*/
/*从文件fin中读取一行字符,保存到字符缓冲区line中*/
int getch()
{
if(cc==ll)
{
if(feof(fin))//“feof()”函数返回的是最后一次“读操作的内容”。
{
printf("program incomplete");
return -1;
}
ll=0;
cc=0;
ch=' ';
while(ch!=10)
{
if(EOF==fscanf(fin,"%c",&ch))//EOF是文件结束标志的文件{
line[ll]=0;
break;
}
line[ll]=ch;
ll++;
}
}
ch=line[cc];
cc++;
return 0;
}
/*读取一个分词*/
int getsym()
{
int i,j,k;
while(ch==' '||ch==10||ch==9)//忽略空格,换行和TAB
{
getchdo;
}
if(ch>='a'&&ch<='z')//判断是否为关键字或标识符
{
k=0;
do{
if(k a[k]=ch; k++; } getchdo; } while(ch>='a'&&ch<='z'||ch>='0'&&ch<='9'); a[k]=0; if(k>al)printf("error"); strcpy(id,a); i=0; j=norw-1;