编译原理词法分析实验一词法分析扫描器的设计实现本科论文Word格式文档下载.docx
- 文档编号:20353011
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:17
- 大小:87.79KB
编译原理词法分析实验一词法分析扫描器的设计实现本科论文Word格式文档下载.docx
《编译原理词法分析实验一词法分析扫描器的设计实现本科论文Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析实验一词法分析扫描器的设计实现本科论文Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
iostream>
#include<
string.h>
stdlib.h>
usingnamespacestd;
/***********定义结构体***********/
typedefstructToken
{
charname[20];
intstate;
//状态,为0是标识符,为1是字符,为2是字符串,为3是数字,为4是关键字,为5是界符
}Token;
typedefstructSTR//
intcode;
}STR;
STRiT[10];
STRcT[20];
STRsT[20];
STRCT[20];
STRKT[10]={{"
int"
4},{"
main"
5},{"
void"
6},{"
if"
7},{"
else"
8},{"
char"
9}};
STRPT[30]={{"
>
="
10},{"
<
11},{"
=="
12},{"
13},{"
"
14},{"
15},{"
+"
16},{"
-"
17},{"
*"
18},{"
/"
19},
{"
{"
20},{"
}"
21},{"
"
22},{"
;
23},{"
("
24},{"
)"
25},
["
26},{"
]"
27}};
/***********全局变量声明*********/
TokenCurrentToken;
//正在读的token
Tokentoken[200];
FILE*fp;
//源文件指针
charch;
//读取字符
intstate=0;
//0表示标识符,1表示字符,2表示字符串
intiT_i=0;
//iT结构体数组下标
intcT_i=0;
intsT_i=0;
intCT_i=0;
intindex=0;
//token的下标
/***函数声明***/
//读的是字母,关键字和标示符
//,;
+-
/******************主函数**********************/
intmain()
inti=0;
if((fp=fopen("
source.txt"
r"
))==NULL)
{
cout<
cannotopenthesourcefile!
\n"
endl;
exit
(1);
}
ch=fgetc(fp);
//文件中读一个字符
while(ch!
='
#'
)
for(i=0;
i<
20;
i++)
CurrentToken.name[i]='
\0'
//将单词缓冲区初始化
if((ch>
0'
)&
&
(ch<
9'
))//数字
IsNumber();
elseif(((ch>
a'
z'
))||((ch>
A'
Z'
))||(ch=='
_'
))//关键字和标识符
IsAlpha();
elseif(ch=='
'
||ch=='
\n'
else
IsOther();
i<
=index;
i++)
cout<
token[i].name<
"
;
finish"
return0;
}
/************数字处理****************/
voidIsNumber()
intk=0;
while(((ch>
)))
CurrentToken.name[k++]=ch;
//将数字放入单词缓冲区
boolflag=1;
if(ch=='
.'
if(((ch<
'
)||(ch>
flag=0;
if(flag==1)
strcpy(CT[CT_i++].name,CurrentToken.name);
strcpy(token[index].name,CurrentToken.name);
token[index++].state=3;
//cout<
CurrentToken.name<
<
03>
error>
/************是否为关键字****************/
voidIsAlpha()
inti=0;
if(state==0)
boolflag=0;
))||ch=='
)//将完整的单词放入单词缓冲区
CurrentToken.name[i++]=ch;
//判断是否是关键字
7;
if(strcmp(CurrentToken.name,KT[i].name)==0)
flag=1;
//printf("
%s<
%02d>
CurrentToken.name,KT[i].code);
strcpy(token[index].name,CurrentToken.name);
token[index++].state=4;
printf("
KT[i].code);
break;
if(flag!
=1)
||((ch>
00>
CurrentToken.name);
);
strcpy(token[index].name,CurrentToken.name);
token[index++].state=0;
inttag=0;
for(intj=0;
j<
iT_i;
j++)
{
if(strcmp(CurrentToken.name,iT[j].name)==0)
{
tag=1;
break;
}
}
if(tag==0)
strcpy(iT[iT_i].name,CurrentToken.name);
iT[iT_i++].code=0;
/***************其它************/
intIsOther()
inti;
//将缓冲区初始化
switch(ch)
case'
:
CurrentToken.name[0]='
if(ch=='
CurrentToken.name[1]='
+'
-'
*'
/'
{'
}'
'
('
)'
['
]'
case'
\'
ch<
))
CurrentToken.name[1]=ch;
CurrentToken.name[2]='
01>
strcpy(token[index].name,CurrentToken.name);
token[index++].state=1;
inttag=0;
for(intj=0;
=cT_i;
{
if(strcmp(cT[cT_i].name,CurrentToken.name)==0)
tag=1;
}
if(tag==0)
strcpy(cT[cT_i++].name,CurrentToken.name);
error1"
error2"
\"
intj=1;
while((ch>
CurrentToken.name[j++]=ch;
CurrentToken.name[j++]='
02>
=sT_i;
if(strcmp(sT[sT_i].name,CurrentToken.name)==0)
tag=1;
}if(tag==0)
strcpy(sT[sT_i++].name,CurrentToken.name);
error3"
if(CurrentToken.name[0]!
if(strcmp(CurrentToken.name,PT[i].name)==0)
%d>
CurrentToken.name,PT[i].code);
PT[i].code);
strcpy(token[index].name,CurrentToken.name);
token[index++].state=PT[i].code;
//while(ch=='
)ch=fgetc(fp);
程序运行结果:
(截屏)
输入:
Source.txt文本
intmain(void)
inta=1,d=2,c;
if(a<
=d)
{
c=a;
a=d;
d=c;
charch[10]="
ok"
charx,y='
c=a+d;
#
输出:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 词法 分析 实验 扫描器 设计 实现 本科 论文