编译原理实验一---词法分析.doc

上传人:聆听****声音 文档编号:8965811 上传时间:2023-05-16 格式:DOC 页数:4 大小:52KB
下载 相关 举报
编译原理实验一---词法分析.doc_第1页
第1页 / 共4页
编译原理实验一---词法分析.doc_第2页
第2页 / 共4页
编译原理实验一---词法分析.doc_第3页
第3页 / 共4页
编译原理实验一---词法分析.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

编译原理实验一---词法分析.doc

《编译原理实验一---词法分析.doc》由会员分享,可在线阅读,更多相关《编译原理实验一---词法分析.doc(4页珍藏版)》请在冰点文库上搜索。

编译原理实验一---词法分析.doc

编译原理实验一词法分析

输入:

source.c

输出:

token[40]

tokenstring[40][30]

以下样例程序已经能够识别:

变量、数、赋值号、分号

要求修改代码使其能够识别:

变量、数、赋值号、分号、加号、减号、乘号、除号

自动机:

字母数其他

INID

字母数

INNUM

DONE

START

数其它

INSEMI

INASSIGN

=

+

INADDDD

样例程序

#include

#include

FILE*source;/*源程序文件句柄*/

typedefenum{PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI,ASSIGN,NUM,ID,DOLLAR}tokentype;/*记号*/

typedefenum{START,INASSIGN,INCOMMENT,INNUM,INID,INSEMI,INDOLLAR,DONE}statetype;/*状态*/

tokentypetoken[40];/*存记号*/

chartokenstring[40][30];/*存记号串*/

intwordindex=0;/*以上两个数组的索引*/

intback=0;/*0不回退字符,1回退字符*/

intc;/*存获得的字符*/

intgetnextchar();/*获得下一个字符*/

intgettoken();/*获得下一个记号*/

main()

{

inti;

source=fopen(".\\source.c","r");

while(gettoken()!

=0)

{wordindex++;

}

for(i=0;i<=wordindex;i++)

printf("word:

%s\n",tokenstring[i]);

fclose(source);

}

intgetnextchar()

{intc=fgetc(source);

if((c=='\n')||(c=='\t')||(c==''))/*忽略无效字符*/

c=fgetc(source);

returnc;

}

intgettoken()

{inttokenStringIndex=0;

intsave;

statetypestate=START;

while(state!

=DONE)

{if(back==0)

c=getnextchar();

save=1;

switch(state)

{caseSTART:

if(isdigit(c))

state=INNUM;

elseif(isalpha(c))

state=INID;

elseif(c==':

')

{state=INASSIGN;

back=0;}

elseif(c==';')

state=INSEMI;

elseif(c=='$')

{state=INDOLLAR;

back=1;/*回退一个字符*/}

break;

caseINASSIGN:

state=DONE;

if(c=='=')

token[wordindex]=ASSIGN;

break;

caseINSEMI:

back=0;

save=0;

state=DONE;

token[wordindex]=SEMI;

break;

caseINDOLLAR:

state=DONE;

token[wordindex]=DOLLAR;

save=0;

break;

caseINNUM:

if(!

isdigit(c))

{back=1;/*回退一个字符*/

save=0;

state=DONE;

token[wordindex]=NUM;

}

break;

caseINID:

if((!

isalpha(c))&&(!

isdigit(c)))

{back=1;/*回退一个字符*/

save=0;

state=DONE;

token[wordindex]=ID;

}

break;

}

if(save==1)

tokenstring[wordindex][tokenStringIndex++]=(char)c;

if(state==DONE)

{tokenstring[wordindex][tokenStringIndex]='\0';

}

}

if(c=='$')

return0;

else

return1;

}

样例source.c文件

x12:

=100;

y34:

=200;

z56:

=x12

$

ASCII码参考

字符

ASCII码

字符

ASCII码

a

97

1

49

b

2

50

c

3

51

x

120

空格

32

y

121

\t

9

z

122

\n

10

A

65

44

B

66

;

59

C

67

:

58

X

88

=

61

Y

89

Z

90

调试时,要查看的主要内存变量:

sourcectokentokenstringwordindexstate

程序中back为0表示先行,back为1表示非先行

程序中save为1时表示,一个单词得到识别,串最后加\0表示字符串结束,可以存入tokenstring数组

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

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2