版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验一 pl o语言的词法分析程序getsym一、实验目的加深和巩固对于词法分析的了解和掌握;初步认识pl/0语言的基础和简单的程序编写;通过本实验能够初步的了解和掌握程序词法分析的整个过程;提高自己上机和编程过程中处理具体问题的能力。二、实验要求实验前先阅读完总体的预备知识以及实验相关的基础知识;要求自己独立完成实验,不得抄袭别人的结果;编写和调试过程中出现的问题做好记录;实验程序调试完成后,用给定的pl0测试程序(test.pl0)进行测试,由老师检查测试结果,并给予相应的成绩;实验完成后,要上交实验报告。三、实验原理pl/o语言的编译程序,是用高级语言pascal语言书写的。整个编译过程
2、是由一些嵌套及并列的过程或函数完成。词法分析程序是独立的过程getsym完成,供语法分析读单词时使用。语法分析是由过程block完成。采用自顶向下的递归子程序法。所产生的目标程序为假象栈式计算机的汇编语言。对目标程序的执行是由pascal语言书写的解释程序进行的。因此pl/o语言可以在配备pascal语言的任何机器上实现。由于pl/o语言编译程序是适合教学用的实例,它的数据类型只有整形数,数据运算只有四则运算。语句有复制语句、条件语句、while型循环语句、输入、输出语句和不带参数允许递归调用过程语句及复合语句。词法分析程序getsym的功能包括:1、滤空格,空格在词法分析时是一种不可缺少的界
3、符,而在语法分析时是无用的,所以必须滤掉。2、识别保留子:设有一张保留字表。对每个字母打头的字母、数字字符串要查此表。若查着则为保留字,对应的类别放在sym中。如if对应值为thensym。3、识别标识符:对用户定义的标识符将ident放在sym中,标识符本身的值放在id中。4、拼数:当所取单词是数字时,将树的类别number放在sym中,数值本身的值放在num中。5、拼复合词:对两个字符组成的算符如:=、:=、=等单词,识别后将类别送sym中。6、打印源程序:为边读入字符边打印。打印每个单词的识别类别(如果是标识符或数字应该给出其值即id和num中的值。图2所示即为给定pl0源程序的一个可能
4、输出)。四、实验环境操作系统为windows 2000或dos6.2以上;应用软件为pascal或c语言。getch所用单元说明:ch:存放当前读取的字符,初值为空,line:为一维数组,其数组元素是字符;界对为1:80。用于读入一行字符的缓冲区;ll,cc:为计数器,初值为0;getsym流程图的工作单元说明:a:一维数组,数组元素为字符,界对1:10;id:同a;word:保留字,一维数组,数组元素为以字符为元素的一维数组。界对为1:13。查表方式采用二分法。五、实验内容阅读所给出的词法分析程序(pl0_lexical.c),搞懂程序中每一个变量的含义,以及每一个过程的作用,并在该过程中进
5、行中文注释;阅读完程序后,画出各过程的流程图;给出的程序包含两处输入错误,利用所给的pl/0源程序(test.pl0)对程序进行调试,使其能正确对所给文件进行分析并能够解释运行;在阅读懂所给出的词法分析程序后,将你对词法分析的理解写在实验报告上。下面简要分析一下词法分析程序的运行流程:主函数main():打开要分析的c源程序,若不能正确打开,则报错。先从源程序中读入一个字符ch,然后进行如下处理:1、ch是字符:转入关键字和标识符处理子函数;2、ch是数字:转入数字处理函数;3、ch是其他字符:转入其他字符处理子函数;结束。关键字和标识符处理子函数alphaprocess(char buffe
6、r);1、将buffer送入临时数组alphatp0,再读入一个字符至buffer;2、判断buffer是否为字符或数字,若是,则alphatp1=buffer;3、重复1,2,直到2判断为假;在alphatp末尾添加message;4、调用search()子函数,在关键字表中匹配alphatp,若匹配成功,则返回序号;5、调用search,在标识符表中匹配alphatp,若匹配成功,则返回序号;6、在标识符表中添加alphatp,并返回序号;源代码:分析程序skh.c程序#include stdio.h main()printf(my name is 08061118 yuchaofeng)
7、;主程序:#include stdio.h#include ctype.h#include alloc.h#include stdlib.h#include string.h#define null 0file*fp;char cbuffer;char*key8=do,begin,else,end,if,then,var,while;char*border6=,;,:=,.,(,);char*arithmetic4=+,-,*,/;char*relation6=,=,=,=,;char*consts20;char*label20;int constnum=0,labelnum=0;int se
8、arch(char searchchar,int wordtype)int i=0;switch(wordtype)case 1:for(i=0;i=7;i+)if(strcmp(keyi,searchchar)=0)return(i+1);case 2:for(i=0;i=5;i+)if(strcmp(borderi,searchchar)=0)return(i+1);return(0);case 3:for(i=0;i=3;i+)if(strcmp(arithmetici,searchchar)=0)return(i+1);return(0);case 4:for(i=0;i=5;i+)i
9、f(strcmp(relationi,searchchar)=0)return(i+1);return(0);case 5:for(i=0;i=constnum;i+)if(strcmp(constsi,searchchar)=0)return(i+1);constsi-1=(char*)malloc(sizeof(searchchar);strcpy(constsi-1,searchchar);constnum+;return(i);case 6:for(i=0;i=labelnum;i+)if(strcmp(labeli,searchchar)=0)return(i+1);labeli-1
10、=(char*)malloc(sizeof(searchchar);strcpy(labeli-1,searchchar);labelnum+;return(i);char alphaprocess(char buffer)int atype;int i=-1;char alphatp20;while(isalpha(buffer)|(isdigit(buffer)alphatp+i=buffer;buffer=fgetc(fp);alphatpi+1=message;if(atype=search(alphatp,1)printf(%s(1,%d)n,alphatp,atype-1);els
11、eatype=search(alphatp,6);printf(%s(6,%d)n,alphatp,atype-1);return(buffer);char digitprocess(char buffer)int i=-1;char digittp20;int dtype;while(isdigit(buffer)digittp+i=buffer;buffer=fgetc(fp);digittpi+1=message;dtype=search(digittp,5);printf(%s(5,%d)n,digittp,dtype-1);return(buffer);char otherproce
12、ss(char buffer)int i=-1;char othertp20;int otype,otypetp;othertp0=buffer;othertp1=message;if(otype=search(othertp,3)printf(%s(3,%d)n,othertp,otype-1);buffer=fgetc(fp);goto out;if(otype=search(othertp,4)buffer=fgetc(fp);othertp1=buffer;othertp2=message;if(otypetp=search(othertp,4)printf(%s(4,%d)n,oth
13、ertp,otypetp-1);goto out;else othertp1=message;printf(%s(4,%d)n,othertp,otype-1);goto out;if(buffer=:)buffer=fgetc(fp);if(buffer=)printf(:=(2,2)n);buffer=fgetc(fp);goto out;elseif(otype=search(othertp,2)printf(%s(2,%d)n,othertp,otype-1);buffer=fgetc(fp);goto out;if(buffer!=n)&(buffer!=)printf(%c error,not awordn,buffer);buffer=fgetc(fp);out:return(buffer);void main()int i;for(i=0;i=20;i+)labeli=null;constsi=null;if(fp=fopen(skh.c,r)=null)printf(error);elsecbuffer=fgetc(fp);while(cbuffer!=eof)if(isalpha(cbuffer)cbuffer=alphaprocess(cbuffer);else if(isdigit(cbuffer)cbuffer=digitproce
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广西中考物理5年(2021-2025)真题分类汇编:专题03 光现象(原卷版)
- 2025年高级经济师之工商管理题库练习试卷B卷附答案
- 2025年心理咨询师之心理咨询师二级技能每日一练试卷B卷含答案
- 制药用磁力搅拌器创新创业项目商业计划书
- 建筑外墙内保温解决方案创新创业项目商业计划书
- 建筑保温隔热材料租赁服务创新创业项目商业计划书
- 天津市津南医院硬件集成实施服务项目需求书
- 2024年武威市市直事业单位选调工作人员真题
- 2025年潮州辅警招聘考试题库含答案详解(达标题)
- 2025年郑州辅警招聘考试真题含答案详解(培优a卷)
- 2025年直招军官面试题型及答案
- GB/T 5699-2025采光测量方法
- 《中国金融学》课件 第14章 金融发展与金融“五篇大文章”-课件
- 废旧轮胎回收利用综合汇报
- 2026步步高六册同步物理必修3-第十二章 3 第2课时 伏阻法和安阻法测电池的电动势和内阻
- 全国大学生职业规划大赛《土木工程》专业生涯发展展示
- 全民守法+说课课件-2024-2025学年高中政治统编版必修三政治与法治
- 2025年高考化学试卷真题完全解读(陕晋宁青卷)
- 舞蹈老师职业介绍
- 心理健康教育自我成长报告
- 附件:佛山市房屋市政工程生产安全重大事故隐患排查、判定、治理、处罚工作指引
评论
0/150
提交评论