📄 form1.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 + -