编译原理实验1扫描器的设计与实现Word文档格式.docx
《编译原理实验1扫描器的设计与实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理实验1扫描器的设计与实现Word文档格式.docx(30页珍藏版)》请在冰豆网上搜索。
}
预测结果:
(513,#)(14,define)(100,pi)(200,3)(514,.)(200,14)(1,void)(2,main)(502,()(503,))
(506,{)(15,double)(100,r)(402,=)(200,2)(514,.)(200,5)(501,;
)(15,double)(100,s)
(402,=)(200,0)(514,.)(200,0)(501,;
)(100,s)(402,=)(100,pi)(416,*)(100,r)(416,*)
(100,r)(501,;
)(12,printf)(502,()(509,"
)(511,%)(100,f)(509,"
)(512,,)(100,s)(503,))
(501,;
)(507,})
1.4.实验内容及步骤
1、输入已给的文本格式的扫描程序Lexical.c文件,然后编译运行,检查修改错误。
2、编译成功后,提示输入C语言测试程序,用回车键查看输出的单词流,即单词符号及其属性。
3、比较自己分析的结果和屏幕上的输出结果。
1.5.实验小结
1、得到的经验。
通过本次实验,我了解了如何设计、编制并调试词法分析程序,加深了对词法分析原理的理解。
同时,在编制和调试程序时要全面考虑,避免漏掉或者错误定义定界符等,造成不必要的错误。
2、遇到的主要问题。
忘记对空格、回车符等定界符进行设置等。
3、改进方案。
(1)char*keywords[15]={"
void"
"
main"
if"
then"
break"
int"
char"
float"
include"
for"
while"
printf"
scanf"
define"
double"
};
(2)case13:
{
flag=14;
status=1;
break;
case14:
flag=15;
(3)case'
.'
:
words[j]=ch;
words[j+1]='
\0'
;
flag=514;
case'
'
words[j]='
flag=250;
\n'
flag=251;
(4)elseif(flag==250||flag==251){
修改前源代码:
#include"
stdio.h"
stdlib.h"
string.h"
inti,j,k,flag,number,status;
/*statuswhichisusetojudgethestringiskeywordsornot!
*/
charch;
charwords[10]={"
"
charprogram[500];
intScan(charprogram[])
char*keywords[13]={"
number=0;
status=0;
j=0;
ch=program[i++];
/*Tohandlethelettlespaceandstab*/
/*handleletters*/
if((ch>
='
a'
)&
&
(ch<
z'
))
while((ch>
words[j++]=ch;
ch=program[i++];
i--;
words[j++]='
for(k=0;
k<
13;
k++)
if(strcmp(words,keywords[k])==0)
switch(k)
case0:
flag=1;
case1:
flag=2;
case2:
flag=3;
case3:
flag=4;
case4:
flag=5;
case5:
flag=6;
case6:
flag=7;
case7:
flag=8;
case8:
flag=9;
case9:
flag=10;
case10:
flag=11;
case11:
flag=12;
case12:
flag=13;
if(status==0)
flag=100;
/*handledigits*/
elseif((ch>
0'
9'
))
)&
number=number*10+(ch-'
);
ch=program[i++];
flag=200;
/*opereationandedgehandle*/
elseswitch(ch)
case'
='
if(ch=='
)
words[j++]=ch;
words[j]='
flag=401;
else
flag=402;
>
'
flag=403;
flag=404;
<
flag=405;
flag=406;
!
flag=407;
flag=408;
+'
flag=409;
elseif(ch=='
flag=410;
flag=411;
-'
flag=412;
elseif(ch=='
flag=413;
flag=414;
*'
flag=415;
flag=416;
/'
flag=417;
flag=418;
flag=501;
('
flag=502;
)'
flag=503;
['
flag=504;
]'
words[j]=