C# 编译原理:语法分析器实现 - analyze() 方法解析
private void analyze()
{
// 判断文法开始符号是否已经在分析栈中
if (!analyseStack.Contains(production.Keys.First().ToString()))
{
// 如果不在分析栈中,则将文法开始符号压入分析栈
analyseStack.Push(production.Keys.First().ToString()[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().ToString())):**将production.Keys.First()改为production.Keys.First().ToString(),因为analyseStack是一个char类型的栈,而production.Keys.First()返回的是一个char类型的值,需要将其转换为字符串才能进行比较。 - **
analyseStack.Push(production.Keys.First().ToString()[0]);:**将production.Keys.First().ToString()转换为字符数组,并取出第一个字符压入分析栈中。
代码逻辑说明:
analyseStack和inputStack分别代表分析栈和输入栈。production代表一个产生式,是一个Dictionary<char, string>类型。table代表分析表,是一个Dictionary<string, Dictionary<string, string>>类型。resultAnalyse、resultInput和resultParse分别用于存储分析结果、输入栈状态和分析步骤。
代码功能:
该代码实现了一个语法分析器,用于根据给定的文法和输入符号串进行语法分析,并输出分析结果。
使用方法:
- 首先定义文法规则,并将其存储在
production字典中。 - 然后定义分析表,并将其存储在
table字典中。 - 最后,调用
analyze()方法,传入输入符号串,即可进行语法分析。
注意:
该代码只是语法分析器的基本实现,还需要根据具体的文法和应用场景进行完善和扩展。
原文地址: https://www.cveoy.top/t/topic/fYD9 著作权归作者所有。请勿转载和采集!