编译原理之语法分析(预测分析法)

  • Post author:
  • Post category:其他




自顶向下



上下文无关文法

在这里插入图片描述
CFG本质上就是产生式的集合,规定了一个非终结符的形式,规定了它可以长什么样子,比如下图的E→EAE,就表明了E这个语法结构(非终结符),他的基本形式应该是 E 搭配 A 搭配 E。

在这里插入图片描述

推导:根据单词序列,从开始符号选择合适的产生式进行替换,比如:输入的单词串时 num – num + num,我们的产生式就是 E→E+E | E-E | digit,根据输入的单词串我们可以知道我们应该先选择第一个产生式,再选择第二个产生式,最后选择第三个产生式(实际情况不能这么做,人眼可以),总之,推导就是用产生式进行替换。

在这里插入图片描述



语法树

对应着推导过程

在这里插入图片描述



NFA→CFG

在这里插入图片描述

在这里插入图片描述



预测分析法

预测分析法就是从开始符号开始,依次选择产生式知道匹配到单词串,问题就是怎么选择产生式,每次都要匹配太过麻烦,而且,如果产生式右部的第一个单词也是非终结符会需要不停的向下搜索,直至是终结符,这十分麻烦,所以,我们选择用first集和follow集进行判定.

first集,顾名思义,就是这个非终结符通过一系列产生式(包括继续递归的产生式)能够产生的第一个终结符,所以,根据first集很容易进行产生式的选择,follow集,顾名思义,就是找到该非终结符后面会直接跟随的符号,比如A→Bc,B的follow集就是{c},follow集的作用就是确定ε产生式,选择了这个产生式就意味着这个推导到这里就结束了,结束在类似于非终结符的地方

所以,我们可以知道,我们根据first集和follo集合判断产生式的选择

预测分析表的使用

在这里插入图片描述
在这里插入图片描述

预测分析表的构造

根据first和follow



改写CFG



原因

我们可以看到,如果采用预测分析法,对于文法的使用有很多要求,比如,如果有两个产生式的first集有交集,那么在产生式的选择上就会有多种选择,如果,A→Ac,这样就会导致无限度的递归,也要消除



消除二义性

只能依靠按照语法的本质更改文法,没有特殊算法。



消除左递归

在这里插入图片描述

在这里插入图片描述



消除左公因子

在这里插入图片描述



消除空产生式

在这里插入图片描述
这里面注意回溯



消除回路

在这里插入图片描述



版权声明:本文为ugnbucbjj原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。