private void button7_Click(object sender, EventArgs e) { //获取NFA数据 List nfaData = new List(); foreach (ListViewItem item in listView1.Items) { string state = item.SubItems[0].Text; string symbol = item.SubItems[1].Text; string nextState = item.SubItems[2].Text; string data = state + '\t' + symbol + '\t' + nextState; nfaData.Add(data); }

//生成DFA数据
List<string> dfaData = new List<string>();

//获取初始状态集
string startStates = label3.Text;
List<string> startStateList = startStates.Split(',').ToList();

//获取终止状态集
string endStates = label4.Text;
List<string> endStateList = endStates.Split(',').ToList();

//生成开始符和终结符
string startSymbol = '开始符:';
string endSymbol = '终结符:';
foreach (string state in startStateList)
{
    startSymbol += state + ';';
}
foreach (string state in endStateList)
{
    endSymbol += state + ';';
}
dfaData.Add(startSymbol);
dfaData.Add(endSymbol);

//生成DFA转移表
List<List<string>> dfaTable = new List<List<string>>();
List<string> firstRow = new List<string>();
firstRow.Add('');
foreach (string symbol in GetSymbols(nfaData))
{
    firstRow.Add(symbol);
}
dfaTable.Add(firstRow);
List<string> currentStateList = startStateList;
while (currentStateList.Count > 0)
{
    List<string> row = new List<string>();
    string currentState = GetCurrentState(currentStateList);
    row.Add(currentState);
    foreach (string symbol in GetSymbols(nfaData))
    {
        List<string> nextStateList = GetNextStateList(currentStateList, symbol, nfaData);
        string nextState = GetCurrentState(nextStateList);
        row.Add(nextState);
        if (!dfaTable.Any(r => r[0] == nextState))
        {
            dfaTable.Add(new List<string> { nextState });
        }
    }
    dfaTable.Add(row);
    currentStateList = GetNextStateList(currentStateList, nfaData);
}

//将DFA转移表添加到dfaData中
foreach (List<string> row in dfaTable)
{
    string rowData = '';
    foreach (string cell in row)
    {
        rowData += cell + '\t';
    }
    dfaData.Add(rowData.TrimEnd('\t'));
}

//将DFA数据显示在listView2中
listView2.Columns.Add('起始状态');
listView2.Columns.Add('接受符号');
listView2.Columns.Add('到达状态');
foreach (string data in dfaData)
{
    string[] dataArray = data.Split('\t');
    ListViewItem item = new ListViewItem(dataArray);
    listView2.Items.Add(item);
}

//显示DFA文件的初始状态集和终止状态集
label5.Text = startStates;
label7.Text = endStates;

}

//获取NFA中出现的所有符号 private List GetSymbols(List nfaData) { List symbolList = new List(); foreach (string data in nfaData) { string symbol = data.Split('\t')[1]; if (symbol != '#' && !symbolList.Contains(symbol)) { symbolList.Add(symbol); } } return symbolList; }

//获取当前状态集合的字符串表示 private string GetCurrentState(List currentStateList) { List stateIntList = new List(); foreach (string state in currentStateList) { stateIntList.Add(int.Parse(state)); } stateIntList.Sort(); string currentState = ''; foreach (int stateInt in stateIntList) { currentState += stateInt + ','; } return currentState.TrimEnd(','); }

//获取下一个状态集合 private List GetNextStateList(List currentStateList, string symbol, List nfaData) { List nextStateList = new List(); foreach (string state in currentStateList) { List nextStates = GetNextStates(state, symbol, nfaData); foreach (string nextState in nextStates) { if (!nextStateList.Contains(nextState)) { nextStateList.Add(nextState); } } } return nextStateList; }

//获取某个状态输入某个符号后的所有可能到达状态 private List GetNextStates(string state, string symbol, List nfaData) { List nextStateList = new List(); foreach (string data in nfaData) { string[] dataArray = data.Split('\t'); if (dataArray[0] == state && dataArray[1] == symbol) { nextStateList.Add(dataArray[2]); } } return nextStateList; }

//获取下一个状态集合 private List GetNextStateList(List currentStateList, List nfaData) { List nextStateList = new List(); foreach (string state in currentStateList) { List nextStates = GetNextStates(state, '#', nfaData); foreach (string nextState in nextStates) { if (!nextStateList.Contains(nextState)) { nextStateList.Add(nextState); } } } return nextStateList; }

C# 使用NFA数据生成DFA文件数据

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

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