语法分析简介
- 在仅看到右部的前
个词法单元时就必须预测要使用哪条产生式。
- 看到某个产生式的整个右部对应的词法单元之后再决定。
- 对所有“由左而右”扫描原始码的分析器而言,
分析器可以在最短的时间内侦测到文法错误。
语法分析流程与分析表
首先,在任意时刻,
一个简单的示例
下面是一个简单的
下图从左到右展示了一个简单的分析流程,其中已生成的语法分析树上边缘(即堆栈,左边为栈底,右边为栈顶)用红框标出,剩余的输入用蓝框标出。
可以看出,推导过程是
这就是我们前面提到过的反向最右推导。
观察这一推导过程,我们还发现推导的两大基本操作为移入输入符号与按产生式归约。当栈中仅剩开始符号且输入结束(遇到
- 何时移入?何时规约?
- 规约时按哪一产生式规约?
语法分析表
为了解决上述问题,我们引入了语法分析表。这是一个二维表,其中行表示状态,列表示终结符与非终结符。表中的每个元素是一个动作,控制了语法分析器的移入、规约、状态转移和接受等操作。
下面就是一个语法分析表的例子
其中,
由此,语法分析的初始状态从
到这里,似乎我们的两个问题就解决了。但是,我们又引出了一个新的问题:如何构建这个语法分析表?
句柄与句柄识别有穷状态自动机
在构建语法分析表之前,我们需要引入一个重要的概念:句柄。句柄是一个右部的前缀,可以在规约时被替换为左部。
句柄的定义
在输入串的 (唯一) 反向最右推导中, 如果下一步是逆用产生式
根据我们上文的伪代码,我们可以发现句柄总是出现在栈顶。因此,下面我们以此为目标来设计语法分析表。这就需要利用句柄识别有穷状态自动机
句柄识别有穷状态自动机
下面是一个句柄识别有穷状态自动机的图示
这一状态机比较直观,但仔细看会发现状态机中的产生式中间被加了一个点。这其实是
文法
此外,我们还会发现状态机中有一个非终结符
句柄识别有穷状态自动机构造
首先,我们从
因此
接下来,我们要找出
继续按此方法构造,我们可以得到整个句柄识别有穷状态自动机。最后,我们看到图中被红色标出的状态,这些状态是我们的规约状态。这一状态的特点是项集中存在一个项,其点在最右边,即可以进行规约操作。也就是说:我们找到了句柄,并且它一定在栈顶。那么下面我们把它转换为语法分析表即可。
由自动机构造语法分析表
那么,显然我们可以通过句柄识别有穷状态自动机来构造语法分析表。具体的构造法则如下:
- 如果由状态
转为 ,且转移条件为 为终结符,那么 为 。 - 如果由状态
转为 ,且转移条件为 为非终结符,那么 为 。 - 如果
中存在 且 ,那么对于所有 , 为 。(这里 是 的编号, 是所有终结符) - 如果
中存在 ,那么 为 。
如果以上规则中没有冲突,那么这一文法是