⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form1.cs

📁 构造形式语言中的PDA自动机
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace FAProject
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            List<string> showProcess1 = new List<string>();
            //分割文法,放入数组a[]
            string gram = GramBox.Text;
            string[] a = gram.Split(';');
            //把非终结符号和终结符分开到两个数组 m[] , n[];
            int Q_place = 0;
            int D_place = 0;
            string[] Q = new string[50];
            string[] D = new string[50];
            
            for (int i = 0; i < a.Length;i++ )
            {
                string temp = a[i];
                string left = null;
                string right = null;
                //string[] divide= temp.Split("->");
                string[] divide = Regex.Split(temp, "->");
                left = divide[0];
                right = divide[1];
                //左部的非终结符放入m数组,同时要判断是否已经存在

                int flag6 = 0;//是否存在重复元素的标志位
                for (int s = 0; s < Q.Length; s++)
                {
                    if (left.Equals(Q[s]))
                    {
                        flag6 = 1;
                        break;
                    }
                }
                if(flag6==0){
                 Q[Q_place] = left;
                 Q_place++;
                }

                //右部的非终结符放入n数组
                for (int j = 0; j < right.Length;j++ )
                {
                    if (char.Parse(right.Substring(j, 1)) >= '0'&& char.Parse(right.Substring(j, 1)) <= '9')
                    {
                        int flag = 0;//是否存在重复元素的标志位
                        for(int t=0;t<D.Length;t++){
                            
                            if(right.Substring(j, 1).Equals(D[t]))
                            {
                                flag=1;
                                break;
                            }
                        }
                        if(flag==0)
                        {
                              D[D_place] = right.Substring(j, 1);
                              D_place++;
                         }
                    }
                    else{
                        int flag5 = 0;//是否存在重复元素的标志位
                        for (int s = 0; s < Q.Length; s++)
                        {
                            if (right.Substring(j, 1).Equals(Q[s]))
                            {
                                flag5 = 1;
                                break;
                            }
                        }
                        if(flag5==0){
                          Q[Q_place] = right.Substring(j, 1);
                          Q_place++;
                        }
                    }
                }
            }
            //以上获取了五元组的两个集合,输入状态集合,中间过程集合
            string F1 = "Z";//终态
            string S1 = a[0].Substring(0,1);//初态
            //获取两个数组的长度
            int length_Q = 0;
            int length_D = 0;
            for(int i = 0; i<Q.Length;i++){
                if(Q[i]==null){
                    length_Q = i ;
                    break;
                }
            }
            for (int j = 0; j < D.Length;j++ ){
                if (D[j] == null)
                {
                    length_D = j ;
                    break;
                }
            }
            //状态转换函数
            string[] convertFunction = new string[length_Q * length_D];
            int k = 0;
            for (int i = 0; i < length_Q; i++)
            {
                for (int j = 0; j < length_D; j++)
                {
                    convertFunction[k] = "p(" + Q[i] + "," + D[j] + ")";
                    string temp = Q[i] + "->" + D[j];
                    int flag1 = 0;
                    string nextToTemp = null;
                    string temp1 = null;//状态集合
                    for (int c = 0; c < a.Length;c++ )
                    {
                        if (a[c].Equals(temp))
                        {
                            flag1 = 1;
                            break;
                        }
                    }
                    if (flag1 == 1)
                    {
                        for (int b = 0; b < a.Length;b++ )
                        {
                            if(a[b].StartsWith(temp)){
                                if (!temp.Equals(a[b]))
                                {
                                nextToTemp = a[b].Substring(temp.Length,1);
                                temp1 = temp1 + nextToTemp + ",";
                                }

                            }
                        }
                        temp1 = temp1 + F1 + ",";
                    }
                    else 
                    {
                        for (int b = 0; b < a.Length; b++)
                        {
                            if (a[b].StartsWith(temp))
                            {
                                if (!temp.Equals(a[b]))
                                {
                                    nextToTemp = a[b].Substring(temp.Length, 1);
                                    temp1 = temp1 + nextToTemp + ",";//转换后的状态集在temp1
                                }

                            }
                        }
                    }
                    //
                    if (temp1!=null){//如果转换后的状态不为空
                        convertFunction[k] = convertFunction[k] + "={" + temp1 + "}";
                        showProcess1.Add(convertFunction[k]);
                        listBox1.Items.Add(convertFunction[k]);
                        k++;

                    }
                }
            }
            //for (int s = 0; s < convertFunction.Length;s++ )
            //{
            //    listBox1.Items.Add(convertFunction[s]);
            //}
            string tt = null;
            for (k = 0; k < Q.Length; k++)
            {
                if (Q[k] != null)
                {
                    tt = tt + Q[k] + ",";
                }
            }
            tt = tt + F1;
            state.Text = tt;
            string tt1 = null;
            for (k = 0; k < D.Length; k++)
            {
                if (D[k] != null)
                {
                    tt1 = tt1 + D[k] + ",";
                }
            }

            vacabulary.Text = tt1;
            endstate.Text = F1;
            initialstate.Text = Q[0];

            //以上,实现了从文法到NFA的转换(对于任意的右线性文法)

            //下面,实现NFA到DFA的转换

        }

        private void button3_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            state.Text = "";
            endstate.Text = "";
            initialstate.Text = "";
            vacabulary.Text = "";
        }

        private void button2_Click(object sender, EventArgs e)
        {

        }


    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -