编译原理(龙书)学习之路(1)
来源:互联网 发布:win32 网络编程 编辑:程序博客网 时间:2024/06/15 03:57
初学编译原理,刚刚看完第三章。打算开始记录书上一些写得不太明白的部分,供大家和自己参考。
1、followpos计算问题
在第三章末尾,有一节介绍了由正则表达式直接生成DFA的方法。需要三个辅助函数nullable,firstpos,lastpos和followpos。其中前三个都很好计算也很好理解,而followpos虽然通过例子知道了如何计算,但算法中对它的原理介绍却十分含糊。书上是这么说的:
- 如果n是一个cat结点,且其左右子节点分别为c1、c2,那么对于lastpos(c1)中的每个位置i,firstpos(c2)中的所有位置都在followpos(i)中。
- 如果n是star结点,并且i是lastpos(n)中的一个位置,那么firstpos(n)中的所有位置都在followpos(i)中。
其实书里有很多这种定义,看了半天都不理解在说什么。我们直接看实例。
首先根据前面的例子可以知道,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,直接看给的例子。
给得很清晰,但不明白原理的话很容易忘。(大白话说算法预警)
首先,Dstates是状态集合,根结点肯定得先进来,因为它的fistpos和lastpos表明了整个正则表达式的开始和结尾。首先得到了A,需要解释的来了,就是Dtran[A,a]的计算方法。Dtran是转换函数,意思就是A经过a到达的状态是谁,同理Dtran[A,b]就是A经过边b到达的状态,一看到“经过”就用followpos,图就能画出来了。但这里有个点很有意思,就是为什么它等于代表a的编号(1和3)的followpos?
感觉好像天经地义,但仔细想想,a是转换条件,而1234编号代表状态!
答案作者已经给出了,就在前面几页:
显然重要状态的位置就对应抽象语法树中各个运算分量的编号!
在这里记录的原因就是希望自己和大家思考一下原理,把这个算法和之前的内容联系起来。明天开始看语法分析了,将还会记录一些未解释的算法。
- 编译原理(龙书)学习之路(1)
- 编译原理学习(1)
- 《编译原理》学习总结(1)
- 编译原理学习(一)
- 编译原理学习之语法分析
- 编译原理学习(一)--编译以及编译过程
- 编译原理(1)
- 编译原理(1)
- 编译原理学习笔记(四)预测分析器(1)
- 编译原理学习周入门教程--(1)什么是编译程序?
- 编译原理学习(三)--语法分析树
- 【编译原理】TINY编译器学习(一)
- 编译原理学习笔记(一)体系结构
- 编译原理学习(一)词法分析器
- 编译原理-学习框架(精品)
- 软考之路(五)---编译原理 概念篇
- 软考之路(五)---编译原理 概念篇
- 编译原理之文法(一)
- python练习题!
- TCP拥塞控制详解
- 本地创建git生产秘钥流程推一个项目到码云
- 二进制字符串转换到Ascll字符串
- 文章标题:Android常见控件TextView的使用方法
- 编译原理(龙书)学习之路(1)
- Linux中的vim
- Oracle PL/SQL开发基础(第五弹:视图)
- SpringMVC
- c语言算法—01背包问题(基础型)
- HDU 3294 Girls' research【最长回文子串】
- kali进入不了界面之后。。。
- SSL通信基本过程
- Linux线程浅析[线程的同步和互斥之线程互斥锁]