C# 代码解析错误:堆栈对象 ToString() 方法导致输出错误
问题在于在输出分析串和剩余输出串时,使用了堆栈对象的 ToString 方法,而不是将堆栈中的元素取出后再转化为字符串。修改代码如下:
private void analyze()
{
while (true)
{
// 如果分析栈为空或者输入栈为空,则分析结束
if (analyseStack.Count == 0 || inputStack.Count == 0)
{
break;
}
// 获取分析栈的栈顶元素和输入栈的栈顶元素
char topAnalyse = analyseStack.Peek();
char topInput = inputStack.Peek();
// 如果分析栈的栈顶元素和输入栈的栈顶元素相同,则进行匹配
if (topAnalyse == topInput)
{
// 将匹配的元素从分析栈和输入栈中弹出
analyseStack.Pop();
inputStack.Pop();
// 在分析结果列表中添加匹配信息
resultAnalyse.Add(new string(analyseStack.Reverse().ToArray()));
resultInput.Add(new string(inputStack.Reverse().ToArray()));
resultParse.Add(''' + topAnalyse + ''' + ' 匹配');
}
else
{
// 如果分析栈的栈顶元素为终结符,则出错
if (IsTerminal(topAnalyse))
{
resultParse.Add('出错');
break;
}
else
{
if (!table.ContainsKey(topAnalyse.ToString()) || !table[topAnalyse.ToString()].ContainsKey(topInput.ToString()))
{
resultParse.Add('出错');
break;
}
else
{
// 获取分析表中的产生式
string production = table[topAnalyse.ToString()][topInput.ToString()];
// 如果分析表中没有产生式,则出错
if (production == null)
{
resultParse.Add('出错');
break;
}
else
{
// 将产生式从分析栈中弹出
analyseStack.Pop();
// 如果产生式不是空串,则将产生式中的符号逆序压入分析栈中
if (production != '#' )
{
for (int i = production.Length - 1; i >= 0; i--)
{
analyseStack.Push(production[i]);
}
}
// 在分析结果列表中添加产生式信息
resultAnalyse.Add(new string(analyseStack.Reverse().ToArray()));
resultInput.Add(new string(inputStack.Reverse().ToArray()));
resultParse.Add(topAnalyse + ' -> ' + production);
System.Console.WriteLine(new string(analyseStack.Reverse().ToArray()) + '
');
System.Console.WriteLine(new string(inputStack.Reverse().ToArray()) + '
');
System.Console.WriteLine(topAnalyse + ' -> ' + production + '
');
}
}
}
}
}
// 如果分析栈和输入栈都为空,则分析成功
if (analyseStack.Count == 0 && inputStack.Count == 0)
{
resultParse.Add('成功');
}
}
在修改后的代码中,我们使用了 new string(analyseStack.Reverse().ToArray()) 来将分析栈中的元素取出并转化为字符串,从而正确地输出分析串和剩余输出串。
此外,代码中也针对如下情况进行了优化:
- 将双引号替换为单引号。
- 在
resultParse.Add中,将'匹配'修改为'匹配',使用单引号表示字符常量。 - 将
production != #修改为production != '#',使用双引号表示字符串常量。 - 在
System.Console.WriteLine中添加换行符,以提高代码可读性。
通过这些修改,代码能够更准确地输出分析串和剩余输出串,并提高了代码的可读性和可维护性。
原文地址: http://www.cveoy.top/t/topic/fYD4 著作权归作者所有。请勿转载和采集!