汇编语言词法分析(新)

上传人:xzh****18 文档编号:34342653 上传时间:2018-02-23 格式:DOC 页数:13 大小:576.50KB
返回 下载 相关 举报
汇编语言词法分析(新)_第1页
第1页 / 共13页
汇编语言词法分析(新)_第2页
第2页 / 共13页
汇编语言词法分析(新)_第3页
第3页 / 共13页
汇编语言词法分析(新)_第4页
第4页 / 共13页
汇编语言词法分析(新)_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《汇编语言词法分析(新)》由会员分享,可在线阅读,更多相关《汇编语言词法分析(新)(13页珍藏版)》请在金锄头文库上搜索。

1、数学与信息工程学院编译原理实验报告一实验名称:词法分析 实 验 室:6202班 级:09 计算机 3 班姓 名:沈春晖学 号:0929210062词法分析器的设计一、 实验目的通过完成词法分析程序,了解词法分析的过程。编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。二、 实验环境操作系统:window xp编写环境:visual c+ 、c-free、turbo c编写语言:c 语言分析语言:PL/0三、 实验内容对 PL/0 语言进行词法分析,把输入的字符串形式的源程序分割成一

2、个个单词符号,其词法描述如下:(1) 关键字:begin, call,const ,do , end,if ,odd,procedure,read,then ,var ,while,write(2) 标识符:用来表示各种名字,必须以字母开头小于 10 位字符组成(3) 数字:以 0-9 组成小于 14 位的数字(4) 运算符:+,-,*, /,:=,=(5) 界符:,,.,;,#表 1 各种单词符号对应类型表单词符号 类型+ plus- minus* times/ slash( lparen) rparen= eql, comma. perio# neq; semicolonbegin beg

3、insymcall callsymconst constsymdo dosymend endsymif ifsymodd oddsymprocedure proceduresymread readsymthen thensymvar varsymwhile whilesymwrite writesymNNYY开始调用 GETSYM 取单词输入要分析的文件文件是否存在文件是否结束结束打印分析结果图 1 主流程图YNNNNNYYYYGETSYM滤空 CH=空?GETCHCH 是字母?K:=0K=、:=、#include string.h#define al 10 /*符号的最大长度*/#defin

4、e norw 13 /*关键字个数*/#define namx 14 /*数字允许的最长位数*/FILE *fin;FILE *fout;char fnameal,fwnameal,aal+1/*a50*/,idal+1,sym20;static char sword11=+,-,*,/,(,),=,.,#,;static char ssym11al=plus,minus,times,slash,lparen,rparen,eql,comma,period,neq,semicolon;static char word13al=begin,call,const,do,end,if,odd,pro

5、cedure,read,then,var,while,write;/保留关键字static char wsym13al=beginsym,callsym,constsym,dosym,endsym,ifsym,oddsym,procsym,readsym,thensym,varsym,whilesym,writesym;/关键字类型int cc,ll,cx,linecount,num;char line81;char ch;void main()int getsym();printf(*编译原理实验PL/0语言词法分析*n);printf(请输入进行词法分析的文件名:);scanf(%s,fn

6、ame);fin=fopen(fname,r);printf(请输入分析结果保存的文件名:);scanf(%s,fwname);fout=fopen(fwname,w);linecount=0;/记录文件的行数cc=ll=0;ch= ;if(fin)printf(n-开始词法分析-n);fprintf(fout,-开始词法分析-n);printf(单词自身的值 单词种别n);fprintf(fout,单词自身的值 单词种别n);while( getsym()!=-1 )printf(%-20s,a);fprintf(fout,%-20s,a);printf(%s,sym);/输出单词种别fpr

7、intf(fout,%s,sym);printf(n);fprintf(fout,n);printf(%-20s,a);fprintf(fout,%-20s,a);printf(%s,sym);/输出单词种别fprintf(fout,%s,sym);printf(n程序分析完毕);fprintf(fout,n程序分析完毕);elseprintf(你输入的文件不存在);fprintf(fout,你输入的文件不存在);void error(int rowcount,int wordcount)printf(!第%d行第%d个位置数字越界n,rowcount,wordcount);fprintf(f

8、out,!第%d行第%d个位置数字越界n,rowcount,wordcount);int getch()if(cc=ll)/缓冲是否被读取完毕if(feof(fin)return -1; ll=0;cc=0;ch= ;while(ch!=10)if(EOF=fscanf(fin,%c,&ch)linell=0;break;linell=ch;ll+;linecount+;printf(开始分析程序的第%d行n,linecount);fprintf(fout,开始分析程序的第%d行n,linecount);ch=linecc;cc+;return 0;int getsym()int i,j,k;

9、while(ch= | ch=10 | ch=9 )/*判断字符是否为空,空跳过取下一个字符*/if(-1=getch()return -1;if(ch=a & ch=a ak=0;strcpy(id,a);i=0;j=norw-1;dok=(i+j)/2;if(strcmp(id,wordk)=0)i=k+1;while(ij)strcpy(sym,wsymk);elsestrcpy(sym,ident);if(b=1) return -1;elseif(ch=0 & ch=0 ak=0;k-;if(knamx)error(linecount,cc);/错误处理,数字越界else/如果是计算

10、、比较符号a0=ch;if(ch=:)if(-1=getch()a1=0;return -1;if(ch=)strcpy(sym,becomes);a1=ch;a2=0;if(-1=getch() return -1;elsea1=0;strcpy(sym,nul);/不可识别符号elseif(ch=)if(-1=getch() a1=0;return -1;if(ch=)a1=ch;a2=0;strcpy(sym,geq);if(-1=getch() return -1;elsea1=0;strcpy(sym,gtr);else/单字符符号处理i=0;a1=0;while(i11 & ch!=swordi)i+;if(i11)strcpy(sym,ssymi);if( strcmp(sym,period)!=0 )if(-1=getch() return -1;elsereturn -1;elseprintf(不可识别的字符n);/非字符开头处理结束return 0;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号