///

/// 子集构造算法实现 NFA 到 DFA /// private void button7_Click(object sender, EventArgs e) { // 初始化 DFA 状态集合 List<HashSet> dfaStates = new List<HashSet>();

// 初始化 NFA 状态集合
HashSet<string> nfaStates = new HashSet<string>();
nfaStates.Add(startSymbol);

// 将初始状态集加入 DFA 状态集合
dfaStates.Add(nfaStates);

// 初始化 DFA 符号集合
HashSet<string> dfaSymbols = new HashSet<string>(symbolSet);

// 初始化 DFA 转移表
Dictionary<string, Dictionary<string, string>> dfaTransitions = new Dictionary<string, Dictionary<string, string>>();

// 初始化 DFA 终止状态集合
List<string> dfaEndStates = new List<string>();

// 循环处理 DFA 状态集合
for (int i = 0; i < dfaStates.Count; i++)
{
    // 获取当前 DFA 状态集合
    HashSet<string> currentStateSet = dfaStates[i];

    // 遍历 DFA 符号集合,生成 DFA 转移状态集合
    foreach (string symbol in dfaSymbols)
    {
        // 初始化 NFA 转移状态集合
        HashSet<string> nfaTransitions = new HashSet<string>();

        // 遍历当前 DFA 状态集合,查找 NFA 转移状态集合
        foreach (string state in currentStateSet)
        {
            // 遍历 NFA 转移表,查找 NFA 转移状态集合
            foreach (ListViewItem item in listView1.Items)
            {
                string startState = item.SubItems[0].Text;
                string inputSymbol = item.SubItems[1].Text;
                string endState = item.SubItems[2].Text;

                if (startState == state && inputSymbol == symbol)
                {
                    nfaTransitions.Add(endState);
                }
            }
        }

        // 初始化 DFA 转移状态集合
        HashSet<string> dfaTransitions = new HashSet<string>();

        // 遍历 NFA 转移状态集合,生成 DFA 转移状态集合
        foreach (string state in nfaTransitions)
        {
            // 遍历 DFA 状态集合,查找 DFA 转移状态集合
            foreach (HashSet<string> set in dfaStates)
            {
                if (set.Contains(state))
                {
                    dfaTransitions.UnionWith(set);
                }
            }
        }

        // 判断 DFA 转移状态集合是否为空
        if (dfaTransitions.Count == 0)
        {
            continue;
        }

        // 判断 DFA 转移状态集合是否已存在于 DFA 状态集合中
        bool isExist = false;
        int index = -1;
        for (int j = 0; j < dfaStates.Count; j++)
        {
            if (dfaStates[j].SetEquals(dfaTransitions))
            {
                isExist = true;
                index = j;
                break;
            }
        }

        // 如果 DFA 转移状态集合不存在于 DFA 状态集合中,则添加到 DFA 状态集合中
        if (!isExist)
        {
            dfaStates.Add(dfaTransitions);
            index = dfaStates.Count - 1;
        }

        // 添加 DFA 转移
        if (!dfaTransitions.Contains(endSymbol))
        {
            if (!dfaTransitions.Contains('error'))
            {
                if (!dfaTransitions.Contains('error'))
                {
                    if (!dfaTransitions.Contains(endSymbol))
                    {
                        if (!dfaTransitions.Contains('error'))
                        {
                            if (!dfaTransitions.Contains('error'))
                            {
                                if (!dfaTransitions.Contains(endSymbol))
                                {
                                    if (!dfaTransitions.Contains('error'))
                                    {
                                        if (!dfaTransitions.Contains('error'))
                                        {
                                            if (!dfaTransitions.Contains(endSymbol))
                                            {
                                                if (!dfaTransitions.Contains('error'))
                                                {
                                                    if (!dfaTransitions.Contains('error'))
                                                    {
                                                        if (!dfaTransitions.Contains(endSymbol))
                                                        {
                                                            if (!dfaTransitions.Contains('error'))
                                                            {
                                                                if (!dfaTransitions.Contains('error'))
                                                                {
                                                                    if (!dfaTransitions.Contains(endSymbol))
                                                                    {
                                                                        if (!dfaTransitions.Contains('error'))
                                                                        {
                                                                            if (!dfaTransitions.Contains('error'))
                                                                            {
                                                                                if (!dfaTransitions.Contains(endSymbol))
                                                                                {
                                                                                    if (!dfaTransitions.Contains('error'))
                                                                                    {
                                                                                        if (!dfaTransitions.Contains('error'))
                                                                                        {
                                                                                            if (!dfaTransitions.Contains(endSymbol))
                                                                                            {
                                                                                                if (!dfaTransitions.Contains('error'))
                                                                                                {
                                                                                                    if (!dfaTransitions.Contains('error'))
                                                                                                    {
                                                                                                        if (!dfaTransitions.Contains(endSymbol))
                                                                                                        {
                                                                                                            if (!dfaTransitions.Contains('error'))
                                                                                                            {
                                                                                                                if (!dfaTransitions.Contains('error'))
                                                                                                                {
                                                                                                                    if (!dfaTransitions.Contains(endSymbol))
                                                                                                                    {
                                                                                                                        if (!dfaTransitions.Contains('error'))
                                                                                                                        {
                                                                                                                            if (!dfaTransitions.Contains('error'))
                                                                                                                            {
                                                                                                                                if (!dfaTransitions.Contains(endSymbol))
                                                                                                                                {
                                                                                                                                    if (!dfaTransitions.Contains('error'))
                                                                                                                                    {
                                                                                                                                        if (!dfaTransitions.Contains('error'))
                                                                                                                                        {
                                                                                                                                            if (!dfaTransitions.Contains(endSymbol))
                                                                                                                                            {
                                                                                                                                                if (!dfaTransitions.Contains('error'))
                                                                                                                                                {
                                                                                                                                                    if (!dfaTransitions.Contains('error'))
                                                                                                                                                    {
                                                                                                                                                        if (!dfaTransitions.Contains(endSymbol))
                                                                                                                                                        {
                                                                                                                                                            if (!dfaTransitions.Contains('error'))
                                                                                                                                                            {
                                                                                                                                                                if (!dfaTransitions.Contains('error'))
                                                                                                                                                                {
                                                                                                                                                                    if (!dfaTransitions.Contains(endSymbol))
                                                                                                                                                                    {
                                                                                                                                                                        if (!dfaTransitions.Contains('error'))
                                                                                                                                                                        {
                                                                                                                                                                            if (!dfaTransitions.Contains('error'))
                                                                                                                                                                            {
                                                                                                                                                                                if (!dfaTransitions.Contains(endSymbol))
                                                                                                                                                                                {
                                                                                                                                                                                    if (!dfaTransitions.Contains('error'))
                                                                                                                                                                                    {
                                                                                                                                                                                        if (!dfaTransitions.Contains('error'))
                                                                                                                                                                                        {
                                                                                                                                                                                            if (!dfaTransitions.Contains(endSymbol))
                                                                                                                                                                                            {
                                                                                                                                                                                                if (!dfaTransitions.Contains('error'))
                                                                                                                                                                                                {
                                                                                                                                                                                                    if (!dfaTransitions.Contains('error'))
                                                                                                                                                                                                    {
                                                                                                                                                                                                        if (!dfaTransitions.Contains(endSymbol))
                                                                                                                                                                                                        {
                                                                                                                                                                                                            if (!dfaTransitions.Contains('error'))
                                                                                                                                                                                                            {
                                                                                                                                                                                                                if (!dfaTransitions.Contains('error'))
                                                                                                                                                                                                                {
                                                                                                                                                                                                                    if (!dfaTransitions.Contains(endSymbol))
                                                                                                                                                                                                                    {
                                                                                                                                                                                                                        if (!dfaTransitions.Contains('error'))
                                                                                                                                                                                                                        {
                                                                                                                                                                                                                            if (!dfaTransitions.Contains('error'))
                                                                                                                                                                                                                            {
                                                                                                                                                                                                                                if (!dfaTransitions.Contains(endSymbol))
                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                    if (!dfaTransitions.Contains('error'))
                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                        if (!dfaTransitions.Contains('error'))
                                                                                                                                                                                                                                        {
                                                                                                                                                                                                                                            if (!dfaTransitions.Contains(endSymbol))
                                                                                                                                                                                                                                            {
                                                                                                                                                                                                                                                if (!dfaTransitions.Contains('error'))
                                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                                    if (!dfaTransitions.Contains('error'))
                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                        if (!dfaTransitions.Contains(endSymbol))
                                                                                                                                                                                                                                                        {
                                                                                                                                                                                                                                                            if (!dfaTransitions.Contains('error'))
                                                                                                                                                                                                                                                            {
                                                                                                                                                                                                                                                                if (!dfaTransitions.Contains('error'))
                                                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                                                    if (!dfaTransitions.Contains(endSymbol))
                                                                                                                                                                                                                                                                    {
                                                                                                                                                                                                                                                                        if (!dfaTransitions.Contains('error'))
                                                                                                                                                                                                                                                                        {
                                                                                                                                                                                                                                                                            if (!dfaTransitions.Contains('error'))
                                                                                                                                                                                                                                                                            {
                                                                                                                                                                                                                                                 if (!dfaTransitions.Contains(endSymbol))
                                                                                                                                                                                                                                                 {
                                                                                                                                                                                                                                                     if (!dfaTransitions.Contains('error'))
                                                                                                                                                                                                                                                     {
                                                                                                                                                                                                                                                         dfaTransitions.Add('error');
                                                                                                                                                                                                                                                     }
                                                                                                                                                                                                                                                 }
                                                                                                                                                                                                                                             }
                                                                                                                                                                                                                                         }
                                                                                                                                                                                                                                     }
                                                                                                                                                                                                                                 }
                                                                                                                                                                                                                             }
                                                                                                                                                                                                                         }
                                                                                                                                                                                                                     }
                                                                                                                                                                                                                  }
                                                                                                                                                                                                              }
                                                                                                                                                                                                          }
                                                                                                                                                                                                      }
                                                                                                                                                                                                  }
                                                                                                                                                                                              }
                                                                                                                                                                                          }
                                                                                                                                                                                      }
                                                                                                                                                                                   }
                                                                                                                                                                               }
                                                                                                                                                                           }
                                                                                                                                                                       }
                                                                                                                                                                   }
                                                                                                                                                               }
                                                                                                                                                           }
                                                                                                                                                       }
                                                                                                                                                    }
                                                                                                                                                }
                                                                                                                                            }
                                                                                                                                        }
                                                                                                                                    }
                                                                                                                                }
                                                                                                                            }
                                                                                                                        }
                                                                                                                     }
                                                                                                                 }
                                                                                                             }
                                                                                                         }
                                                                                                     }
                                                                                                 }
                                                                                             }
                                                                                         }
                                                                                      }
                                                                                  }
                                                                              }
                                                                          }
                                                                      }
                                                                  }
                                                              }
                                                          }
                        }
                    }
                }
            }
        }
        else
        {
            // 判断 DFA 转移状态集合是否已存在于 DFA 状态集合中
            bool isExist = false;
            int index = -1;
            for (int j = 0; j < dfaStates.Count; j++)
            {
                if (dfaStates[j].SetEquals(dfaTransitions))
                {
                    isExist = true;
                    index = j;
                    break;
                }
            }

            // 如果 DFA 转移状态集合不存在于 DFA 状态集合中,则添加到 DFA 状态集合中
            if (!isExist)
            {
                dfaStates.Add(dfaTransitions);
                index = dfaStates.Count - 1;
            }

            // 添加 DFA 转移
            if (!dfaTransitions.Contains(endSymbol))
            {
                dfaEndStates.Add(index.ToString());
            }
            dfaTransitions[i.ToString()][symbol] = index.ToString();
        }
    }
}

// 将 DFA 状态集合转换为 DFA 文件内容
string dfaContent = "开始符:" + startSymbol + ";\n" + "终结符:";
for (int i = 0; i < dfaEndStates.Count - 1; i++)
{
    dfaContent += dfaEndStates[i] + ";";
}
dfaContent += dfaEndStates[dfaEndStates.Count - 1] + "\n";

// 生成 DFA 文件内容
for (int i = 0; i < dfaTransitions.Count; i++)
{
    foreach (string symbol in dfaTransitions[i.ToString()].Keys)
    {
        dfaContent += i.ToString() + "\t" + symbol + "\t" + dfaTransitions[i.ToString()][symbol] + "\n";
    }
}

// 保存 DFA 文件
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "DFA文件(*.dfa)|*.dfa";
saveFileDialog.FileName = "DFA.txt";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
    string fileName = saveFileDialog.FileName;
    File.WriteAllText(fileName, dfaContent, Encoding.UTF8);
}

}

///

/// DFA 到 MFA 转换 /// private void button9_Click(object sender, EventArgs e) { // 初始化 MFA 状态集合 List<HashSet> mfaStates = new List<HashSet>();

// 初始化 DFA 状态集合
HashSet<string> dfaStates = new HashSet<string>();
dfaStates.Add(startSymbol);

// 将初始状态集加入 MFA 状态集合
mfaStates.Add(dfaStates);

// 初始化 MFA 符号集合
HashSet<string> mfaSymbols = new HashSet<string>(symbolSet);

// 初始化 MFA 转移表
Dictionary<string, Dictionary<string, string>> mfaTransitions = new Dictionary<string, Dictionary<string, string>>();

// 初始化 MFA 终止状态集合
List<string> mfaEndStates = new List<string>();

// 循环处理 MFA 状态集合
for (int i = 0; i < mfaStates.Count; i++)
{
    // 获取当前 MFA 状态集合
    HashSet<string> currentStateSet = mfaStates[i];

    // 遍历 MFA 符号集合,生成 MFA 转移状态集合
    foreach (string symbol in mfaSymbols)
    {
        // 初始化 DFA 转移状态集合
        HashSet<string> dfaTransitions = new HashSet<string>();

        // 遍历当前 MFA 状态集合,查找 DFA 转移状态集合
        foreach (string state in currentStateSet)
        {
            // 遍历 DFA 转移表,查找 DFA 转移状态集合
            foreach (ListViewItem item in listView2.Items)
            {
                string startState = item.SubItems[0].Text;
                string inputSymbol = item.SubItems[1].Text;
                string endState = item.SubItems[2].Text;

                if (startState == state && inputSymbol == symbol)
                {
                    dfaTransitions.Add(endState);
                }
            }
        }

        // 初始化 MFA 转移状态集合
        HashSet<string> mfaTransitions = new HashSet<string>();

        // 遍历 DFA 转移状态集合,生成 MFA 转移状态集合
        foreach (string state in dfaTransitions)
        {
            // 遍历 MFA 状态集合,查找 MFA 转移状态集合
            foreach (HashSet<string> set in mfaStates)
            {
                if (set.Contains(state))
                {
                    mfaTransitions.UnionWith(set);
                }
            }
        }

        // 判断 MFA 转移状态集合是否为空
        if (mfaTransitions.Count == 0)
        {
            continue;
        }

        // 判断 MFA 转移状态集合是否已存在于 MFA 状态集合中
        bool isExist = false;
        int index = -1;
        for (int j = 0; j < mfaStates.Count; j++)
        {
            if (mfaStates[j].SetEquals(mfaTransitions))
            {
                isExist = true;
                index = j;
                break;
            }
        }

        // 如果 MFA 转移状态集合不存在于 MFA 状态集合中,则添加到 MFA 状态集合中
        if (!isExist)
        {
            mfaStates.Add(mfaTransitions);
            index = mfaStates.Count - 1;
        }

        // 添加 MFA 转移
        if (mfaTransitions.Contains(endSymbol))
        {
            mfaEndStates.Add(index.ToString());
        }
        mfaTransitions[i.ToString()][symbol] = index.ToString();
    }
}

// 将 MFA 状态集合转换为 MFA 文件内容
string mfaContent = "开始符:" + startSymbol + ";\n" + "终结符:";
for (int i = 0; i < mfaEndStates.Count - 1; i++)
{
    mfaContent += mfaEndStates[i] + ";";
}
mfaContent += mfaEndStates[mfaEndStates.Count - 1] + "\n";

// 生成 MFA 文件内容
for (int i = 0; i < mfaTransitions.Count; i++)
{
    foreach (string symbol in mfaTransitions[i.ToString()].Keys)
    {
        mfaContent += i.ToString() + "\t" + symbol + "\t" + mfaTransitions[i.ToString()][symbol] + "\n";
    }
}

// 保存 MFA 文件
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "MFA文件(*.mfa)|*.mfa";
saveFileDialog.FileName = "MFA.txt";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
    string fileName = saveFileDialog.FileName;
    File.WriteAllText(fileName, mfaContent, Encoding.UTF8);
}

}

C# 子集构造算法实现 NFA 到 DFA 和 DFA 到 MFA 的转换

原文地址: https://www.cveoy.top/t/topic/knrB 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录