如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
第一部分词法分析实验一、简单的扫描器设计一、实验目的:熟悉并实现一个简单的扫描器二、实验内容:设计扫描器的自动机;设计翻译、生成Token的算法;编写代码并上机调试运行通过。·要求:输入——源程序文件;输出——(1)相应的Token序列;(2)关键字、界符表,符号表,常数表。三、扫描器设计:扫描器单词Token自动机:空l/d关键字表和界符表l-1eq\o\ac(○,0)=1\*GB3①=2\*GB3②-单词编码dprogram3d-1procedure4=3\*GB3③=4\*GB3④-begin5+end6=5\*GB3⑤-while7*do8=6\*GB3⑥-+9:=*10=7\*GB3⑦=8\*GB3⑧-:11-1:=12=9\*GB3⑨-=13……,14,;15=10\*GB3⑩--1eq\o\ac(○,11)-关键字表和界符表:四、程序实现:1.数据结构:charch;//当前字符charstrToken[];//当前单词char*keywords[]={“program”,“procedure”,“begin”,……};//关键字表、界符表charID[][];//符号表intCons[];//常数表structTokenType{intcode,value;}structTokenTypeToken[];//Token数组2.算法设计:初始化;滤除空格,读取第一个非空字符到ch;if(ch是一个字母)处理关键字或标识符;5.elseif(ch是一个数字)6.处理常数;else7.处理界符或错误处理;3.算法求精:·step2:ch=GetChar();//读取当前字符到chwhile(ch==’‘)ch=GetChar();·step3:intIsLetter(charch)//判断ch是否为字母{if(ch是A~Z或a~z)return1;elsereturn0;}·step4:4.1在strToken中拼成一个单词;//拼关键字或标识符4.2code=Reserve(strToken);//查关键字表;if(!code)//未查到,是一个标识符{4.3value=InsertID(strToken);//将strToken中的单词插入到符号表中4.4生成并输出一个标识符Token;}else4.5生成并输出一个关键字Token;·step5:intIsDigit(charch)//判断ch是否为数字{if(ch是0~9)return1;elsereturn0;}·step6:6.1在strToken中拼成一个单词;//拼常数6.2value=InsertConst(strToken);//将strToken中的单词插入到常数表中6.3生成并输出一个常数Token;·step7:7.1将ch中的字符拼接到strToken中;if(ch==’:’)7.2处理双界符“:=”;7.3code:=Bound(strToken);//查界符表if(!code)//未查到ProcError();//错误处理else7.4生成并输出一个界符Token;·step4.1:while(IsLetter(ch)||IsDigit(ch)){Concat();//将ch中的字符拼接到strToken中ch=GetChar();}·step4.2:intReserve(char*strToken)//用strToken中的单词去查关键字表。查到了,则返回该关键字的编码;//否则,返回0{inti=0;while(i<N)//设N为关键字表中元素的个数{if(!strcmp(keywords[i],strToken))return(i+3);i++;}return0;}·step4.3:intInsertID(char*strToken)//用strToken中的单词去查符号表。查到了,则返回该单词在表中的位置值;//否则,将strToken中的单词插入符号表的尾部,并返回位置值{inti=0;while(i<m)//设m为符号表中已有的标识符的个数{if(!strcmp(ID[i],strToken))returni;i++;}strcpy(ID[i],strToken);m++;returni;}·step4.4:Token[i].code=1;Token[i].value=value;