编译原理词法分析器实验报告.docx
- 文档编号:9730031
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:10
- 大小:71.55KB
编译原理词法分析器实验报告.docx
《编译原理词法分析器实验报告.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析器实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
编译原理词法分析器实验报告
西安邮电大学
《编译原理》课程实验报告
课程实验题目:
词法分析器实验
专业:
班级:
学号:
姓名:
完成时间:
一、实验目的
了解词法分析器的设计方法,并且能够熟练的掌握词法分析器.
二、实验内容及要求
1.根据状态转换图直接编程
编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。
(1)单词的分类。
可将所有标识符归为一类;将常数归为另一类;保留字和分隔符则采取一词一类。
(2)符号表的建立。
可事先建立一保留字表,以备在识别保留字时进行查询。
变量名表及常数表则在词法分析过程中建立。
(3)单词串的输出形式。
所输出的每一单词,均按形如(CLASS,VALUE)的二元式编码。
对于变量标识符和常数,CLASS字段为相应的类别码,VALUE字段则是该标识符、常数在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串,其最大长度为四个字符;常数表登记项中则存放该整数的二进制形式。
)。
对于保留字和分隔号,由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。
不过,为便于查看由词法分析程序所输出的单词串,也可以在CLASS字段上直接放置单词符号串本身。
(4)可以仿照书上图3.3的实现程序的结构来编写上述词法分析程序,但其中的若干语义过程有待于具体编写。
2.能对任何S语言源程序进行分析
在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。
3.能检查并处理某些词法分析错误
词法分析程序能给出的错误信息包括:
总的出错个数,每个错误所在的行号,错误的编号及错误信息。
4.本实验要求处理以下两种错误(编号分别为1,2):
1:
非法字符:
单词表中不存在的字符处理为非法字符,处理方式给出错误信息,“xxiserror”。
2:
源程序文件结束而注释未结束。
注释格式为:
/*……*/
三、实验程序设计说明
1.实验方案设计
2.程序源代码
#include
#include
#include
#include
intlen,locate;
intMAXLEN=10;
intMAXDLG=9;
charstr[100];
charremain[10][10]={"if","else","int","while","do","return","break","continue"};
chargetche()
{
//str[locate]=fgetc(fp);//获取字符,指针fp自动指向下一个字符
returnstr[locate];
}
intsearch(char*temp)//是否为保留字
{
inti;
for(i=0;i<8;i++)
{
if(strcmp(remain[i],temp)==0)
{
printf("(%s,%d)\n",temp,1);
return1;
}
}
return0;
}
voidread()
{
chartemp[100];
intcnt=0;
charch;
while(ch=getche(),ch==''||ch==9||ch=='\0')//去除单词前面多余的空格和制表符
{
if(ch=='\0')
return;//如果读取结束还没出现有用的字符则返回
locate++;
}
if(isalpha(ch))//如果是英文开头的
{
do
{
temp[cnt++]=ch;
locate++;
}while(ch=getche(),isalpha(ch)||isdigit(ch)||ch=='_');//读入到非字母数字下划线为止
temp[cnt]='\0';
if(cnt>MAXLEN)
printf("%sistoolong\n",temp);
elseif(!
search(temp))
{
printf("(%s,%d)\n",temp,2);
}
}
elseif(isdigit(ch))//如果是数字开头,则必然不是标示符
{
do
{
temp[cnt++]=ch;
locate++;
}while(ch=getche(),isdigit(ch));
temp[cnt]='\0';
if(cnt>MAXDLG)
printf("%sisbigerthanthemaxnumber\n",temp);
else
printf("(%s,%d)\n",temp,3);
}
elseif(ch==','||ch==';'||ch=='('||ch==')'||ch=='{'||ch=='}')//如果是分隔符
{
printf("(%c,%d)\n",ch,5);
locate++;
}
elseif(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='='||ch=='>'||ch=='<'||ch=='!
')//运算符
{
temp[cnt++]=ch;
if(ch=='+')//判断是否为++
{
locate++;
ch=getche();
if(ch=='+')
{
printf("++4\n");
}
}
elseif(ch=='-')//判断是否为-
{
locate++;
ch=getche();
if(ch=='-')
{
printf("--4\n");
}
}
else//否则的话,任意运算符后面都能跟上=
{
locate++;
ch=getche();
if(ch=='=')//判断是否为两个字符构成的运算符
{
temp[cnt++]=ch;
locate++;
}
temp[cnt]='\0';
if(strcmp(temp,"!
")==0)
printf("!
iserrorinput!
\n");
else
printf("(%s,%d)\n",temp,4);
}
}
else
{
printf("%ciserrorinput!
\n",ch);
locate++;
}
}
voidmain()
{
intlinecnt=0;
charchoice;
do
{
flushall();
printf("请输入字符串:
\n");
gets(str);
printf("第%d行\n",++linecnt);
len=strlen(str);
locate=0;
while(locate { read(); } printf("Doyouwanttocontinuetoinput? \n"); printf("Pleaseselectone: "); printf("(YorN)\n"); scanf("%c",&choice); printf("\n"); }while(choice=='Y'); } 3.程序的执行结果 图1程序输入文件内容 图2输出结果 4.实验程序的优点和特色 本程序分类清楚,出错处理能力强,任何非法字符输入,将会报错,而且可以多次输入 四、实验中出现的问题及解决方法 本程序的缺点就是没有用文件存储,需要每次运行手动输入,给用户带来不方便 五、体会、意见或建议 通过本次试验了解了词法分析程序的设计方法,以及编译程序,在设计之前首先要构思好设计方法,可事先建立一关键字表,以备在识别关键字时进行查询。 变量名表及常数表则在词法分析过程中建立。 而且深切体会到学习过的东西要是长期不用就会淡忘,就像C语言一样,大一学过的,但之后就几乎没用过,忘记了好多,所以我们要温故而知新。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 词法 分析器 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)