05 2015 档案
摘要:(正则引擎已完成,Github)最小化 DFA 是引擎中另外一个略繁琐的点(第一个是构建语法树)。基本思路是,先对 DFA 进行重命名,然后引入一个拒绝态 0,定义所有状态经过非接受字符转到状态 0,0 接受所有字符转换为自身。也就是说我们先建立一个转换表,然后把第一行填写为:stateabcdef...
阅读全文
摘要:(正则引擎已完成,Github)我们上一节已经将 NFA 构建出来了,我们的 NFAState 对象的结构实际上是这样的:NFAState { private Set directTable; private Map> transitionMap; private int id;}...
阅读全文
摘要:(正则引擎已完成,Github) 语法树如何实现对于之后步骤的繁琐程度有着举足轻重的影响。因为我们已经有了一棵简单优雅的语法树,所以我们的 NFA 很容易就可以构建出来。下面来回顾一下我们拥有的节点种类: 分支节点:Concat, Or, Many 叶子节点:Closure, Char 以下是转换的
阅读全文
摘要:(正则引擎已完成,Github)语法树的构建这里分为三步:1. 补全正则表达式的省略部分(主要是省略的 concat 和 or 连接符)并翻译七个集合字 '\w', '\W', '\s', '\S', '\d', '\D' 和 '.';2. 转换为逆波兰表达式;3. 转换为语法树;这里以正则表达式 ...
阅读全文
摘要:(正则引擎已完成,Github)试着用 JAVA 写个正则引擎。要求:1. 纯 DFA,无需支持 捕获组 和 断言;2. 时间复杂度 O(n);3. 支持 ASCII 字符集,支持基本语法:支持'\w', '\W', '\s', '\S', '\d', '\D' 和 '.' 七个集合及其他单字符转义...
阅读全文
摘要:题目见算法导论 4.1-5,这篇文章作为笔记,不阐述原理。import random__author__ = 'Administrator'LENGTH = 500base = []for i in range(0, LENGTH * 2): base.append(random.randin...
阅读全文