private void button7_Clickobject sender EventArgs e函数在VS软件中利用C#语言实现根据NFA数据生成DFA文件数据功能NFA数据已经显示listView1容器中了生成DFA数据显示listView2容器中两个容器已经被分为起始状态、接受符号、到达状态三列。文件的初始状态集、终止状态集和符号集已经保存在string lines;string sta
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); }
// 获取符号集
List<string> symbolSet = new List<string>();
foreach (string symbol in lines[2].Split(','))
{
symbolSet.Add(symbol);
}
// 构建DFA数据
List<string[]> dfaData = new List<string[]>();
List<string> dfaStates = new List<string>();
List<string> dfaEndStates = new List<string>();
List<string> dfaSymbols = new List<string>();
string startState = lines[0];
string endStates = lines[1];
// 初始化DFA状态集
List<string> nfaStartStates = new List<string>();
nfaStartStates.Add(startState);
List<string> startClosure = EpsilonClosure(nfaStartStates, nfaData);
string startDfaState = string.Join(",", startClosure);
dfaStates.Add(startDfaState);
if (startClosure.Contains(endStates))
{
dfaEndStates.Add(startDfaState);
}
// 构建DFA数据
Queue<string> queue = new Queue<string>();
queue.Enqueue(startDfaState);
while (queue.Count > 0)
{
string currentState = queue.Dequeue();
foreach (string symbol in symbolSet)
{
List<string> nfaStates = new List<string>();
foreach (string state in currentState.Split(','))
{
List<string> transitions = GetTransitions(state, symbol, nfaData);
nfaStates = nfaStates.Union(transitions).ToList();
}
List<string> closure = EpsilonClosure(nfaStates, nfaData);
if (closure.Count > 0)
{
string nextState = string.Join(",", closure);
if (!dfaStates.Contains(nextState))
{
dfaStates.Add(nextState);
if (closure.Contains(endStates))
{
dfaEndStates.Add(nextState);
}
queue.Enqueue(nextState);
}
string[] dfaRow = new string[3];
dfaRow[0] = currentState;
dfaRow[1] = symbol;
dfaRow[2] = nextState;
dfaData.Add(dfaRow);
if (!dfaSymbols.Contains(symbol))
{
dfaSymbols.Add(symbol);
}
}
}
}
// 显示DFA数据
listView2.Columns.Add("起始状态");
listView2.Columns.Add("接受符号");
listView2.Columns.Add("到达状态");
foreach (string dfaState in dfaStates)
{
ListViewItem item = new ListViewItem(dfaState);
item.SubItems.Add("");
item.SubItems.Add("");
listView2.Items.Add(item);
}
foreach (string[] row in dfaData)
{
int index = dfaStates.IndexOf(row[0]);
ListViewItem item = listView2.Items[index];
item.SubItems[1].Text += row[1] + ",";
item.SubItems[2].Text += row[2] + ",";
}
foreach (ListViewItem item in listView2.Items)
{
item.SubItems[1].Text = item.SubItems[1].Text.TrimEnd(',');
item.SubItems[2].Text = item.SubItems[2].Text.TrimEnd(',');
}
string dfaStartState = dfaStates[0];
string dfaEndStateStr = string.Join(";", dfaEndStates);
string dfaSymbolStr = string.Join(";", dfaSymbols);
string dfaDataStr = "开始符:" + dfaStartState + ";;\n";
dfaDataStr += "终结符:" + dfaEndStateStr + ";;\n";
foreach (string[] row in dfaData)
{
dfaDataStr += row[0] + "\t" + row[1] + "\t" + row[2] + "\n";
}
richTextBox1.Text = dfaDataStr;
}
// 获取某个状态通过某个符号可以到达的状态集合
private List
// 获取某个状态通过ε可以到达的状态集合
private List
原文地址: http://www.cveoy.top/t/topic/chNs 著作权归作者所有。请勿转载和采集!