// 定义变量 List dfaStates = new List(); // DFA状态集合 List dfaAccept = new List(); // DFA接受符号集合 List dfaTrans = new List(); // DFA转移集合

// 获取NFA数据 List nfaStates = new List(); // NFA状态集合 List nfaAccept = new List(); // NFA接受符号集合 List nfaTrans = new List(); // NFA转移集合 for (int i = 0; i < listView1.Items.Count; i++) { ListViewItem item = listView1.Items[i]; string state = item.SubItems[0].Text; string symbol = item.SubItems[1].Text; string target = item.SubItems[2].Text;

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 trans) { List closure = new List(); closure.Add(state); bool change = true; while (change) { change = false; for (int i = 0; i < trans.Count; i++) { string[] parts = trans[i].Split(','); if (parts[0] == state && parts[2] == "ε" && !closure.Contains(parts[1])) { closure.Add(parts[1]); change = true; } } } closure.Sort(); return string.Join(",", closure); }

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);

private void button7_Clickobject sender EventArgs e函数在VS软件中利用C#语言实现根据NFA数据生成DFA文件数据功能NFA数据已经显示listView1容器中了生成DFA数据显示listView2容器的三列中两个容器已经被分为起始状态、接受符号、到达状态三列。文件的初始状态集、终止状态集和符号集已经保存在string lines数据中了。

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

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