实验一 PL O语言的词法分析程序GETSYM.doc
文本预览下载声明
实验一 PL O语言的词法分析程序GETSYM
一、实验目的
加深和巩固对于词法分析的了解和掌握;初步认识PL/0语言的基础和简单的程序编写;通过本实验能够初步的了解和掌握程序词法分析的整个过程;提高自己上机和编程过程中处理具体问题的能力。
二、实验要求
实验前先阅读完总体的预备知识以及实验相关的基础知识;要求自己独立完成实验,不得抄袭别人的结果;编写和调试过程中出现的问题做好记录;实验程序调试完成后,用给定的PL0测试程序(test.pl0)进行测试,由老师检查测试结果,并给予相应的成绩;实验完成后,要上交实验报告。
三、实验原理
PL/O语言的编译程序,是用高级语言PASCAL语言书写的。整个编译过程是由一些嵌套及并列的过程或函数完成。词法分析程序是独立的过程GETSYM完成,供语法分析读单词时使用。语法分析是由过程BLOCK完成。采用自顶向下的递归子程序法。所产生的目标程序为假象栈式计算机的汇编语言。对目标程序的执行是由PASCAL语言书写的解释程序进行的。因此PL/O语言可以在配备PASCAL语言的任何机器上实现。由于PL/O语言编译程序是适合教学用的实例,它的数据类型只有整形数,数据运算只有四则运算。语句有复制语句、条件语句、While型循环语句、输入、输出语句和不带参数允许递归调用过程语句及复合语句。
词法分析程序GETSYM的功能包括:1、滤空格,空格在词法分析时是一种不可缺少的界符,而在语法分析时是无用的,所以必须滤掉。2、识别保留子:设有一张保留字表。对每个字母打头的字母、数字字符串要查此表。若查着则为保留字,对应的类别放在SYM中。如IF对应值为THENSYM。3、识别标识符:对用户定义的标识符将IDENT放在SYM中,标识符本身的值放在ID中。4、拼数:当所取单词是数字时,将树的类别NUMBER放在SYM中,数值本身的值放在NUM中。5、拼复合词:对两个字符组成的算符如:=、:=、=等单词,识别后将类别送SYM中。6、打印源程序:为边读入字符边打印。打印每个单词的识别类别(如果是标识符或数字应该给出其值即id和num中的值。图2所示即为给定PL0源程序的一个可能输出)。
四、实验环境
操作系统为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),搞懂程序中每一个变量的含义,以及每一个过程的作用,并在该过程中进行中文注释;阅读完程序后,画出各过程的流程图;给出的程序包含两处输入错误,利用所给的pl/0源程序(test.pl0)对程序进行调试,使其能正确对所给文件进行分析并能够解释运行;在阅读懂所给出的词法分析程序后,将你对词法分析的理解写在实验报告上。
下面简要分析一下词法分析程序的运行流程:
主函数main():打开要分析的C源程序,若不能正确打开,则报错。
先从源程序中读入一个字符ch,然后进行如下处理:1、ch是字符:转入关键字和标识符处理子函数;2、ch是数字:转入数字处理函数;3、ch是其他字符:转入其他字符处理子函数;结束。
关键字和标识符处理子函数alphaprocess(char buffer);1、将buffer送入临时数组alphatp[0],再读入一个字符至buffer;2、判断buffer是否为字符或数字,若是,则alphatp[1]=buffer;3、重复1,2,直到2判断为假;在alphatp末尾添加[message];4、调用search()子函数,在关键字表中匹配alphatp,若匹配成功,则返回序号;5、调用search,在标识符表中匹配alphatp,若匹配成功,则返回序号;6、在标识符表中添加alphatp,并返回序号;
源代码:分析程序skh.c程序
#include stdio.h main()
{printf(my name isyuchaofeng);}
主程序:
#include stdio.h
#include ctype.h
#include alloc.h
#include stdlib.h
#include string.h
#define NULL 0
FILE*fp;
char cbuffer;
char*key[8]={DO,BEGIN,ELSE,END
显示全部