摘要:
今天撸了一个晚上终于完成了, 感觉还是要说一下体会吧... 其实之前课程本身已经提供了相关的算法伪代码, 那么在思路上应该没有问题, 那么最后我却用了一个晚上才完成最后的hopcroft 算法呢... 其实难点在于数据结构的运用, 这边图论算法熟悉的话应该会感觉轻松一些...(不幸的是我还没有系统的 阅读全文
摘要:
今天AI考的还算顺利, 没有不会做的, 目前也没发现错的, 在这里顺便也谈谈AI吧, 我之所以不选AI, 总感觉理论性太强, 学起来不来劲, 经历了大二这一个学期的理论学习, 这AI简直是神课啊, 真是怕了, 大三到英国肯定不选AI... 其实就算在今天下午在考试我也是一直惦记着我的词法生成器... 阅读全文
摘要:
这两天时间不多啊, 明天下午要考AI了, 没什么时间写这个, 今天抽空把昨天的留下的作业(用C写不下去的那个...)转移到了java上, 只完成了Thompson那一部分, 之后的两部分估计要等考试完再继续了, 因为代码还没写完就不扔github上了... 直接贴代码了 : 包结构如图... Ent 阅读全文
摘要:
最后是几个个小作业 : 给定如下的正则表达式 (a|b)((c|d)*),请完成如下练习: (1)使用Thompson算法,将该正则表达式转换成非确定状态有限自动机(NFA); (2)使用子集构造算法,将该上述的非确定有限状态自动机(NFA)转换成确定状态有限自动机(DFA); (3)使用Hopcr 阅读全文
摘要:
到上一篇博客为止, 词法分析器生成器内部的整个工作流程就全部结束了, 最后再提一下最终生成的DFA在具体代码上的的表现形式... 所谓的转移表, 说白了就是二位矩阵, 这是表驱动算法的代码实现... 其实这段代码中有两个重要的思想: 1. 关于字符匹配规则的一个惯例 (但实际情况也依据编程语言不同而 阅读全文
摘要:
最后是最小化算法, 它的目的其实在于通过合并的方式, 减少状态数, 然后使得最终生成的代码中用来表示状态转移的数据结构尽量小, 以此节约空间和时间. DFA中运用最广泛的算法是hopcroft算法, 接下来就是对该算法的简要介绍... 这个算法的第一步是将所有的状态(也就是代码中的nodes) 划分 阅读全文
摘要:
接下来的步骤就是从NFA转换为DFA...首先要思考的第一个问题是为什么要从NFA转换到DFA, 那么我们可以先来看看他们的区别, 通俗来讲, NFA就是说给定一个输入的字符, 可以有多种状态可以选择, 而DFA的话, 就只有一种状态可以选择... 由这里就可以发现, 其实DFA在代码的实现难度上是 阅读全文
摘要:
之前我们说词法分析器的自动生成器能够将声明式的规范(在这里我们用的是正则表达式)转化为自动机(DFA, NFA), 所以现在我们来看看在生成器的内部到底是如何工作的.这是对于该过程的概述 : Thompson算法 : 从re到NFA 这个算法总结起来就两点 : 1. 对于基本的正则表达式直接构造 2 阅读全文
摘要:
第二种词法分析的方式当然是词法分析器的自动生成器. 如lex, jlex 等等. 那么如何来让生成器知道我们想要生成的Token呢 ? 这就涉及到统一的声明式规范的问题, 换句话讲, 你将按照生成器的形式要求将声明式的规范交给生成器, 那么它就能够对其进行识别. 所以我们只需要完成声明式的规范即可完 阅读全文
摘要:
从整体上看, 词法分析是编译器前段的第一个部分, 它的任务是完成从字符流到记号流的转换. 字符流 : 其实就是源代码. 那么什么是记号流, 记号其实是一种数据结构, 方便编译器后期对代码进行有效处理而产生的, 比如在java 中, 这就是记号(Token). 实现方案至少有两种 1. 手工编码 2. 阅读全文