private void button7_Clickobject sender EventArgs e函数在VS软件中利用C#语言实现根据NFA数据生成DFA文件数据功能NFA数据已经显示listView1容器中了生成DFA数据显示listView2容器中两个容器已经被分为起始状态、接受符号、到达状态三列。label3和label4中文本已经提供了NFA文件的初始状态集和终止状态集。NFA数据格式
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> startStates = new List<string>();
startStates.Add(label3.Text); //获取NFA文件的初始状态集
List<string> endStates = label4.Text.Split(';').ToList(); //获取NFA文件的终止状态集
//获取所有符号
List<string> symbols = new List<string>();
foreach (string[] data in nfaData)
{
if (!symbols.Contains(data[1]) && data[1] != "#")
{
symbols.Add(data[1]);
}
}
//生成DFA的开始符
string startSymbol = string.Join(",", startStates.ToArray()) + ";";
//生成DFA的终结符
string endSymbol = string.Join(";", endStates.ToArray()) + ";";
//生成DFA的状态转换
List<string> unmarkedStates = new List<string>();
unmarkedStates.Add(startSymbol);
while (unmarkedStates.Count > 0)
{
string currentState = unmarkedStates[0];
unmarkedStates.RemoveAt(0);
//判断是否为终结状态
bool isEndState = false;
string[] currentStates = currentState.Split(',');
foreach (string state in currentStates)
{
if (endStates.Contains(state))
{
isEndState = true;
break;
}
}
//生成DFA的状态转换
foreach (string symbol in symbols)
{
List<string> nextStates = new List<string>();
foreach (string state in currentStates)
{
foreach (string[] data in nfaData)
{
if (data[0] == state && data[1] == symbol)
{
if (!nextStates.Contains(data[2]))
{
nextStates.Add(data[2]);
}
}
}
}
if (nextStates.Count == 0)
{
continue;
}
//生成DFA的状态
string nextState = string.Join(",", nextStates.ToArray()) + ";";
string[] newData = new string[3];
newData[0] = currentState;
newData[1] = symbol;
newData[2] = nextState;
dfaData.Add(newData);
//将未标记状态加入队列
if (!unmarkedStates.Contains(nextState))
{
unmarkedStates.Add(nextState);
}
}
}
//将DFA数据显示在listView2中
listView2.Items.Clear();
foreach (string[] data in dfaData)
{
ListViewItem item = new ListViewItem(data);
listView2.Items.Add(item);
}
原文地址: http://www.cveoy.top/t/topic/chLW 著作权归作者所有。请勿转载和采集!