保留字与关键字的区别

版权声明:自由转载-非商用-非衍生-保持署名 https://blog.csdn.net/mgsweet/article/details/78995684

前言

之前在编译原理的大实验中被问到了相应的问题,查阅网上的资料,大多都没有说清两者的区别,更多的是将两者混为一谈。虽然,在高级语言上编写代码时,我们可以将两者视为一类东西,因为在这个层面我们根本无须区分两者的区别,我们只需要知道,嗯,它们都是预先有定义的,例如关键字if、then或是保留字int、bool,我们都不能将它们设为我们的变量名字(id),不然编译器会报错。而到了编译器编写制作层面,两者的区分就变得相当重要了,当时做实验时没弄懂,今天复习看到龙书的定义,结合自己的实验经历,有了另外一番见解。

龙书定义

由于手头只有影印版,所以大家将就看看截图

这里写图片描述

结合实验Rose的个人看法

实验的内容是根据一个给定的 EBNF 构造一个简单的编译器,简单通过 jflex 和 java cup 结合实现简单的词法分析、语法分析、语义分析功能。具体实验手册与 EBNF 定义可以参考 实验手册(该实验手册中的保留字和关键字的定义和龙书刚好相反)。

实验手册中定义的 EBNF 是这样的:
这里写图片描述
这里写图片描述
这里写图片描述

这里通过观测可以看到,在 EBNF 中,关键字,如 if,then,else 等被明确定义了,而语言描述中所说的 INTEGER 这一类保留字并无定义,根据龙书所说,每个关键字都要建立单独的状态转换图,而保留字则是在初始化时才填入符号表的,这就是他们最大的区别。

在设计编译器时,体现就体现在,关键字的token是单独一类,而保留字是被视为 id 类token返回的,以上是个人的一点看法。

猜你喜欢

转载自blog.csdn.net/mgsweet/article/details/78995684