private void analyze()
{
    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('成功');
    }
}
LL(1) 语法分析器实现:C# 代码示例与解析

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

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