通过VS使用C#语言实现 函数private void button7_Clickobject sender EventArgs e的NFA转DFA功能不能定义或调用其他函数或类其中NFA数据已经全部读取到lines = FileReadAllLinesopenFileDialog1FileName;中了需要把转换后的结果显示在容器listView2中该容器被分为3列初始状态、接受符号、到达状态。
以下是实现该功能的代码:
private void button7_Click(object sender, EventArgs e) { // 读取NFA数据 string[] lines = File.ReadAllLines(openFileDialog1.FileName);
// 将终结符号集转换为数组
string[] endSymbols = lines[1].Substring(5).Split(';');
// 初始化DFA状态集和转移矩阵
List<int[]> dfaStates = new List<int[]>();
List<string[]> dfaTransitions = new List<string[]>();
// 添加初始状态
int[] initialState = { 7 };
dfaStates.Add(initialState);
// 计算DFA状态集和转移矩阵
for (int i = 0; i < dfaStates.Count; i++)
{
int[] state = dfaStates[i];
string[] transitions = new string[endSymbols.Length];
// 计算从当前状态通过每个终结符号能够到达的状态集
for (int j = 0; j < endSymbols.Length; j++)
{
List<int> reachableStates = new List<int>();
foreach (int s in state)
{
foreach (string line in lines)
{
string[] parts = line.Split('\t');
if (s == int.Parse(parts[0]) && parts[1] == endSymbols[j])
{
reachableStates.Add(int.Parse(parts[2]));
}
}
}
reachableStates = reachableStates.Distinct().ToList();
reachableStates.Sort();
transitions[j] = string.Join(",", reachableStates);
}
// 将新计算出的状态集加入DFA状态集
for (int j = 0; j < endSymbols.Length; j++)
{
if (!dfaStates.Any(s => s.SequenceEqual(transitions[j].Split(',').Select(int.Parse).ToArray())))
{
dfaStates.Add(transitions[j].Split(',').Select(int.Parse).ToArray());
}
}
// 记录转移矩阵中的新一行
dfaTransitions.Add(transitions);
}
// 将DFA状态集和转移矩阵显示在listView2中
listView2.Clear();
listView2.Columns.Add("初始状态");
listView2.Columns.Add("接受符号");
listView2.Columns.Add("到达状态");
for (int i = 0; i < dfaStates.Count; i++)
{
int[] state = dfaStates[i];
for (int j = 0; j < endSymbols.Length; j++)
{
string[] transition = dfaTransitions[i];
string[] row = new string[3];
row[0] = string.Join(",", state);
row[1] = endSymbols[j];
row[2] = transition[j];
listView2.Items.Add(new ListViewItem(row));
}
}
原文地址: https://www.cveoy.top/t/topic/ciru 著作权归作者所有。请勿转载和采集!