C# 使用NFA数据生成DFA文件数据,实现NFA到DFA转换
private void button7_Click(object sender, EventArgs e) { // 获取NFA数据 List<string[]> nfaList = new List<string[]>(); foreach (ListViewItem item in listView1.Items) { string[] nfaData = new string[3]; nfaData[0] = item.SubItems[0].Text; nfaData[1] = item.SubItems[1].Text; nfaData[2] = item.SubItems[2].Text; nfaList.Add(nfaData); }
// 获取所有状态和符号
List<string> states = new List<string>();
List<string> symbols = new List<string>();
foreach (string[] nfaData in nfaList)
{
if (!states.Contains(nfaData[0]))
{
states.Add(nfaData[0]);
}
if (!states.Contains(nfaData[2]))
{
states.Add(nfaData[2]);
}
if (!symbols.Contains(nfaData[1]) && nfaData[1] != '#')
{
symbols.Add(nfaData[1]);
}
}
// 初始化DFA数据
List<string[]> dfaList = new List<string[]>();
string startState = '0';
string endStates = '';
List<string> currentStates = new List<string>();
currentStates.Add(startState);
List<string> newStates = new List<string>();
while (currentStates.Count > 0)
{
// 计算当前状态集合可以到达的状态集合
foreach (string symbol in symbols)
{
newStates.Clear();
foreach (string state in currentStates)
{
foreach (string[] nfaData in nfaList)
{
if (nfaData[0] == state && nfaData[1] == symbol)
{
if (!newStates.Contains(nfaData[2]))
{
newStates.Add(nfaData[2]);
}
}
}
}
// 如果新状态集合不为空,则添加到DFA数据中
if (newStates.Count > 0)
{
string[] dfaData = new string[3];
dfaData[0] = string.Join(',', currentStates.ToArray());
dfaData[1] = symbol;
dfaData[2] = string.Join(',', newStates.ToArray());
dfaList.Add(dfaData);
// 如果新状态集合不在当前状态集合列表中,则添加到列表中
if (!currentStates.Contains(string.Join(',', newStates.ToArray())))
{
currentStates.Add(string.Join(',', newStates.ToArray()));
}
}
}
// 从当前状态集合中移除已处理的状态集合
foreach (string state in currentStates)
{
if (endStates.Contains(state) && !endStates.Contains(string.Join(',', currentStates.ToArray())))
{
endStates += string.Join(',', currentStates.ToArray()) + ';';
}
}
currentStates.RemoveAt(0);
}
// 显示DFA数据
listView2.Items.Clear();
foreach (string[] dfaData in dfaList)
{
ListViewItem item = new ListViewItem(dfaData);
listView2.Items.Add(item);
}
// 显示初始状态集和终止状态集
label3.Text = '初始状态集:' + startState;
label4.Text = '终止状态集:' + endStates.TrimEnd(';');
}
原文地址: https://www.cveoy.top/t/topic/jM2H 著作权归作者所有。请勿转载和采集!