编译原理实验一---词法分析.doc
- 文档编号:8965811
- 上传时间:2023-05-16
- 格式:DOC
- 页数:4
- 大小:52KB
编译原理实验一---词法分析.doc
《编译原理实验一---词法分析.doc》由会员分享,可在线阅读,更多相关《编译原理实验一---词法分析.doc(4页珍藏版)》请在冰点文库上搜索。
编译原理实验一词法分析
输入:
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数组
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 词法 分析