C#语法分析代码示例与错误解决:无法从string转换为char
C#语法分析代码示例与错误解决:无法从string转换为char
本代码示例展示了一个简单的C#语法分析器,用于演示语法分析的基本流程。c#private void analyze(){ // 判断文法开始符号是否已经在分析栈中 if (!analyseStack.Contains(production.Keys.First()[0])) // 修改后的代码 { // 如果不在分析栈中,则将文法开始符号压入分析栈 analyseStack.Push(production.Keys.First()[0]); // 修改后的代码 }
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('成功'); // 修改后的代码 }}
错误分析:
代码中 if (!analyseStack.Contains(production.Keys.First())) 语句出现 '无法从string转换为char' 的错误,是因为 production.Keys.First() 返回的是一个字符串(string),而 analyseStack.Contains() 方法需要的是一个字符(char)类型的参数。
解决方法:
将代码中的 production.Keys.First() 改为 production.Keys.First()[0] 即可。production.Keys.First() 返回第一个键值对的键,它是一个字符串,而 [0] 表示取字符串的第一个字符。
修改后的代码行如下:c#if (!analyseStack.Contains(production.Keys.First()[0]))
希望以上信息能够帮助您理解语法分析的基本流程以及解决代码中出现的错误。
原文地址: https://www.cveoy.top/t/topic/fYEa 著作权归作者所有。请勿转载和采集!