C#实现DFA文件读写功能,并用ListView显示分析结果
private void button8_Click(object sender, EventArgs e) { try { //创建文件流,将DFA写入文件 FileStream fs = new FileStream('DFA.txt', FileMode.Create); StreamWriter sw = new StreamWriter(fs);
//写入开始符
sw.WriteLine('开始符:' + startState + ';');
//写入终结符
string endStatesStr = '';
foreach (int state in endStates)
{
endStatesStr += state + ';';
}
sw.WriteLine('终结符:' + endStatesStr);
//写入最大状态数和符号集
sw.WriteLine('最大状态数:' + maxStateNum);
string symbolsStr = '';
foreach (char symbol in symbols)
{
symbolsStr += symbol + ';';
}
sw.WriteLine('符号集:' + symbolsStr);
//写入状态转移表
for (int i = 0; i < maxStateNum; i++)
{
for (int j = 0; j < symbols.Length; j++)
{
int nextState = transitionTable[i, j];
if (nextState != -1)
{
sw.WriteLine(i + ' ' + symbols[j] + ' ' + nextState);
}
}
}
sw.Close();
fs.Close();
MessageBox.Show('DFA文件保存成功!');
}
catch (Exception ex)
{
MessageBox.Show('DFA文件保存失败:' + ex.Message);
}
}
private void button6_Click(object sender, EventArgs e) { try { //读取DFA文件 FileStream fs = new FileStream('DFA.txt', FileMode.Open); StreamReader sr = new StreamReader(fs);
//读取开始符
string startStateLine = sr.ReadLine();
startState = int.Parse(startStateLine.Split(':')[1].TrimEnd(';'));
//读取终结符
string endStatesLine = sr.ReadLine();
string[] endStatesArr = endStatesLine.Split(':')[1].Split(';');
endStates = new List<int>();
foreach (string stateStr in endStatesArr)
{
if (!string.IsNullOrEmpty(stateStr))
{
endStates.Add(int.Parse(stateStr));
}
}
//读取最大状态数和符号集
string maxStateNumLine = sr.ReadLine();
maxStateNum = int.Parse(maxStateNumLine.Split(':')[1]);
string symbolsLine = sr.ReadLine();
symbols = symbolsLine.Split(':')[1].TrimEnd(';').ToCharArray();
//初始化状态转移表
transitionTable = new int[maxStateNum, symbols.Length];
for (int i = 0; i < maxStateNum; i++)
{
for (int j = 0; j < symbols.Length; j++)
{
transitionTable[i, j] = -1;
}
}
//读取状态转移表
string transitionLine;
while ((transitionLine = sr.ReadLine()) != null)
{
string[] transitionArr = transitionLine.Split(' ');
int currentState = int.Parse(transitionArr[0]);
char symbol = char.Parse(transitionArr[1]);
int nextState = int.Parse(transitionArr[2]);
int symbolIndex = Array.IndexOf(symbols, symbol);
transitionTable[currentState, symbolIndex] = nextState;
}
sr.Close();
fs.Close();
//显示分析结果
listView2.Clear();
listView2.Columns.Add('起始状态');
listView2.Columns.Add('接受符号');
listView2.Columns.Add('到达状态');
for (int i = 0; i < maxStateNum; i++)
{
for (int j = 0; j < symbols.Length; j++)
{
int nextState = transitionTable[i, j];
if (nextState != -1)
{
string[] itemArr = { i.ToString(), symbols[j].ToString(), nextState.ToString() };
listView2.Items.Add(new ListViewItem(itemArr));
}
}
}
}
catch (Exception ex)
{
MessageBox.Show('DFA文件读取失败:' + ex.Message);
}
}
原文地址: https://www.cveoy.top/t/topic/nsfL 著作权归作者所有。请勿转载和采集!