东北大学编译原理实验一.docx

上传人:b****7 文档编号:23487576 上传时间:2023-05-17 格式:DOCX 页数:14 大小:25.39KB
下载 相关 举报
东北大学编译原理实验一.docx_第1页
第1页 / 共14页
东北大学编译原理实验一.docx_第2页
第2页 / 共14页
东北大学编译原理实验一.docx_第3页
第3页 / 共14页
东北大学编译原理实验一.docx_第4页
第4页 / 共14页
东北大学编译原理实验一.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

东北大学编译原理实验一.docx

《东北大学编译原理实验一.docx》由会员分享,可在线阅读,更多相关《东北大学编译原理实验一.docx(14页珍藏版)》请在冰豆网上搜索。

东北大学编译原理实验一.docx

东北大学编译原理实验一

编译原理

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(.

.翱翔在知识的海洋吧再次谢谢大家下载本文档下载后可根据实际情况进行编辑修改谢谢大家下载,..

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1