private void button7_Click(object sender, EventArgs e) { //获取NFA数据 List nfaData = new List(); for (int i = 0; i < listView1.Items.Count; i++) { string item = listView1.Items[i].SubItems[0].Text + "\t" + listView1.Items[i].SubItems[1].Text + "\t" + listView1.Items[i].SubItems[2].Text; nfaData.Add(item); }

//生成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);
}
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

原文地址: https://www.cveoy.top/t/topic/chCv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录