using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Reflection.Emit; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows.Forms; using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace byyljxfzxt { public partial class Form3 : Form { public Form3() { InitializeComponent(); }

    public bool rep(char x, string s)//判断是否重复
    {
        int i = 0;
        if (s.Length == 0)
        {
            return true;
        }
        while (i < s.Length)
        {
            if (s[i] == x)
                return false;
            i++;
        }
        return true;
    }

    string s3 = "";
    public int countap(string s)//统计字母个数
    {
        int i = 0;
        while (i < s.Length)
        {
            if (s[i] <= 'z' && s[i] >= 'a')
            {
                if (rep(s[i], s3))
                    s3 = s3 + s[i];
            }
            i++;
        }
        return s3.Length;
    }

    private void listView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        ListViewItem item = new ListViewItem();
        item.Text = Convert.ToString(listView1.Items.Count + 1);
        item.SubItems.Add("0");
        item.SubItems.Add("1");
        item.SubItems.Add("2");
        listView1.Items.Add(item);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string s = richTextBox1.Text;
        int i, count = 0;//count用来标记(和)
        countap(s);
        if (s == "")//如果输入为空白
        {
            MessageBox.Show("正确的输入");
            return;
        }

        if (s[0] == '|' || s[0] == '*' || s[s.Length - 1] == '|' || s[s.Length - 1] == '(')//不能以|、*开头,也不能以|、(结尾
        {
            MessageBox.Show("错误的输入");
            return;
        }

        for (i = 0; i < s.Length; i++)//做循环判断
        {
            if ((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z') || s[i] == '*' || s[i] == '|' || s[i] == '(' || s[i] == ')')
            //当前为大写(小写)字母或者*、|、(、)
            {
                switch (s[i])
                {
                    case '(': 
                        if ((i + 1) < s.Length)
                        {
                            if (s[i + 1] == '*' || s[i + 1] == '|')//()内开头也不可以是闭包 
                            {
                                MessageBox.Show("错误的输入");
                                return;
                            }
                            if (s[i + 1] == ')')
                            {
                                MessageBox.Show("错误的输入");
                                return;
                            }
                        }
                        count++;
                        break;
                    case '|':
                        if ((i + 1) < s.Length)
                        {
                            if (s[i + 1] == '*' || s[i + 1] == '|' || s[i + 1] == ')')
                            {
                                MessageBox.Show("错误的输入");
                                return;
                            }
                        }
                        break;
                    case '*':
                        if ((i + 1) < s.Length)
                        {
                            if (s[i + 1] == '*')
                            {
                                MessageBox.Show("错误的输入");
                                return;
                            }
                        }
                        break;
                    case ')':
                        count--;
                        break;
                }
            }
            else
            {
                MessageBox.Show("错误的输入");
                return;
            }
            if (count < 0)//只要出现)数量大于(时,一定是错误情况
            {
                MessageBox.Show("错误的输入");
                return;
            }
        }
        if (count != 0)//最终循环结束时,count=0才是括号匹配
        {
            MessageBox.Show("错误的输入");
            return;
        }
        //CreateNFA.Enabled = true;
        button4.Enabled = true;
        MessageBox.Show("正确的输入");
    }

    private void button2_Click(object sender, EventArgs e)
    {
        richTextBox1.Text = " ";
    }

    private void button3_Click(object sender, EventArgs e)//读入NFA文件显示在listView1容器中
    {
        OpenFileDialog openFileDialog = new OpenFileDialog();
        openFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            StreamReader sr = new StreamReader(openFileDialog.FileName, Encoding.Default);
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                string[] str = line.Split(' ');
                ListViewItem item = new ListViewItem();
                item.Text = str[0];
                item.SubItems.Add(str[1]);
                item.SubItems.Add(str[2]);
                item.SubItems.Add(str[3]);
                listView1.Items.Add(item);
            }
            sr.Close();
        }
    }

    private void button5_Click(object sender, EventArgs e)//保存NFA文件
    {
        SaveFileDialog saveFileDialog = new SaveFileDialog();
        saveFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
        if (saveFileDialog.ShowDialog() == DialogResult.OK)
        {
            StreamWriter sw = new StreamWriter(saveFileDialog.FileName, false, Encoding.Default);
            for (int i = 0; i < listView1.Items.Count; i++)
            {
                sw.WriteLine(listView1.Items[i].SubItems[0].Text + " " + listView1.Items[i].SubItems[1].Text + " " + listView1.Items[i].SubItems[2].Text + " " + listView1.Items[i].SubItems[3].Text);
            }
            sw.Close();
        }
    }

    private void button6_Click(object sender, EventArgs e)//读入DFA文件显示在listView2容器中
    {
        OpenFileDialog openFileDialog = new OpenFileDialog();
        openFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            StreamReader sr = new StreamReader(openFileDialog.FileName, Encoding.Default);
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                string[] str = line.Split(' ');
                ListViewItem item = new ListViewItem();
                item.Text = str[0];
                item.SubItems.Add(str[1]);
                item.SubItems.Add(str[2]);
                item.SubItems.Add(str[3]);
                item.SubItems.Add(str[4]);
                item.SubItems.Add(str[5]);
                item.SubItems.Add(str[6]);
                listView2.Items.Add(item);
            }
            sr.Close();
        }
    }

    private void button8_Click(object sender, EventArgs e)//保存DFA文件
    {
        SaveFileDialog saveFileDialog = new SaveFileDialog();
        saveFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
        if (saveFileDialog.ShowDialog() == DialogResult.OK)
        {
            StreamWriter sw = new StreamWriter(saveFileDialog.FileName, false, Encoding.Default);
            for (int i = 0; i < listView2.Items.Count; i++)
            {
                sw.WriteLine(listView2.Items[i].SubItems[0].Text + " " + listView2.Items[i].SubItems[1].Text + " " + listView2.Items[i].SubItems[2].Text + " " + listView2.Items[i].SubItems[3].Text + " " + listView2.Items[i].SubItems[4].Text + " " + listView2.Items[i].SubItems[5].Text + " " + listView2.Items[i].SubItems[6].Text);
            }
            sw.Close();
        }
    }

    private void button7_Click(object sender, EventArgs e)//生成DFA文件显示在listView2容器中
    {
        listView2.Items.Clear();
        Dictionary<string, string> dic = new Dictionary<string, string>();
        for (int i = 0; i < listView1.Items.Count; i++)
        {
            string key = listView1.Items[i].SubItems[1].Text + "," + listView1.Items[i].SubItems[2].Text;
            if (dic.ContainsKey(key))
            {
                dic[key] += "|" + listView1.Items[i].SubItems[3].Text;
            }
            else
            {
                dic.Add(key, listView1.Items[i].SubItems[3].Text);
            }
        }
        string startState = "0";
        string endState = "";
        for (int i = 0; i < listView1.Items.Count; i++)
        {
            if (listView1.Items[i].SubItems[2].Text == "1")
            {
                endState += listView1.Items[i].SubItems[0].Text + ",";
            }
        }
        endState = endState.TrimEnd(',');
        List<string> stateList = new List<string>();
        stateList.Add(startState);
        string[] endStateList = endState.Split(',');
        for (int i = 0; i < endStateList.Length; i++)
        {
            if (!stateList.Contains(endStateList[i]))
            {
                stateList.Add(endStateList[i]);
            }
        }
        for (int i = 0; i < stateList.Count; i++)
        {
            ListViewItem item = new ListViewItem();
            item.Text = stateList[i];
            if (endState.Contains(stateList[i]))
            {
                item.SubItems.Add("1");
            }
            else
            {
                item.SubItems.Add("0");
            }
            string[] inputList = { "a", "b" };
            for (int j = 0; j < inputList.Length; j++)
            {
                string nextState = "";
                string[] stateArray = stateList[i].Split(',');
                for (int k = 0; k < stateArray.Length; k++)
                {
                    string key = stateArray[k] + "," + inputList[j];
                    if (dic.ContainsKey(key))
                    {
                        nextState += dic[key] + ",";
                    }
                }
                if (nextState == "")
                {
                    item.SubItems.Add("-");
                }
                else
                {
                    nextState = nextState.TrimEnd(',');
                    item.SubItems.Add(nextState);
                    if (!stateList.Contains(nextState))
                    {
                        stateList.Add(nextState);
                    }
                }
            }
            listView2.Items.Add(item);
        }
    }

    private void button9_Click(object sender, EventArgs e)//生成MFA文件显示在listView3容器中
    {
        listView3.Items.Clear();
        for (int i = 0; i < listView2.Items.Count; i++)
        {
            string[] stateArray = listView2.Items[i].SubItems[3].Text.Split(',');
            for (int j = 0; j < stateArray.Length; j++)
            {
                ListViewItem item = new ListViewItem();
                item.Text = listView2.Items[i].SubItems[0].Text;
                item.SubItems.Add(listView2.Items[i].SubItems[1].Text);
                item.SubItems.Add(listView2.Items[i].SubItems[2].Text);
                item.SubItems.Add(stateArray[j]);
                item.SubItems.Add(listView2.Items[i].SubItems[4].Text);
                item.SubItems.Add(listView2.Items[i].SubItems[5].Text);
                item.SubItems.Add(listView2.Items[i].SubItems[6].Text);
                listView3.Items.Add(item);
            }
        }
    }

}
C# 正则表达式验证工具 - NFA、DFA、MFA 生成器

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

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