1 概述贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。非贪婪模式只被部分NFA引擎所支持。属于贪婪模式的量词,也叫做匹配优先量词,包括:“{m,n}”、“{m,}”、“?”、“*...
分类:
其他好文 时间:
2015-04-23 23:01:32
阅读次数:
168
一个词法分析器生成程序: regex(BinTree) -> NFA -> DFA
分类:
其他好文 时间:
2015-04-19 12:59:10
阅读次数:
240
任务:
源文件->记号流
方法:
1. 手工构造
2. 自动构造
手工构造:
实现标识符与关键字通过转移图完成.
然后再通过hashtable特判即可.
自动构造:
Thompson算法将正则表达式转化为NFA
五种情况,两种基本的直接构造,三种复合的递归构造
子集构造算法 NFA-DFA
stack = []//遍历的结构
Q = []//所以的D...
分类:
其他好文 时间:
2015-04-18 11:33:41
阅读次数:
170
使用NFA来构造正则表达式,详细解释可以参见Algorithm 4th。书中代码为JAVA版本。书中内容前后耦合度较大,遂用cpp简单的实现了一下(基于vector的存储方式主要是我发现std::stack不能访问中间的元素,性能上的优化我就忽略掉了)。代码接受“(A*C|AB)V.*”等类似的正则...
分类:
其他好文 时间:
2015-04-15 13:00:36
阅读次数:
165
正则表达式是一种不确定有限自动机。NFA。
在书写正则表达式时应尽量减少回溯来提高正则表达式的效率。
一. 理解元字符
根据功能,元字符可分为两种类型:匹配位置的元字符和匹配字符的元字符。
1. 匹配位置的元字符
包括:^、$和\b三个字符。
^(脱字符号,在文章插入字时使用)
$(美元符号)。
他们分别表示行的开始和末尾。
^string 正则表达式匹配以str...
分类:
其他好文 时间:
2015-04-14 16:41:38
阅读次数:
141
import java.util.ArrayList;import java.util.Map;import java.util.TreeMap;class Edge{ private int u, v; private char key; public Edge(int u, i...
分类:
编程语言 时间:
2015-04-13 01:35:40
阅读次数:
1945
最近尝试写一下NFA到DFA转换的函数,用C++,但是想到集合的表示比较麻烦,一些高级的容器也还没学到,因此自己先写一个简单的collection类,1.0版本。 能实现的功能有:存储数字集合;能进行集合间比较O(N)及加O(M+N)减法O(N);能向集合中添加元素O(N)或删除元素O(N);...
分类:
其他好文 时间:
2015-03-31 10:34:49
阅读次数:
162
上回我们介绍了两种有穷自动机模型——确定性有穷自动机DFA和非确定性有穷自动机,以及从正则表达式经过NFA最终转化为DFA的算法。有些同学表示还是难以理解NFA到底怎么转化为DFA。所以本篇开头时我想再多举一个例子,看看NFA转化为DFA之后到底是什么样。首先我们看下面的NFA,它是从一组词法分析所...
分类:
其他好文 时间:
2015-03-01 11:46:37
阅读次数:
242
正则表达式是对字符串操作的逻辑公式,表达了对字符串的一种过滤逻辑。 相对于.NET和Perl,JS对正则表达式的支持相当朴素,或者说JS的正则表达式是perl正则表达式的一个子集。一、正则表达式引擎:主流正则引擎分为3类:1、DFA(text-directed) 2、NFA(rege-direc.....
分类:
编程语言 时间:
2015-02-27 00:15:55
阅读次数:
506
算法1:根据Regex构建NFA - McNaughton-Yamada-Thompson算法输入:字母表∑上的一个正则表达式r。输出:一个接受L(r)的NFA N。方法:首先对r进行语法分析,分解出组成它的子表达式。构建NFA的规则分为基本规则和归纳规则。基本规则:处理不包含运算符的子表达式。 ....
分类:
其他好文 时间:
2015-01-11 06:11:58
阅读次数:
391