C# 使用NFA数据生成DFA文件数据
private void button7_Click(object sender, EventArgs e)
{
//获取NFA数据
List
//生成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
//获取当前状态集合的字符串表示
private string GetCurrentState(List
//获取下一个状态集合
private List
//获取某个状态输入某个符号后的所有可能到达状态
private List
//获取下一个状态集合
private List
原文地址: https://www.cveoy.top/t/topic/jM3g 著作权归作者所有。请勿转载和采集!