- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在研究扫描仪生成器。发电机已经工作正常。但是当使用字符类时,算法会变得非常慢。
扫描仪生成器为 UTF8 编码文件生成扫描仪。应支持完整范围的字符(0x000000 到 0x10ffff)。
如果我使用大字符集,例如任何运算符“.”或 unicode 属性 {L},nfa(以及 dfa)包含很多状态(> 10000)。因此,将 nfa 转换为 dfa 并创建最小 dfa 需要很长时间(即使输出最小 dfa 仅包含几个状态)。
这是我当前创建 nfa 字符集部分的实现。
void CreateNfaPart(int startStateIndex, int endStateIndex, Set<int> characters)
{
transitions[startStateIndex] = CreateEmptyTransitionsArray();
foreach (int character in characters) {
// get the utf8 encoded bytes for the character
byte[] encoded = EncodingHelper.EncodeCharacter(character);
int tStartStateIndex = startStateIndex;
for (int i = 0; i < encoded.Length - 1; i++) {
int tEndStateIndex = transitions[tStartStateIndex][encoded[i]];
if (tEndStateIndex == -1) {
tEndStateIndex = CreateState();
transitions[tEndStateIndex] = CreateEmptyTransitionsArray();
}
transitions[tStartStateIndex][encoded[i]] = tEndStateIndex;
tStartStateIndex = tEndStateIndex;
}
transitions[tStartStateIndex][encoded[encoded.Length - 1]] = endStateIndex;
}
有谁知道如何更有效地实现该功能以仅创建必要的状态?
编辑:
更具体地说,我需要一个像这样的函数:
List<Set<byte>[]> Convert(Set<int> characters)
{
???????
}
将字符 (int) 转换为 UTF8 编码 byte[] 的辅助函数定义为:
byte[] EncodeCharacter(int character)
{ ... }
最佳答案
有很多方法可以处理它。它们都归结为在数据结构中一次处理字符集,而不是枚举整个字母表。这也是您如何在合理的内存量中为 Unicode 制作扫描仪。
关于如何表示和处理字符集,您有多种选择。我目前正在使用一种解决方案,该解决方案保留边界条件和相应目标状态的有序列表。与必须在每个节点扫描整个字母表相比,您可以更快地处理这些列表上的操作。事实上,它足够快,可以以可接受的速度在 Python 中运行。
关于regex - 将字符集转换为 nfa/dfa 的高效算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3538547/
我在 http://lambda-the-ultimate.org/node/2064 看到了“Glushkov NFA”这个词.搜索引擎正在返回对使用 glushkov nfa 的文章的引用,但没有
这有什么证据吗?我们怎么知道当前NFA有最小量? 最佳答案 相对于DFA minimization ,其中存在有效的方法不仅可以根据描述给定常规语言的状态数确定最小 DFA 的大小,而且可以实际计算最
给定两个不确定的有限自动机 M1 和 M2,是否有一个有效的算法来确定 M1 接受的语言是否是M2 接受的语言? 最佳答案 除非 P=NP,否则不会。如果你有这样的算法,你可以很容易地确定两个 NFA
当您阅读诸如 Regex: NFA and Thompson's algorithm 之类的帖子时一切看起来都相当简单,直到您意识到在现实生活中您不仅需要像“7”或“b”这样的直接字符,而且还需要:
我正在寻找将正则表达式转换为 NFA 的方法。我知道我们需要将正则表达式转换为解析树,然后将其转换为 NFA。我正在使用 java 脚本。有没有js工具可以直接根据给定的正则表达式生成解析树? 此外,
我正在将一组给定的正则表达式转换为单个 NFA,但我遇到了一些问题。我应该如何转换正则表达式,例如“ab.*c”(表示匹配一个“a”、一个“b”、任意数量的字符,然后是一个“c”)? 我的最终目标是将
我正在尝试开发一个模拟程序,在 Java 中执行一个非确定性有限自动机。第一个命令行参数是定义机器的文本文件。第二个参数是输入字符串。如果它接受该字符串,它会打印到标准输出“accept”,后跟一个它
Python 中是否有任何模块可以将正则表达式转换为相应的 NFA,还是我必须从头开始构建代码(通过将正则表达式从中缀转换为后缀,然后实现 Thompson's Algorithm 以获得相应的 NF
在我的词法分析器生成器中,我使用 McNaughton 和 Yamada 算法构建 NFA,其属性之一是从 I 到 J,在 J 位置用 char 标记。 因此,NFA 的每个节点都可以简单地表示为下一
我知道将正则表达式转换为 NFA,有一个算法。 但我想知道是否有一种算法可以将 NFA 转换为正则表达式。 如果有,它是什么? 如果没有,我还想知道是否所有 NFA 都可以转换为正则表达式。 是否存在
从正则表达式创建 NFA 时,我遇到了“描述每个步骤”的问题。问题如下: 将以下正则表达式转换为非确定性有限状态自动机 (NFA),清楚地描述您使用的算法的步骤: (b|a)*b(a|b) 我已经制作
我不知道这个问题是否适合问,但我绝对觉得应该问。当然,我确实在互联网和 StackOverflow 本身上看到了很多很好且内容丰富的问题、文章。但我发现所有问题或文章都遵循特定的规则或模式来解释该
我已经使用二维数组为 DFA 创建了转换表。例如,存储 10 个状态和两个转换。 transition = new int[10][2]; 但是,对于 NFA 来说,我们还有许多可能的过渡要做。下面的
是否有一个好的库可以将正则表达式转换成NFA?我看到很多关于这个主题的学术论文,它们很有帮助,但在工作代码方面却不多。 我的问题部分是出于好奇,部分是由于实际需要在我正在处理的生产系统上加速正则表达式
我在这个网站上发现了同样的问题,答案是PDF describing how to convert an NFA to a regex .但这不起作用,因为此方法有一些条件: 有从初始状态到所有其他状态
我制作了由正则表达式 3d 数组构成的 NFA,例如 (01*) 表达式。我明白了: [[FROM,TO,TRANSITION]] [['q0', 'q1', '0'], ['q1', 'q2
我正在尝试解决有关 NFA 的问题。指令如下:字母{a, b, c}。 • L1 是最后一个字符与倒数第五个字符相同的所有字符串。例如,应该接受字符串 aaacbacbca,因为倒数第五个字符和最后一
众所周知,如何从常规语言的 NFA 到最小 DFA。然而,DFA 的状态数量可能呈指数增长。 我需要的是一种减少 NFA 的方法,再次给出 NFA,但状态数较小。 T.i.我不需要结果是确定性的,但我
我正在尝试编写一个程序来接受描述正则表达式的字符串。例如: 10(0U1)* 其中 U 是联合运算符,* 是 Kleene 星号(我们也看到隐含的串联)。 我考虑过标记字符串的原子并根据运算符和操作数
我目前正在使用 python 的 re 模块来搜索和捕获组。我列出了一些正则表达式,我必须编译这些正则表达式并将其与导致性能问题的大型数据集 进行匹配。 示例: REGEXES = [ '^N
我是一名优秀的程序员,十分优秀!