我目前正在研究扫描仪生成器。生成器已经可以正常工作了。但是当使用字符类时,算法变得非常慢。
扫描仪生成器为 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)
{ ... }