LL(1)文法语法分析器 - analyze函数代码
private Dictionary<string, Dictionary<string, string>> table;
private void initializeTable()
{
table = new Dictionary<string, Dictionary<string, string>>();
// 添加预测分析表中的产生式
table.Add("E", new Dictionary<string, string>());
table["E"].Add("(", "T E'");
table["E"].Add("num", "T E'");
table.Add("E'", new Dictionary<string, string>());
table["E'"].Add("+", "+ T E'");
table["E'"].Add(")", "#");
table["E'"].Add("$", "#");
table.Add("T", new Dictionary<string, string>());
table["T"].Add("(", "F T'");
table["T"].Add("num", "F T'");
table.Add("T'", new Dictionary<string, string>());
table["T'"].Add("+", "#");
table["T'"].Add("*", "* F T'");
table["T'"].Add(")", "#");
table["T'"].Add("$", "#");
table.Add("F", new Dictionary<string, string>());
table["F"].Add("(", "( E )");
table["F"].Add("num", "num");
}
private void analyze()
{
// 初始化分析栈和输入栈
analyseStack.Push('#');
analyseStack.Push('E');
inputStack.Push('#');
for (int i = text.Length - 1; i >= 0; i--)
{
inputStack.Push(text[i]);
}
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(analyseStack.ToString());
resultInput.Add(inputStack.ToString());
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(analyseStack.ToString());
resultInput.Add(inputStack.ToString());
resultParse.Add(topAnalyse + " -> " + production);
}
}
}
}
}
// 如果分析栈和输入栈都为空,则分析成功
if (analyseStack.Count == 0 && inputStack.Count == 0)
{
resultParse.Add("成功");
}
}
原文地址: https://www.cveoy.top/t/topic/oBP1 著作权归作者所有。请勿转载和采集!