编译原理实验-词法分析资料报告器地设计.doc

上传人:夺命阿水 文档编号:11207 上传时间:2022-06-24 格式:DOC 页数:9 大小:82.50KB
返回 下载 相关 举报
编译原理实验-词法分析资料报告器地设计.doc_第1页
第1页 / 共9页
编译原理实验-词法分析资料报告器地设计.doc_第2页
第2页 / 共9页
编译原理实验-词法分析资料报告器地设计.doc_第3页
第3页 / 共9页
编译原理实验-词法分析资料报告器地设计.doc_第4页
第4页 / 共9页
编译原理实验-词法分析资料报告器地设计.doc_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《编译原理实验-词法分析资料报告器地设计.doc》由会员分享,可在线阅读,更多相关《编译原理实验-词法分析资料报告器地设计.doc(9页珍藏版)》请在课桌文档上搜索。

1、word集美大学计算机工程学院实验报告课程名称:编译原理班级:指导教师:实验项目编号:实验一学号:实验项目名称:词法分析器的设计实验成绩:一、实验目的通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进展扫描过程中将其分解为各类单词的词法分析方法。二、实验容编写一个词法分析器,从输入的源程序编写的语言为C语言的一个子集中,识别出各个具有独立意义的单词,即根本保存字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的部编码与单词符号自身值。遇到错误时可显示“Error,然后跳过错误局部继续显示三、实验要求1、 词法分析器的功能和输出格式词法分析器

2、的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。单词示例单词种别码要求保存字if、else、int、while、do每个保存字的单词种别都单独为一种标识符以字母开头且包含字母和数字的字符串标识符作为一种常数只识别无符号整数123、343无符号整数作为一种运算符+、-、*、/、=、= = 、!=、 、=、 、4分隔符,、;、(、)5本实验所使用的开发语言是C语言,在Test2类中定义了以下几个函数:开始2.程序流程图:读入文件,把内容存入string中,m=0,check=ture,error=falsech是分隔符?check=fa

3、lse?error=ture?check=false?输出str,标识为标示符check=ture输出str,标识为运算符从string中读出一个字符放入ch中完毕ch是最后一个字符? Ych是运算符? N Y Nerror=ture? N输出str,标识为无法识别的串check=ture,error=false Y Y N输出str,标识为无法识别的串check=ture,error=false Y N Y Y 输出str,标识为标示符check=ture输出str,标识为分隔符 N Nch是数字? NCh是字母?check=ture?check=ture? Y Y N N N打印出错清空s

4、tr,ch加到str中,check=falsech加到str中清空str,ch加到str中,check=false Y Ych加到str中ch是关键字?ch是数字? Y 输出str,标识为关键字,check=true N Y Nch加到str中,error=true3、实验程序#include#include#include#include/判断读入的字符是否为字母bool isLetter(char c)if(c = a & c = A & c =0 & c = 9)return true;elsereturn false;/判断是否为关键字bool isKey(char *string)

5、if(!strcmp(string,void) | !strcmp(string,if)| !strcmp(string,for)| !strcmp(string,while) | !strcmp(string,do)| !strcmp(string,return)| !strcmp(string,break)| !strcmp(string,main)| !strcmp(string,int)| !strcmp(string,float)| !strcmp(string,char)| !strcmp(string,double)| !strcmp(string,String)return t

6、rue;else return false;bool isError(char ch)if(ch = | ch = $ | ch = & | ch = # | ch = | ch = )return true;elsereturn false;void main()char string500=;/存放文件中读出来的字符串char str10=;/存放需要比照的字符串char ch,c;/ch存放文件中的单个字符翻译时用,c存放文件中的单个字符从文件中提取信息时用char filename20;/文件名int j=0;printf(请输入文件名进展词法翻译:);scanf(%s,filenam

7、e);FILE *cfPtr; if(cfPtr=fopen(filename,r)=NULL)printf(文件未找到!);elsewhile(!feof(cfPtr)if(isspace(c=fgetc(cfPtr)/判断是否是字符串;elsestringj=c;/从文件中一一提取字符j+;int m = 0,k=0;/m翻译时用,k是str数组的下标stringj= ;j+;bool check=true,error=false;/用于判断标识for(int i = 0;i | ch = )if(error)printf(%s,此字符无法是识别!n,str);error=false;ch

8、eck=true;else if(!check)printf(2,%s)标示符n,str);check=true;m = 4;else if(ch = , | ch = ; | ch = | ch = | ch = ( | ch = )if(error)printf(%s此字符无法识别n,str);error=false;check=true;else if(!check)printf(2,%s)标示符n,str);check=true;m = 5; else if ( isDigit(ch =stringi) ) )if(check)memset(str, 0, strlen(str);/清

9、空k=0;strk=ch;k+;m = 3;check=false; elsestrk=ch;k+;else if ( isLetter(ch = stringi) )if(check)check=false;memset(str, 0, strlen(str);k=0;strk=ch;k+;elsestrk=ch;k+;if(isKey(str)printf(1,%s)关键字n,str);check=true;else if(isError(ch = stringi)if(check)memset(str, 0, strlen(str);/清空k=0;strk=ch;k+;check=fal

10、se;error=true;elsestrk=ch;k+;error=true;elsebreak;case 3:if(isLetter(ch =stringi)printf(程序有错误!n);strk = ch;k+;error=true;m = 0;break;if(isError(ch = stringi)printf(程序有错误!n);strk = ch;k+;error=true;m = 0;break;if (isDigit(ch =stringi ) )strk = ch;k+;else if(ch=.)strk=ch;k+;else printf( 3,%s) 数字n,str);i -;m = 0;check=true;break;case 4:i-;printf( 4 ,%c) 运算符n,ch);m = 0;break;case 5:i -;printf( 5 ,%c) 分隔符n,ch);m = 0;break;return;五、实验结果 六、实验小结本次实验中,运用C语言进展实验,实验刚开始的时候,能够对输入的字符进展判断,但是却不能排错以与只能识别全是字母的标识符,后来经过修改程序代码和编程的逻辑最终实现了,既能排错又能分析句子;通过实验掌握了词法分析,能实现对普通程序的语法分析翻译。9 / 9

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号