private void button7_Click(object sender, EventArgs e) { // 定义NFA和DFA的数据类型 Dictionary<int, Dictionary<string, List>> nfa = new Dictionary<int, Dictionary<string, List>>(); Dictionary<string, int> dfaStates = new Dictionary<string, int>(); Dictionary<int, Dictionary<string, int>> dfa = new Dictionary<int, Dictionary<string, int>>();

// 解析NFA数据
foreach (ListViewItem item in listView1.Items)
{
    int from = int.Parse(item.SubItems[0].Text);
    string symbol = item.SubItems[1].Text;
    int to = int.Parse(item.SubItems[2].Text);
    
    if (!nfa.ContainsKey(from))
    {
        nfa[from] = new Dictionary<string, List<int>>();
    }
    
    if (!nfa[from].ContainsKey(symbol))
    {
        nfa[from][symbol] = new List<int>();
    }
    
    nfa[from][symbol].Add(to);
}

// 获取NFA的初始状态集和终止状态集
List<int> nfaStartStates = new List<int>();
List<int> nfaEndStates = new List<int>();
foreach (int state in nfa.Keys)
{
    if (state == 1) // 假设初始状态为1
    {
        nfaStartStates.Add(state);
    }
    
    foreach (string symbol in nfa[state].Keys)
    {
        foreach (int toState in nfa[state][symbol])
        {
            if (toState == 6) // 假设终止状态为6
            {
                nfaEndStates.Add(state);
            }
        }
    }
}

// 构建DFA
List<List<int>> dfaStartStates = new List<List<int>>();
List<int> dfaEndStates = new List<int>();

List<int> startState = new List<int>();
startState.AddRange(nfaStartStates);
dfaStartStates.Add(startState);

while (dfaStartStates.Count > 0)
{
    List<int> dfaState = dfaStartStates[0];
    dfaStartStates.RemoveAt(0);
    
    // 判断当前状态是否为终止状态
    bool isEndState = false;
    foreach (int nfaState in dfaState)
    {
        if (nfaEndStates.Contains(nfaState))
        {
            isEndState = true;
            break;
        }
    }
    
    // 添加DFA状态
    string dfaStateName = string.Join(",", dfaState);
    dfaStates[dfaStateName] = dfa.Count;
    dfa[dfa.Count] = new Dictionary<string, int>();
    
    if (isEndState)
    {
        dfaEndStates.Add(dfa.Count);
    }
    
    // 构建DFA转移表
    foreach (string symbol in nfa[1].Keys) // 假设所有状态的符号集合相同
    {
        List<int> toStates = new List<int>();
        foreach (int nfaState in dfaState)
        {
            if (nfa[nfaState].ContainsKey(symbol))
            {
                toStates.AddRange(nfa[nfaState][symbol]);
            }
        }
        
        if (toStates.Count == 0)
        {
            continue;
        }
        
        toStates.Sort();
        string toStateName = string.Join(",", toStates);
        
        if (!dfaStates.ContainsKey(toStateName))
        {
            dfaStartStates.Add(toStates);
        }
        
        dfa[dfaStates[dfaStateName]][symbol] = dfaStates[toStateName];
    }
}

// 显示DFA数据
listView2.Columns.Add('起始状态');
listView2.Columns.Add('接受符号');
listView2.Columns.Add('到达状态');

foreach (string stateName in dfaStates.Keys)
{
    ListViewItem item = new ListViewItem(stateName);
    
    foreach (string symbol in nfa[1].Keys) // 假设所有状态的符号集合相同
    {
        if (dfa[dfaStates[stateName]].ContainsKey(symbol))
        {
            item.SubItems.Add(symbol);
            item.SubItems.Add(dfa[dfaStates[stateName]][symbol].ToString());
        }
    }
    
    listView2.Items.Add(item);
}

// 显示NFA和DFA的初始状态集和终止状态集
label3.Text = string.Join(",", nfaStartStates);
label4.Text = string.Join(",", nfaEndStates);
label5.Text = string.Join(",", dfaStartStates[0]);
label7.Text = string.Join(",", dfaEndStates);

}

C# 使用 NFA 数据生成 DFA 文件:VS 软件实现

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

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