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

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

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

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

东北大学编译原理实验一.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","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)运行结果:

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

当前位置:首页 > 职业教育 > 中职中专

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

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