C# 使用DFA文件实现状态机:保存和读取DFA文件
private void button8_Click(object sender, EventArgs e) { // 获取DFA的开始符和终结符 string startSymbol = listView1.Items[0].SubItems[0].Text; string endSymbols = ""; for(int i = 0; i < listView1.Items[1].SubItems.Count; i++) { endSymbols += listView1.Items[1].SubItems[i].Text; if(i != listView1.Items[1].SubItems.Count - 1) { endSymbols += ";"; } }
// 获取DFA的最大状态数和符号集
int maxStateNum = int.Parse(listView2.Items[2].SubItems[0].Text);
string symbolSet = listView2.Items[3].SubItems[0].Text;
// 将DFA的转移表写入文件
using (StreamWriter sw = new StreamWriter("DFA.txt"))
{
// 写入开始符和终结符
sw.WriteLine("开始符:" + startSymbol + ";");
sw.WriteLine("终结符:" + endSymbols + ";");
// 写入最大状态数和符号集
sw.WriteLine("最大状态数:" + maxStateNum);
sw.WriteLine("符号集:" + symbolSet + ";");
// 写入转移表
for (int i = 0; i < listView2.Items.Count; i++)
{
string startState = listView2.Items[i].SubItems[0].Text;
string symbol = listView2.Items[i].SubItems[1].Text;
string nextState = listView2.Items[i].SubItems[2].Text;
sw.WriteLine(startState + "\t" + symbol + "\t" + nextState);
}
}
MessageBox.Show("文件保存成功!");
}
private void button6_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "DFA文件|*.txt"; openFileDialog.Title = "打开DFA文件"; if (openFileDialog.ShowDialog() == DialogResult.OK) { // 读取文件内容 string[] lines = File.ReadAllLines(openFileDialog.FileName);
// 获取开始符和终结符
string startSymbol = lines[0].Substring(lines[0].IndexOf(":") + 1, lines[0].Length - lines[0].IndexOf(":") - 2);
string[] endSymbols = lines[1].Substring(lines[1].IndexOf(":") + 1, lines[1].Length - lines[1].IndexOf(":") - 2).Split(';');
// 获取最大状态数和符号集
int maxStateNum = int.Parse(lines[2].Substring(lines[2].IndexOf(":") + 1));
string symbolSet = lines[3].Substring(lines[3].IndexOf(":") + 1, lines[3].Length - lines[3].IndexOf(":") - 2);
// 清空listView2容器
listView2.Items.Clear();
// 添加起始状态、接受符号、到达状态三列
listView2.Columns.Add("起始状态", 100, HorizontalAlignment.Center);
listView2.Columns.Add("接受符号", 100, HorizontalAlignment.Center);
listView2.Columns.Add("到达状态", 100, HorizontalAlignment.Center);
// 添加转移表内容
for (int i = 4; i < lines.Length; i++)
{
string[] line = lines[i].Split('\t');
ListViewItem item = new ListViewItem(line[0]);
item.SubItems.Add(line[1]);
item.SubItems.Add(line[2]);
listView2.Items.Add(item);
}
MessageBox.Show("文件读取成功!");
}
}
原文地址: https://www.cveoy.top/t/topic/nsfK 著作权归作者所有。请勿转载和采集!