private void button7_Click(object sender, EventArgs e) { //获取NFA中的状态集合 string[] stateSet = lines[2].Substring(lines[2].IndexOf(":") + 1).Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

//将起始状态集合作为第一个子集
List<List<string>> subsets = new List<List<string>>();
List<string> subset1 = new List<string>();
subset1.Add(startSymbol);
subsets.Add(subset1);

//通过子集构造算法生成DFA的状态集合
for (int i = 0; i < subsets.Count; i++)
{
    List<string> currentSubset = subsets[i];
    foreach (string symbol in symbolSet)
    {
        List<string> nextSubset = new List<string>();
        foreach (string state in currentSubset)
        {
            foreach (ListViewItem item in listView1.Items)
            {
                if (item.SubItems[0].Text == state && item.SubItems[1].Text == symbol)
                {
                    if (!nextSubset.Contains(item.SubItems[2].Text))
                    {
                        nextSubset.Add(item.SubItems[2].Text);
                    }
                }
            }
        }
        if (nextSubset.Count > 0 && !subsets.Any(s => s.SequenceEqual(nextSubset)))
        {
            subsets.Add(nextSubset);
        }
    }
}

//在listview2中生成DFA的状态转移表
listView2.Columns.Add("起始状态", 100);
listView2.Columns.Add("接受符号", 100);
listView2.Columns.Add("到达状态", 100);
foreach (List<string> subset in subsets)
{
    ListViewItem item = new ListViewItem(subset.Contains(startSymbol) ? "*" + startSymbol : subset[0]);
    item.SubItems.Add(endSymbol);
    List<string> nextStates = new List<string>();
    foreach (string symbol in symbolSet)
    {
        List<string> tempStates = new List<string>();
        foreach (string state in subset)
        {
            foreach (ListViewItem listItem in listView1.Items)
            {
                if (listItem.SubItems[0].Text == state && listItem.SubItems[1].Text == symbol)
                {
                    if (!tempStates.Contains(listItem.SubItems[2].Text))
                    {
                        tempStates.Add(listItem.SubItems[2].Text);
                    }
                }
            }
        }
        nextStates.Add(string.Join(",", tempStates));
    }
    item.SubItems.Add(string.Join(";", nextStates));
    listView2.Items.Add(item);
}

//在label5中显示初始状态集
label5.Text = "初始状态集:" + startSymbol;

//在label7中显示终止状态集
List<string> endStates = new List<string>();
foreach (List<string> subset in subsets)
{
    if (subset.Any(s => s == endSymbol))
    {
        endStates.Add(subset.Contains(startSymbol) ? "*" + subset[0] : subset[0]);
    }
}
label7.Text = "终止状态集:" + string.Join(",", endStates);

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

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