实验一 词法分析程序实现
一、实验目的与要求
通过编写和调试一个词法分析程序;掌握在对程序设计语言的源程序进行扫描的过程中;将字符流形式的源程序转化为一个由各类单词符号组成的流的词法分析方法
二、实验内容
基本实验题目:若某一程序设计语言中的单词包括五个关键字begin、end、if、then、el;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符;试构造能识别这些单词的词法分析程序各类单词的分类码参见表I..
表I 语言中的各类单词符号及其分类码表
单词符号 | 类别编码 | 类别码的助记符 | moots 单词值 |
begin | 1 | BEGIN | |
end | 2 | END | |
if | 3 | IF | |
then | 4 | THEN keep your shirt on | |
el | 5 | ELSE | |
标识符 | 6 | ID | 字母打头的字母数字串 |
无符号常数 | 7 | UCON | 机内二进制表示 |
< 河北教育培训网 | 8 | LT | |
<= | 9 | LE | |
= | 10 | EQ | |
<> | 11 | NE | |
> | 12 | GT | |
>= | 13 | GE | |
:= | 14 | IS | |
+ | 15 | PL | |
- | 16 | MI | |
* luo | 17 | MU | |
/ | 18 | DI | |
| | | |
输入:由符合和不符合所规定的单词类别结构的各类单词组成的源程序文件..
输出:把所识别出的每一单词均按形如CLASS;VALUE的二元式形式输出;并将结果放到某个文件中..对于标识符和无符号常数;CLASS字段为相应的类别码的助记符;VALUE字段则是该标识符、常数的具体值;对于关键字和运算符;采用一词一类的编码形式;仅需在二元式的CLASS字段上放置相应单词的类别码的助记符;VALUE字段则为“空”..
三、实现方法与环境
词法分析是编译程序的第一个处理阶段;可以通过两种途径来构造词法分析程序..其一是根据对语言中各类单词的某种描述或定义如BNF;用手工的方式例如可用C语言构造词法分析程序..一般地;可以根据文法或状态转换图构造相应的状态矩阵;该状态矩阵连同控制程序一起便组成了编译器的词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序..构造词法分析程序的另外一种途径是所谓的词法分析程序的自动生成;即首先用正规式对语言中的各类单词符号进行词型描述;并分别指出在识别单词时;词法分析程序所应进行的语义处理工作;然后由一个所谓词法分析程序的构造程序对上述信息进行加工..如美国BELL实验室研制的LEX就是一个被广泛使用的词法分析程序的自动生成工具..
处理过程简述:在一个程序设计语言中;一般都含有若干类单词符号;为此可首先为每类单词建立一张状态转换图;然后将这些状态转换图合并成一张统一的状态图;即得到了一个有限自动机;再进行必要的确定化和状态数最小化处理;最后添加当进行状态转移时所需执行的语义动作;就可以据此构造词法分析程序了..
treatment是什么意思为了使词法分析程序结构比较清晰;且尽量避免某些枝节问题的纠缠;我们假定要编译的语言中;全部关键字都是保留字;程序员不得将它们作为源程序中的标识符;在源程序的输入文本中;关键字、标识符、无符号常数之间;若未出现关系和算术运算符以及赋值符;则至少须用一个空白字符加以分隔..作了这些限制以后;就可以把关键字和标识符的识别统一进行处理..即每当开始识别一个单词时;若扫视到的第一个字符为字母;则把后续输入的字母或数字字符依次进行拼接;直至扫视到非字母、数字字符为止;以期获得一个尽可能长的字母数字字符串;然后以此字符串查所谓保留字表此保留字表要事先造好;若查到此字符串;则取出相应的类别码;反之;则表明该字符串应为一标识符..
采用上述策略后;针对表I中的部分单词可以参考教材P80的图3-22见图1
图1 识别表I所列语言中的部分单词的DFA及相关的语义过程
图1中所出现的语义变量及语义函数的含义和功能说明如下:
函数GETCHAR:每调用一次;就把扫描指示器当前所指示的源程序字符送入字符变量ch;然后把扫描指示器前推一个字符位置..
字符数组TOKEN:用来依次存放一个单词词文中的各个字符..
函数CAT:每调用一次;就把当前ch中的字符拼接于TOKEN中所存字符串的右边..
函数LOOKUP:每调用一次;就以TOKEN中的字符串查保留字表;若查到;就将相应关键字的类别码赋给整型变量c;否则将c置为零..
函数RETRACT:每调用一次;就把扫描指示器回退一个字符位置即退回多读的那个字符..
acquire的用法函数OUT:一般仅在进入终态时调用此函数;调用的形式为OUTc;VAL..其中;实参c为相应单词的类别码助记符;实参VAL为TOKEN即词文或为空串..函数OUT的功能是;在送出一个单词的内部表示之后;返回到调用该词法分析程序的那个程序..
总的来说;开发一种新语言时;由于它的单词符号在不停地修改;采用LEX等工具生成的词法分析程序比较易于修改和维护..一旦一种语言确定了;则采用手工编写词法分析程序效率更高..
四.源程序
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
#define ID 6
#define INT 7
#define LT 8
#define LE 9
#define EQ 10
#define NE 11
#define GT 12
#define GE 13
#define IS 14
#define PL 15
#define MI 16
#define MU 17
#define DI 18
#define MAX_KEY_NUMBER 20//关键字的数量
#define KEY_WORD_END "waiting for your expanding" //关键字结束标记
完了的英文
char *KeyWordTableMAX_KEY_NUMBER={"begin";"end"; "if"; "then"; "el"; KEY_WORD_END};
char TOKEN20="";
char ch=' ';//用于存储带判断的字符
int row=1;//row标识错误在第几行
#define DIGIT 1
#define POINT 2
#define OTHER 3
#define POWER 4deposits
titanic什么意思#define PLUS 5
fancl卸妆油怎么用
#define MINUS 6
#define UCON 7 //假设无符号常量的类数是7
#define ClassOther 200
#define EndState -1
int index=0;//保存已读的字符串的索引
int w;n;p;e;d;
int Class; //用于表示类的词
int ICON;
float FCON;