private void button7_Clickobject sender EventArgs e函数在VS软件中利用c#语言实现根据NFA数据生成DFA文件数据功能NFA数据显示listView1容器中生成DFA数据显示listView2容器中li两个容器已经被分为起始状态、接受符号、到达状态三列。NFA数据格式类似如下开始符7终结符261 a 23 b 45 # 35 # 14 # 6DF
private void button7_Click(object sender, EventArgs e)
{
//获取NFA数据
List
//生成DFA数据
List<string> dfaData = new List<string>();
List<string> acceptSymbols = new List<string>();
List<string> startStates = new List<string>();
int startSymbol = 0;
int acceptSymbol = 1;
int toState = 2;
int currentState = 0;
int nextState = 1;
string startState = "0";
startStates.Add(startState);
dfaData.Add("开始符:" + startState + ";;");
dfaData.Add("终结符:");
//获取所有终结符
for (int i = 0; i < nfaData.Count; i++)
{
string[] data = nfaData[i].Split('\t');
if (!acceptSymbols.Contains(data[acceptSymbol]) && data[acceptSymbol] != "#")
{
acceptSymbols.Add(data[acceptSymbol]);
}
}
//获取所有到达状态
List<string> toStates = new List<string>();
for (int i = 0; i < nfaData.Count; i++)
{
string[] data = nfaData[i].Split('\t');
if (!toStates.Contains(data[toState]))
{
toStates.Add(data[toState]);
}
}
//生成DFA数据
while (currentState < startStates.Count)
{
//获取当前状态
string currentStateStr = startStates[currentState];
//对所有终结符进行操作
for (int i = 0; i < acceptSymbols.Count; i++)
{
string acceptSymbolStr = acceptSymbols[i];
//获取到达状态
List<string> nextStates = new List<string>();
for (int j = 0; j < nfaData.Count; j++)
{
string[] data = nfaData[j].Split('\t');
if (data[startSymbol] == currentStateStr && data[acceptSymbol] == acceptSymbolStr)
{
if (!nextStates.Contains(data[toState]))
{
nextStates.Add(data[toState]);
}
}
}
//判断是否已存在该状态
string nextStateStr = string.Join(",", nextStates.ToArray());
if (!toStates.Contains(nextStateStr))
{
toStates.Add(nextStateStr);
startStates.Add(nextStateStr);
}
//生成DFA数据
dfaData.Add(currentStateStr + "\t" + acceptSymbolStr + "\t" + nextStateStr);
}
currentState++;
}
//将结果显示在listView2中
for (int i = 0; i < acceptSymbols.Count; i++)
{
listView2.Columns.Add(acceptSymbols[i], 80);
}
for (int i = 0; i < startStates.Count; i++)
{
ListViewItem item = new ListViewItem(startStates[i]);
for (int j = 0; j < acceptSymbols.Count; j++)
{
string nextStateStr = "";
for (int k = 0; k < dfaData.Count; k++)
{
string[] data = dfaData[k].Split('\t');
if (data[startSymbol] == startStates[i] && data[acceptSymbol] == acceptSymbols[j])
{
nextStateStr = data[toState];
break;
}
}
item.SubItems.Add(nextStateStr);
}
listView2.Items.Add(item);
}
原文地址: https://www.cveoy.top/t/topic/chCv 著作权归作者所有。请勿转载和采集!