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('成功');
    }
}
LL(1) 文法语法分析器实现:详解分析结果函数

原文地址: https://www.cveoy.top/t/topic/fYDG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录