词法编辑器

上传人:小** 文档编号:89418990 上传时间:2019-05-24 格式:DOC 页数:9 大小:516KB
返回 下载 相关 举报
词法编辑器_第1页
第1页 / 共9页
词法编辑器_第2页
第2页 / 共9页
词法编辑器_第3页
第3页 / 共9页
词法编辑器_第4页
第4页 / 共9页
词法编辑器_第5页
第5页 / 共9页
点击查看更多>>
资源描述

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

1、实验一 词法扫描器设计一 实验目的通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。二 实验内容设计一个简单的类C语言的词法扫描器。三 实验要求1、根据附录给定的文法,从输入的类C语言源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、分隔符五大类;文法见最后附录。2、提供源程序输入界面;3、词法分析后可查看符号表和TOKEN串表;4、保存符号表和TOKEN串表(如:文本文件); 5、遇到错误时可显示提示信息,然后跳过错误部分继续进行分析。四 实验报告(一) 系统功能(包括各个子功能模块的功能说明)程序主要实现的功

2、能:通过词法分析程序,在源程序中识别并分别出数字、标识符和保留字,并分别将记录到指定的文本文档中,过程中不符合符号表要求的字符视为错误处理。子功能模块:关键字处理;数字处理;字母的处理(标识符和保留字);运算符处理;主程序。(二) 开发平台(操作系统、设计语言)Windows 7,Microsoft Visual C+ 6.0。(三) 设计方案(1) 主数据流图(2) 主要子程序的流程框图(3) 主要数据结构:id Letter int10 Num int10 | Num OP +| - |* |/ | = |= | !=Keywordif | then | else | while | do

3、 Lettera|b|c|d|e|f|g|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|ZNum0|1|2|3|4|5|6|7|8|9 | Letter | Num |(四) 具体设计过程(包括主控程序、各个功能模块的具体实现)主模块:judge(FILE *,char *);用词法分析过程的判断子功能模块:Keyword(string );用于判断字符串是否是关键词 Letter(char c);用于判断c是否是字母 Num(char c);用于判断c是否是数字 (五

4、) 源代码#define MAX 50 /长度最大值 50 char ch = ; / 字符 空格string keyword50=bool,break,case,include,char,const, continue,default,do,double,else,false, float,for,if,int,long,namespace,new,return, short,signed,struct,switch,true,using,void,while ,then,class ; / 常见关键字数组 只用了部分30个/*关键字的处理过程*int gjz(string c) int i

5、; for(i=0;iMAX;i+) if(pare(c)=0) return 1; /与关键字数组中用相同的就返回真,否则假 return 0;/*字母的处理过程*int zm(char c) if(c=a)|(c=A) return 1; /比较字母的ASCII码值,在大小写范围内,返回真,否则假。 else return 0;/*数字的处理过程*int num(char c) if(c=0&c=9) return 1; /比较字母的ASCII码值,在0-9范围内,返回真,否则假。 else return 0;/*运算符处理过程*/ 过程中指针总是向前看一个,决定当前的各种单词是否结束,或

6、是根据后边的输入消除当前字符二义性。void caculate(FILE *fpin)ofstream out(lex.txt,ios:out); /文件token.txt输入内存 string arr=; /字符串 while(ch=fgetc(fpin)!=EOF) /没到文件末尾,循环至末尾 arr=; if(ch= |ch=t|ch=n) /空格,缩进,换行,均不做操作 else if(zm(ch) /若有字符 while(zm(ch)|num(ch) /当有字符或数字的时候,循环 arr=arr+ch; /组织拼接字符串 ch=fgetc(fpin); /ch 得到文件输入字符 fs

7、eek(fpin,-1L,SEEK_CUR); /循环结束后,重定位流指针,从当前位置左移一位。开始判断新的输入是什么类型 if (gjz(arr)outarrt1t关键字endl; /若是关键字,则输出类型1,关键字 else outarrt2t标识符endl; /若是标识符,则输出类型2,标识符 else if(num(ch) /若是数字 while(num(ch)|ch=.&num(fgetc(fpin)|fgetc(fpin)=e|ch=e)/ 数字 | . &(得到一个字符|字符是e|输入是e) if(ch=.) /. fseek(fpin,-1L,SEEK_CUR);/指针左移 a

8、rr=arr+ch; if(ch=e) /e,自然对数的底数 ch=fgetc(fpin); / 新读入 if( ch=+) arr+=+; else arr+=-, fseek(fpin,-1L,SEEK_CUR);/指针左移 ch=fgetc(fpin); fseek(fpin,-3L,SEEK_CUR); / 指针左移3 outarrt3t无符号数endl; /无符号数 3 else switch(ch) case+: case- : case* : case= : case/ :outch t4t运算符endl;break; /+ - * / = 运算符 4 case( : case)

9、 : case : case : case; : case# : case. : case, : case : case :outch t5t界限符endl;break; / (),.#; 界限符 case : string string1=; do string1+=ch; ch=fgetc(fpin); while (ch!=);/循环得到 string1+=ch; outstring1t6t字符串endl; /字符串 6 break; case: :ch=fgetc(fpin); if(ch=) out:= t4t运算符endl; /运算符 :=else out= t4t运算符endl; /运算符 = fseek(fpin,-1L,SEEK_CUR); /当指针回退一个字符 break; case :ch=fgetc(fpin); if(ch=)out= t4t运算符endl; /运算符 = if(ch=a)|(ch=A) fseek(fpin,-1L,SEEK_CUR); /指针回退一个字符 out

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

最新文档


当前位置:首页 > 商业/管理/HR > 管理学资料

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