编译原理实验-词法分析器的设计[实验相关]_第1页
编译原理实验-词法分析器的设计[实验相关]_第2页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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

3、h是分隔符?check=false?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

4、 Y N N N打印出错清空str,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

5、(char *string) 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,

6、String)return true;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(请输入文件名进行词法翻译

7、:);scanf(%s,filename);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,

8、str);error=false;check=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

9、, 0, strlen(str);/清空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;s

10、trk=ch;k+;check=false;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,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论