东北大学编译原理实验一.docx
《东北大学编译原理实验一.docx》由会员分享,可在线阅读,更多相关《东北大学编译原理实验一.docx(12页珍藏版)》请在冰豆网上搜索。
东北大学编译原理实验一
编译原理
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","float","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;
}
case'‘':
{out(TOKEN,20);
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","r"))==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)运行结果: