C# 使用NFA数据生成DFA文件数据 - VS软件实现
下面是生成DFA数据的代码实现:
private void button7_Click(object sender, EventArgs e) { // 获取NFA数据 List<string[]> nfaData = new List<string[]>(); foreach (ListViewItem item in listView1.Items) { string[] data = new string[3]; data[0] = item.SubItems[0].Text; data[1] = item.SubItems[1].Text; data[2] = item.SubItems[2].Text; nfaData.Add(data); }
// 生成DFA数据
List<string[]> dfaData = new List<string[]>();
List<string> stateSet = new List<string>();
List<string> symbolSet = new List<string>();
List<string> endStateSet = new List<string>();
// 添加初始状态
string[] startState = new string[] { startSymbol };
stateSet.Add(startSymbol);
dfaData.Add(startState);
// 遍历状态集
for (int i = 0; i < stateSet.Count; i++)
{
string state = stateSet[i];
// 遍历符号集
foreach (string symbol in symbolSet)
{
List<string> nextStateSet = new List<string>();
// 遍历NFA数据,获取到达状态集合
foreach (string[] data in nfaData)
{
if (data[0] == state && data[1] == symbol)
{
nextStateSet.Add(data[2]);
}
}
// 判断是否为新状态
string nextState = string.Join(',', nextStateSet.ToArray());
if (!stateSet.Contains(nextState))
{
stateSet.Add(nextState);
string[] dfaState = new string[] { nextState };
dfaData.Add(dfaState);
}
// 添加转移
string[] dfaTransition = new string[] { state, symbol, nextState };
dfaData.Add(dfaTransition);
}
// 判断是否为终止状态
if (state.Split(',').Intersect(endSymbol.Split(',')).Any())
{
endStateSet.Add(state);
}
}
// 显示DFA数据
listView2.Items.Clear();
foreach (string[] data in dfaData)
{
ListViewItem item = new ListViewItem(data);
listView2.Items.Add(item);
}
}
原文地址: https://www.cveoy.top/t/topic/jM6n 著作权归作者所有。请勿转载和采集!