编译原理(龙书)学习之路(1)

初学编译原理,刚刚看完第三章。打算开始记录书上一些写得不太明白的部分,供大家和自己参考。

1、followpos计算问题

在第三章末尾,有一节介绍了由正则表达式直接生成DFA的方法。需要三个辅助函数nullable,firstpos,lastpos和followpos。其中前三个都很好计算也很好理解,而followpos虽然通过例子知道了如何计算,但算法中对它的原理介绍却十分含糊。书上是这么说的:

  1. 如果n是一个cat结点,且其左右子节点分别为c1、c2,那么对于lastpos(c1)中的每个位置i,firstpos(c2)中的所有位置都在followpos(i)中。
  2. 如果n是star结点,并且i是lastpos(n)中的一个位置,那么firstpos(n)中的所有位置都在followpos(i)中。

其实书里有很多这种定义,看了半天都不理解在说什么。我们直接看实例。
编译原理(龙书)学习之路(1)_第1张图片

首先根据前面的例子可以知道,followpos(i)其实就是i后面可以接的结点编号。第一种情况,n是cat结点,以first={1,2,3},last={3}的结点为例,它所代表的表达式可以以1,2或3开头(其中以3开头是在左子结点为空的情况下),以3结尾。看它的左子节点*,它的lastpos后面接的就是右子节点a的firstpos,很好理解。第二种情况,n是star,那么它代表的表达式就是(…)*,即括号里内容任意循环,即last后紧接fist,答案就出来了。

2、根据正则表达式构建DFA的算法

算法描述依然看不懂,只记住了两个定义:Dstates和Dtran,直接看给的例子。

编译原理(龙书)学习之路(1)_第2张图片

给得很清晰,但不明白原理的话很容易忘。(大白话说算法预警)

首先,Dstates是状态集合,根结点肯定得先进来,因为它的fistpos和lastpos表明了整个正则表达式的开始和结尾。首先得到了A,需要解释的来了,就是Dtran[A,a]的计算方法。Dtran是转换函数,意思就是A经过a到达的状态是谁,同理Dtran[A,b]就是A经过边b到达的状态,一看到“经过”就用followpos,图就能画出来了。但这里有个点很有意思,就是为什么它等于代表a的编号(1和3)的followpos?

感觉好像天经地义,但仔细想想,a是转换条件,而1234编号代表状态!
答案作者已经给出了,就在前面几页:

编译原理(龙书)学习之路(1)_第3张图片

编译原理(龙书)学习之路(1)_第4张图片

显然重要状态的位置就对应抽象语法树中各个运算分量的编号!

在这里记录的原因就是希望自己和大家思考一下原理,把这个算法和之前的内容联系起来。明天开始看语法分析了,将还会记录一些未解释的算法。

你可能感兴趣的:(算法,龙书)