private void button7_Clickobject sender EventArgs e函数在VS软件中利用C#语言实现根据NFA数据生成DFA文件数据功能NFA数据已经显示listView1容器中了生成DFA数据显示listView2容器的三列中两个容器已经被分为起始状态、接受符号、到达状态三列。文件的初始状态集、终止状态集和符号集已经保存在string lines数据中了。
// 定义变量
List
// 获取NFA数据
List
if (!nfaStates.Contains(state))
nfaStates.Add(state);
if (!nfaStates.Contains(target))
nfaStates.Add(target);
if (!nfaAccept.Contains(symbol) && symbol != "ε")
nfaAccept.Add(symbol);
if (symbol == "ε")
nfaTrans.Add(state + "," + target + "," + symbol);
else
nfaTrans.Add(state + "," + target + "," + symbol);
}
// 定义函数
string GetEpsilonClosure(string state, List
string GetStateFromSet(string set) { set = set.Replace(",", ""); return new string(set.OrderBy(c => c).ToArray()); }
// 生成DFA数据 string startState = GetEpsilonClosure(lines[0], nfaTrans); dfaStates.Add(startState); if (startState.Split(',').Intersect(lines[2].Split(',')).Any()) dfaAccept.Add(startState);
for (int i = 0; i < dfaStates.Count; i++) { string[] stateSet = dfaStates[i].Split(','); for (int j = 0; j < nfaAccept.Count; j++) { string symbol = nfaAccept[j]; if (symbol == "ε") continue;
List<string> targetSet = new List<string>();
for (int k = 0; k < stateSet.Length; k++)
{
string state = stateSet[k];
for (int l = 0; l < nfaTrans.Count; l++)
{
string[] parts = nfaTrans[l].Split(',');
if (parts[0] == state && parts[2] == symbol)
{
string target = GetEpsilonClosure(parts[1], nfaTrans);
if (!targetSet.Contains(target))
targetSet.Add(target);
}
}
}
if (targetSet.Count == 0)
continue;
string targetState = GetStateFromSet(string.Join(",", targetSet));
if (!dfaStates.Contains(targetState))
{
dfaStates.Add(targetState);
if (targetState.Split(',').Intersect(lines[2].Split(',')).Any())
dfaAccept.Add(targetState);
}
dfaTrans.Add(dfaStates[i] + "," + targetState + "," + symbol);
}
}
// 显示DFA数据 listView2.Columns.Add("State"); listView2.Columns.Add("Symbol"); listView2.Columns.Add("Target");
for (int i = 0; i < dfaStates.Count; i++) { ListViewItem item = new ListViewItem(dfaStates[i]); if (dfaAccept.Contains(dfaStates[i])) item.ForeColor = Color.Red; listView2.Items.Add(item); }
for (int i = 0; i < dfaTrans.Count; i++) { string[] parts = dfaTrans[i].Split(','); ListViewItem item = new ListViewItem(parts[0]); item.SubItems.Add(parts[2]); item.SubItems.Add(parts[1]); listView2.Items.Add(item);
原文地址: http://www.cveoy.top/t/topic/chWi 著作权归作者所有。请勿转载和采集!