C# 子集构造算法实现 NFA 到 DFA 和 DFA 到 MFA 的转换
///
// 初始化 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 状态集合
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);
}
}
原文地址: https://www.cveoy.top/t/topic/knrB 著作权归作者所有。请勿转载和采集!