ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:37.92KB ,
资源ID:9336785      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9336785.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理实验词法分析报告实验报告材料.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编译原理实验词法分析报告实验报告材料.docx

1、编译原理实验词法分析报告实验报告材料编译技术实验报告 实验题目: 词法分析学 院: 信息学院专 业: 计算机科学与技术学 号: 姓 名: 一、实验目的(1) 理解词法分析的功能;(2) 理解词法分析的实现方法;二、实验内容PL0的文法如下为非终结符。 := 该符号的左部由右部定义,可读作“定义为”。 | 表示或,为左部可由多个右部定义。 表示花括号内的语法成分可以重复。在不加上下界时可重复0到任意次数,有上下界时可重复次数的限制。 表示方括号内的成分为任选项。 ( ) 表示圆括号内的成分优先。 上述符号为“元符号”, 文法用上述符号作为文法符号时需要用引号括起。程序=分程序分程序= 变量说明部

2、分过程说明部分语句变量说明部分=VAR标识符,标识符:INTEGER;无符号整数=数字数字标识符=字母字母|数字过程说明部分=过程首部分程序;过程说明部分;过程首部=PROCEDURE标识符;语句=赋值语句|条件语句|过程调用语句|读语句|写语句|复合语句|空赋值语句=标识符=表达式复合语句=BEGIN语句;语句END条件=表达式关系运算符表达式表达式=项加法运算符项 项=因子乘法运算符因子因子=标识符|无符号整数|(表达式)加法运算符=+|-乘法运算符=*关系运算符=|=|=条件语句=IF条件THEN语句字母=a|b|X|Y|Z数字=0|1|2|8|9实现PL0的词法分析三、实验分析与设计P

3、L0词法分析程序是一个独立的过程,其功能是为语法语义分析提供单词,把输入的字符串形式的源程序分割成一个个单词符号传递给语法语义分析。其主要方法步骤为从源程序扫描下一个字符,忽略空格、换行、TAB和注释并识别单词,再将不同类别的单词归类输出。四、实验的实现#include #include#include#include#include#define norw 11 /norw-1个关键字#define al 20 /最长的关键字的长度#define ID norw#define INT norw+1#define COMMA norw+2#define ENDF norw+3#define C

4、OLON norw+4#define SEMIC norw+5#define ADD norw+6#define MINUS norw+7#define MULTI norw+8#define EVALU norw+9#define LE norw+10#define NE norw+11#define LT norw+12#define EQ norw+13#define GE norw+14#define GT norw+15#define FLOAT norw+16char TOKEN20; /字符数组用来依次存放单词词文的各个字符extern int lookup(char *); /

5、以TOKEN字符串查保留字表extern void report_error(char); /报告程序中的词法错误bool isalpha(char); /判断接收字符是否为字母bool isalnum(char); /判断接收字符是否为字母或者数字bool isdigit(char); /判断接收字符是否为数字bool isannotation(char); /判断接收字符是否为注释extern char letter(char c); /用来将大写字母转化成小写字母FILE* fin;FILE* fout;void scanner()/词法分析的主体程序,对输入的文本文件进行词法分析 ch

6、ar ch; int i,c; int error=0; /记录文件中词法错误的个数 ch=fgetc(fin); /从输入文件中读取一个字符 while(ch!=EOF) /当从输入文件接收的字符不是文件结束符时,执行循环 if(isalpha(ch) /如果从输入文件接收的第一个字符是字母 ch=letter(ch); TOKEN0=ch; ch=fgetc(fin);i=1; while(isalnum(ch) ch=letter(ch); TOKENi=ch;i+; ch=fgetc(fin); TOKENi=0; c=lookup(TOKEN); /查保留字表 if(c=0) fpr

7、intf(fout,(%d,%s)n, ID,TOKEN); /输出标识符 else fprintf(fout,(%d,%s)n, c,TOKEN); /输出接收单词为保留字 if(isdigit(ch) /如果从输入文件接收的第一个字符是数字 int cdot=0; /统计小数点个数 TOKEN0=ch; ch=fgetc(fin);i=1; while(isdigit(ch)|ch=.) /从第二个接收字符开始,当是数字或者是小数点时,执行循环 if(ch=.) cdot+; TOKENi=ch;i+; ch=fgetc(fin);/重复接收字符,直到接收到非数字 if(cdot=2) e

8、rror+; TOKENi=0; printf(%s is errorn, TOKEN); break; if(isalpha(ch) /如果第二个字符是字母 while(isalpha(ch) /接收完所有的字母,跳出循环 TOKENi=ch;i+; ch=fgetc(fin); TOKENi=0; error+; printf(%s is errorn, TOKEN); else if(cdot=0) /当接收的字符为整型单词时 fseek(fin,-1,1); TOKENi=0; int a,temp=0,c; for(c=0;ci;c+) a=TOKENc - 0; if(c!=0)

9、temp=temp*10; temp=temp+a; else temp=a; fprintf(fout,(%d,%d)n, INT, temp); /输出接收单词为整数 else if(cdot=1) fseek(fin,-1,1); TOKENi=0; int a,part1=0,jc,b=0; /b用来确定小数点所在的位置 float c=0.1,part2=0.0; while(TOKENb!=.) b=b+1; for(jc=0;jcb;jc+) a=TOKENjc - 0; if(jc!=0) part1=part1*10; part1=part1+a; else part1=a;

10、 for(jc=b+1;jci;jc+) a=TOKENjc-0; part2=a*c+part2; c=c*0.1; fprintf(fout,(%d,%f)n, FLOAT, part1+part2); /输出接收单词为小数 else if(cdot=2) fseek(fin,-1,1); else /如果从输入文件接收的第一个字符既不是字母又不是数字 switch(ch) /将所接收到的符号字符进行分类,采取一符一类 case:ch=fgetc(fin); if(ch=) fprintf(fout,(%d,:=)n, EVALU); /输出接收符号为赋值号 else ch=fgetc(f

11、in); fseek(fin,-1,1); /文件接收字符回推一个字符 fprintf(fout,(%d,:)n, COLON); /输出冒号 break; case,:fprintf(fout,(%d,)n, COMMA); break; /输出逗号 case.:fprintf(fout,(%d,.)n, ENDF);break; /输出句号 case;:fprintf(fout,(%d,.)n, SEMIC);break; /输出分号 case+:fprintf(fout,(%d,+)n, ADD);break; /输出加号 case-:fprintf(fout,(%d,-)n, MINU

12、S);break; /输出减号 case*:fprintf(fout,(%d,*)n, MULTI);break; /输出乘号 case:ch=fgetc(fin); if(ch=)fprintf(fout,(%d,)fprintf(fout,(%d,)n, NE); /输出不等于号 else fseek(fin,-1,1); fprintf(fout,(%d,:ch=fgetc(fin); if(ch=)fprintf(fout,(%d,=)n, GE); /输出大于或等于号 else fseek(fin,-1,1); fprintf(fout,(%d,)n, GT); /输出大于号 bre

13、ak; case :break; casen:break; caset:break; case/:ch=fgetc(fin);/检查是否为单行注释 if(ch=/) while(ch!=n) ch=fgetc(fin); else fseek(fin,-1,1); printf(/ is errorn); error+; break; case: while(1) ch=fgetc(fin); if(ch=) break; if(ch=EOF) fseek(fin,-1,1); printf( is errorn); error+; break; break; default:printf(%

14、c is errorn, ch); /接收非上述字符程序报告词法错误 error+;break; ch=fgetc(fin); /继续从文件中读取下一个单词,直到文件结束 /while循环结束 printf(共发现%d 个词法错误!,error); return;int lookup(char *token) int j; char wordnorwal; strcpy(&(word10), begin ); strcpy(&(word20), end); strcpy(&(word30), var); strcpy(&(word40), integer); strcpy(&(word50),

15、 while); strcpy(&(word60), do); strcpy(&(word70), if); strcpy(&(word80), then); strcpy(&(word90), procedure); strcpy(&(word100), else); for(j=1;j=a&c=A&c=a&c=A&c=0&c=0&c=A&c=Z) c=c+32; return c;int main()char filename20;printf(请输入文件名:);scanf(%s,filename);if(fin=fopen(filename,r)=NULL) /打开要读取的文本文件 printf(不能打开文件.n); exit(0);printf(请输入保存分析结果的文件名:);scanf(%s,filename);if(fout=fopen(filename,w)=NULL) printf(不能打开文件.n); exit(0); scanner(); /调用词法分析程序/getchar();getchar();fclose(fin);fclose(fout);return 0;五、运行的结果

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1