东北大学编译原理实验一.docx
《东北大学编译原理实验一.docx》由会员分享,可在线阅读,更多相关《东北大学编译原理实验一.docx(14页珍藏版)》请在冰豆网上搜索。
东北大学编译原理实验一
编译原理
1实验题目:
词法分析。
2实验目的:
熟悉并实现一个简单的扫描器。
3实验内容
1、设计扫描器的自动机;
2、设计翻译、生成Token的算法;
3、编写代码并上机调试运行通过。
4概要设计
(1)标示符及常量
标示符
0
字符常量
1
字符串常量
2
数字常量
3
(2)关键字表
单词
编码
main
4
char
5
int
6
float
7
struct
8
(3)界符表
+
9
*
10
{
11
}
12
=
13
,
14
[
15
]
16
;
17
“
18
”
19
‘
20
'.
21
(
22
)
23
)
包含注释5源程序(#include
#include
#include
#include
#include
usingnamespacestd;
定义关键字char*kt[5]={main,char,int,
loat,struct},TOKEN[120],ch;//定义界符//char*pt[100]={+,*,:
:
=,=,,,(,),;};
定义标识符//char*it[100];
//定义常数char*ct[100];
intj=0,k=0;
//输出函数voidout(char*TOKEN,inta){
cout<<(<}
关键字匹配函数//intlookup(char*TOKEN){
intm,i;
for(i=0;i<=4;i++){
if((m=strcmp(TOKEN,kt[i]))==0)
return(i+4);
}
return(0);
}
常数匹配函数//intlookupnum(char*TOKEN){
intm,i;
for(i=0;ct[i]!
=NULL;i++)
{
m=strcmp(TOKEN,ct[i]);
if(m==0)
returni;
}
return-1;
}
标识符匹配函数//intlookupiden(char*TOKEN){
intm,i;
for(i=0;it[i]!
=NULL;i++){
if((m=strcmp(TOKEN,it[i]))==0)
returni;
}
return-1;
}
voidscanner(FILE*fp){//扫描函数
charTOKEN[20]={'\0'};
charch;
inti,c,w,v;
ch=fgetc(fp);//获取字符,指针fp并自动指向下一个字符
if(isalpha(ch)){//判断该字符是否是字母
TOKEN[0]=ch;
ch=fgetc(fp);
i=1;
while(isalnum(ch)){//判断该字符是否是字母或数字
TOKEN[i]=ch;
i++;
ch=fgetc(fp);
}
TOKEN[i]='\0';
c=lookup(TOKEN);
fseek(fp,-1,1);//从当前位置开始回退一个字符
if(c==0)
{v=lookupiden(TOKEN);
if(v==-1)
{it[j]=TOKEN;
j++;
out(TOKEN,1);
}
elseout(TOKEN,1);
}//输出标识符
elseout(TOKEN,c);//输出关键字
}
elseif(isdigit(ch)){//判断是否是数字
TOKEN[0]=ch;
ch=fgetc(fp);
i=1;
while(isdigit(ch)){
TOKEN[i]=ch;
i++;
ch=fgetc(fp);
}
if(ch=='.')//小数
{TOKEN[i]=ch;
i++;
ch=fgetc(fp);
while(isdigit(ch)){
TOKEN[i]=ch;
i++;
ch=fgetc(fp);}
浮点数//if(ch=='e')
{TOKEN[i]=ch;
i++;
ch=fgetc(fp);
if(ch=='-'||ch=='+')
{TOKEN[i]=ch;
i++;
ch=fgetc(fp);
while(isdigit(ch)){
TOKEN[i]=ch;
i++;
ch=fgetc(fp);}
}
elseif(isdigit(ch))
{TOKEN[i]=ch;
i++;
ch=fgetc(fp);
while(isdigit(ch)){
TOKEN[i]=ch;
i++;
ch=fgetc(fp);}
}
TOKEN[i]='\0';
fseek(fp,-1,1);
w=lookupnum(TOKEN);
if(w==-1){
ct[k]=TOKEN;
k++;
out(TOKEN,3);}
elseout(TOKEN,3);
}
}
elseif(ch=='e')
{
TOKEN[i]=ch;
i++;
ch=fgetc(fp);
if(ch=='+'||ch=='-')
{TOKEN[i]=ch;
i++;
ch=fgetc(fp);
}
elseif(isdigit(ch))
{TOKEN[i]=ch;
i++;
ch=fgetc(fp);
}
while(isdigit(ch)){
TOKEN[i]=ch;
i++;}
TOKEN[i]='\0';
fseek(fp,-1,1);
w=lookupnum(TOKEN);
if(w==-1){
ct[k]=TOKEN;
k++;
out(TOKEN,3);}
elseout(TOKEN,3);}
else
{TOKEN[i]='\0';
fseek(fp,-1,1);
w=lookupnum(TOKEN);
if(w==-1){
ct[k]=TOKEN;
k++;
out(TOKEN,3);}
elseout(TOKEN,3);}//整数
}
else
{
TOKEN[0]=ch;
switch(ch){
case'+':
{
out(TOKEN,9);
break;
}
case'*':
{out(TOKEN,10);
break;
}
case'{':
{out(TOKEN,11);
break;
}
case'}':
{out(TOKEN,12);
break;
}
case'[':
{out(TOKEN,15);
break;
}
case']':
{out(TOKEN,16);
break;
}
':
{out(TOKEN,20);‘case'
break;
}
case''':
{out(TOKEN,21);
break;
}
case'=':
{out(TOKEN,13);
break;
}
case',':
{out(TOKEN,14);
break;}
case'(':
{out(TOKEN,22);
break;}
case')':
{out(TOKEN,23);
break;}
case';':
{out(TOKEN,17);
break;}
case'“':
{out(TOKEN,18);
break;
}
case'”':
{out(TOKEN,19);
break;
}
}
}
}
intmain()
{
FILE*fp;
if((fp=fopen(F:
\\计算机1208班杨学良\\词法分析\\扫描文字.txt,
))==NULL){//读取文件
内容,并返回文件指针,该指针指向文件的第一个字符
fprintf(stderr,erroropening.\n);
exit
(1);
}
do{
ch=fgetc(fp);
//文件以*结尾,作为扫描结束条件if(ch=='*')
break;
//如果是空格,自动跳到下个字符if(ch=='')
scanner(fp);
else{
//如果不是空格,则回退一个字符并扫描fseek(fp,-1,1);
scanner(fp);
}
}while(ch!
='*');
inti;
cin>>i;
return(0);
}
6测试数据及运行结果
(1)测试数据:
main()
{
inta=1,b=2,c;
charch[10]=ok;
charx,y='a';
c=a+b;
x=y;}*
)运行结果:
2(.
.翱翔在知识的海洋吧再次谢谢大家下载本文档下载后可根据实际情况进行编辑修改谢谢大家下载,..