东北大学编译原理实验一.docx
- 文档编号:12629966
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:12
- 大小:25.92KB
东北大学编译原理实验一.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)运行结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 东北大学 编译 原理 实验