词法分析器
一、实验要求:
为PL0语言设计一个词法分析器,能够识别PL0语言编写的程序中的单词的合法性。
二、实验分析:
PL0语言是与pascal类似的语言,但是比pascal语言的词法、语法更加严格苛刻。
在PL0语言中,只有五种类型的单词:关键字、用户自定义标识符、数字、特殊符号以及非法标识符。
根据题目给出的PL0的文法,关键字只有如下几个:
Const——用来声明常量;
Var——用来声明变量;
Procedure——用来声明过程;
Begin——声明过程的开始;
End——声明过程的结束;
Ood——单目运算符,声明为关键字;
If——条件语句;
Then——条件语句;
Call——声明调用函数;
While——循环语句;
Read——读文件语句;
Write——写文件语句;
对于用户自定义标识符应该满足:以字母开头,其后是字母和数字的组合,即:字母(字母|数字)*
数字则是数字字符(0——9)组成的数字串;
特殊符号有如下几个:
+,-,*,/,=<>,<,>=,<=,:=
把关键字、算符和界符称为语言固有的单词,标识符、常量称为用户自定义的单词。
为此设置三个全程量:SYM,ID,NUM。
SYM:存放每个单词的类别,为内部编码的表示形式;
ID:存放用户所定义的标识符的值,即标识符字符串的机内表示;
NUM:存放用户定义的数。
三、设计方案:
(1)对于关键字,应该为每个关键字分配一个类别,该类别在机器内部为内部编码的表示形式;
采用枚举型,将所有的关键字放在一个表中,这样每一个关键字都分配到了一个内部编码;
(2)对于用户自定义的标识符,应该给他们一个统一的类别——SYM_IDENTIFIER;
(3)对于所有的特殊符号(例如+、-等),与关键字的处理方法一样给每一个符号分配一个类别。
(4)上述所有的类别均放在一个枚举类型表中。
(5)对于关键字,还应该有一个字符串类型的表,用来存储每一个关键字的名称。当词法分析器读入一个单词的时候,首先判断是不是关键字时,立马转入到表中,和表中的关键字进行匹配,如果匹配成功,则读入的标识符时关键字,否则进行进一步的判断;
四、程序设计:
为PL/0语言建立一个词法分析程序GETSYM(函数)
GETSYM要完成的任务:
1、滤掉单词间的空格;
2、识别关键字,用查关键字表的方法识别。当单词是关键字时,将对应的类别放在SYM中;
3、识别标识符,标识符的类别为SYM_IDENTIFIER,SYM_IDENTIFIER放在SYM中,标识符本身的值放在ID中。关键字或者标识符的最大长度是10;
4、拼数,将数的类别NUMBER放在SYM中,数本身的值放在NUM中;
5、拼由两个字符组成的运算符,如:>=,<=等等,识别后将类别放在SYM中;
6、错误处理,如果读入不能识别的单词、或者非法的字符、或者长度超过10的字符,就会报错。定义一个全局变量line记录当前读到程序的行数,报错时指示错误的行数;
7、打印源程序,边都入字符表打印;
8、为GETSYM设计一个GETCH