词法分析器的设计与实现编译原理实验报告Word文档下载推荐.docx
- 文档编号:16056924
- 上传时间:2022-11-18
- 格式:DOCX
- 页数:13
- 大小:156.46KB
词法分析器的设计与实现编译原理实验报告Word文档下载推荐.docx
《词法分析器的设计与实现编译原理实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《词法分析器的设计与实现编译原理实验报告Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。
(1)根据C语言各类单词的正规式,构造能识别各类单词的状态转换图.
(2)根据状态转换图,构造识别各类单词的词法分析器。
6、状态转换图及词法分析程序
//词法分析程序。
cpp
#include〈string。
h>
#include<
stdio.h>
stdlib.h〉
#include〈ctype.h〉
//定义关键字
char*Key[10]={"
main”,"
void”,"
int"
”char"
”printf”,”scanf"
”else"
"
if"
return"
};
charWord[20],ch;
//存储识别出的单词流
intIsAlpha(charc){//判断是否为字母
if(((c〈='
z’)&
&
(c〉='
a'
))||((c<
='
Z’)&
&(c>
A'
)))return1;
elsereturn0;
}
intIsNum(charc){//判断是否为数字
if(c〉='
0’&&c<
=’9’)return1;
intIsKey(char*Word){//识别关键字函数
intm,i;
for(i=0;
i〈9;
i++){
if((m=strcmp(Word,Key[i]))==0)
{
if(i==0)
return2;
return1;
}
}
return0;
voidscanner(FILE*fp){//扫描函数
charWord[20]={’\0’};
charch;
inti,c;
ch=fgetc(fp);
//获取字符,指针fp并自动指向下一个字符
if(IsAlpha(ch)){//判断该字符是否是字母
Word[0]=ch;
ch=fgetc(fp);
i=1;
while(IsNum(ch)||IsAlpha(ch)){//判断该字符是否是字母或数字
Word[i]=ch;
i++;
ch=fgetc(fp);
Word[i]='
\0'
;
//'
\0’代表字符结束(空格)
fseek(fp,—1,1);
//回退一个字符
c=IsKey(Word);
//判断是否是关键字
if(c==0)printf("
%s\t$普通标识符\n\n"
Word);
//不是关键字
elseif(c==2)printf(”%s\t$主函数\n\n”,Word);
elseprintf(”%s\t$关键字\n\n”,Word);
//输出关键字
else//开始判断的字符不是字母
if(IsNum(ch)){//判断是否是数字
Word[0]=ch;
ch=fgetc(fp);
i=1;
while(IsNum(ch)){
Word[i]=ch;
i++;
ch=fgetc(fp);
}
Word[i]=’\0'
;
fseek(fp,—1,1);
//回退
printf(”%s\t$无符号实数\n\n"
else//开始判断的字符不是字母也不是数字
{
Word[0]=ch;
switch(ch){
case’[’:
case’]'
:
case'
('
:
)'
case’{'
case’}’:
,’:
"
’:
case’;
'
printf(”%s\t$界符\n\n"
break;
case’+'
ch=fgetc(fp);
Word[1]=ch;
if(ch=='
=’){
printf(”%s\t$运算符\n\n”,Word);
//运算符"
+="
}
elseif(ch=='
+’){
printf(”%s\t$运算符\n\n”,Word);
//判断结果为"
++"
}
else{
fseek(fp,—1,1);
printf("
%s\t$运算符\n\n"
+"
break;
—’:
Word[1]=ch;
=’){
printf(”%s\t$运算符\n\n"
,Word);
elseif(ch==’—'
){
printf(”%s\t$运算符\n\n”,Word);
//判断结果为”--”
fseek(fp,-1,1);
//判断结果为”-”
case’*'
/’:
case’!
=’:
if(ch==’='
printf("
%s\t$运算符\n\n”,Word);
fseek(fp,-1,1);
break;
case’〈’:
Word[1]=ch;
%s\t$运算符\n\n"
//判断结果为运算符”〈=”
<
’){
%s\t$运算符\n\n”,Word);
}
fseek(fp,—1,1);
printf(”%s\t$运算符\n\n"
case’>
Word[1]=ch;
if(ch==’='
)printf("
%s\t$运算符\n\n"
,Word);
else{
fseek(fp,—1,1);
printf(”%s\t$运算符\n\n"
%'
Word[1]=ch;
if(ch==’=’){printf("
}
if(IsAlpha(ch))printf(”%s\t$类型标识符\n\n”,Word);
fseek(fp,-1,1);
printf(”%s\t$取余运算符\n\n”,Word);
default:
printf("
无法识别字符!
\n\n”);
break;
}
main()
{
charin_fn[30];
//文件路径
FILE*fp;
printf(”\n请输入源文件路径及后缀名(源文件需以‘$'
结尾):
”);
while
(1){
gets(in_fn);
//scanf(”%s”,in_fn);
if((fp=fopen(in_fn,"
r"
))!
=NULL)break;
//读取文件内容,并返回文件指针,该指针指向文件的第一个字符
elseprintf("
文件路径错误!
请重新输入:
);
}
printf(”\n词法分析结果如下:
\n"
);
do{
ch=fgetc(fp);
if(ch=='
$’)break;
//文件以#结尾,作为扫描结束条件
elseif(ch==’'
||ch==’\t’||ch=='
\n'
){}//忽略空格,空白,和换行
else{
fseek(fp,-1,1);
//回退一个字节开始识别单词流
scanner(fp);
}while(ch!
$’);
system("
pause”);
return(0);
//test.cpp测试程序路径:
D:
\test。
{
intscore;
chargrade;
pleaseinputascore\n"
scanf(”%d"
,amp;
score);
grade=score>
=90?
(scoregt;
=60?
’B'
’C’);
%dbelongsto%c”,score,grade);
$
7、测试及结果
1、登陆界面:
2、出错异常处理:
3、结果分析:
8、心得
在本次实验中,我纠正了一个一直以来的概念错误:
main不是关键字,它定义为程序的入口,是主函数!
在本实验中,虽然我把main初始化在关键字表
(字符指针类型数组)*Key[10]中,当与该数组中字符串进行比较时,若与main匹配成功,则返回2,若为其他关键字则返回1,以此来把main从关键字中区别出来.
在本实验中的关键字表只初始化了几个常用的关键字,还可继续扩充(只需扩大数组,向其中补充要添加的关键字)。
如果要对本程序中未识别的c语言中的一些其他的字符进行扩充(目前处理为不可识别字符),可在程序代码中继续添加case选项,分别对相应要识别的特殊字符加以描述
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 词法 分析器 设计 实现 编译 原理 实验 报告