LL(1) 文法语法分析器实现:详解分析结果函数
void analyseresult()
{
var selects = select.getselects();
analyseStack.Push('#');
analyseStack.Push(selects.First().Key[0]);
inputStack.Push('#');
for (int i = text.Length - 1; i >= 0; i--)
inputStack.Push(text[i]);
resultAnalyse.Add(analyseStack.ToString());
resultInput.Add(inputStack.ToString());
while (true)
{
//如果分析栈栈顶元素为终结符
if (IsTerminal(analyseStack.Peek()))
{
//当两个栈都只剩下'#'时,说明匹配成功
if (analyseStack.Peek() == inputStack.Peek() && analyseStack.Count == 1 && inputStack.Count == 1)
{
resultParse.Add('成功');
return;
}
if (analyseStack.Peek() == inputStack.Peek())
{
resultParse.Add(''' + analyseStack.Peek() + ''匹配');
analyseStack.Pop();
inputStack.Pop();
resultAnalyse.Add(analyseStack.ToString());
resultInput.Add(inputStack.ToString());
continue;
}
else
{
resultParse.Add('失败');
return;
}
}
string nonterm = analyseStack.Peek().ToString();
string term = inputStack.Peek().ToString();
// 如果分析表中没有对应的产生式,则出错
if (!table.ContainsKey(nonterm) || !table[nonterm].ContainsKey(term))
{
resultParse.Add('出错');
return;
}
// 获取分析表中的产生式
string production = table[nonterm][term];
// 如果分析表中没有产生式,则出错
if (production == null)
{
resultParse.Add('出错');
return;
}
// 将产生式从分析栈中弹出
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(nonterm + ' -> ' + production);
}
// 如果分析栈和输入栈都为空,则分析成功
if (analyseStack.Count == 0 && inputStack.Count == 0)
{
resultParse.Add('成功');
}
}
原文地址: https://www.cveoy.top/t/topic/fYDG 著作权归作者所有。请勿转载和采集!