using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace byyljxfzxt
{
    public partial class Form4 : Form
    {
        // ... 其他成员变量和方法 ...

        private void button7_Click(object sender, EventArgs e)
        {
            // 判断输入是否为空
            if (string.IsNullOrWhiteSpace(textBox1.Text))
            {
                MessageBox.Show('输入为空,分析失败');
                return;
            }

            // 初始化分析器
            string text = textBox1.Text;
            analyse = new Stack<char>();
            input = new Stack<char>();
            result_analys = new List<string>();
            result_input = new List<string>();
            result_parse = new List<string>();
            analyse.Push('#');
            analyse.Push(production.Keys.First()[0]);
            input.Push('#');
            for (int i = text.Length - 1; i >= 0; i--)
            {
                input.Push(text[i]);
            }

            // 进行语法分析
            while (true)
            {
                // 如果分析栈栈顶元素为终结符
                if (!char.IsUpper(analyse.Peek()))
                {
                    // 当两个栈都只剩下#时,说明匹配成功
                    if (analyse.Peek() == input.Peek() && analyse.Count == 1 && input.Count == 1)
                    {
                        result_parse.Add('成功');
                        break;
                    }
                    if (analyse.Peek() == input.Peek())
                    {
                        result_parse.Add("'"+ analyse.Peek() + "'匹配");
                        analyse.Pop();
                        input.Pop();
                        result_analys.Add(new string(analyse.Reverse().ToArray()));
                        result_input.Add(new string(input.Reverse().ToArray()));
                        continue;
                    }
                    else
                    {
                        result_parse.Add('失败');
                        break;
                    }
                }

                // 如果分析栈栈顶元素为非终结符
                string nonterminal = analyse.Peek().ToString();
                string terminal = input.Peek().ToString();
                if (!table.ContainsKey(nonterminal) || !table[nonterminal].ContainsKey(terminal))
                {
                    result_parse.Add('失败');
                    break;
                }
                string production = table[nonterminal][terminal];
                result_parse.Add(nonterminal + '->' + production);
                analyse.Pop();
                if (production != '#')
                {
                    for (int i = production.Length - 1; i >= 0; i--)
                    {
                        analyse.Push(production[i]);
                    }
                }
                result_analys.Add(new string(analyse.Reverse().ToArray()));
                result_input.Add(new string(input.Reverse().ToArray()));
            }

            // ... 在listView4中展示分析过程 ...

            button8.Enabled = true;
            button9.Enabled = true;
        }
        // ... 其他成员变量和方法 ...
    }
}

代码说明:

  • 这段代码实现了LL(1)语法分析器的核心分析逻辑,并记录了每一步分析过程中的分析栈、输入栈和推导过程。
  • analyse 表示分析栈,input 表示输入栈,result_analysresult_inputresult_parse 分别存储每一步的分析栈、输入栈和推导结果。
  • button7_Click 方法中,首先初始化分析器,然后进行语法分析,最后将分析过程展示在 listView4 控件中。
  • 你需要根据你的实际需求,补充完整 // ... 部分的代码,例如:
    • 从用户界面获取文法规则和输入串。
    • 计算 FIRST 集、FOLLOW 集和预测分析表。
    • listView4 控件中展示分析过程。

可视化分析过程:

你可以使用 ListView 控件来展示分析过程,例如:

  1. 设置 ListView 控件的 View 属性为 Details
  2. 添加列:步骤、分析栈、输入栈、推导所用产生式或匹配。
  3. 每次循环结束后,将当前步骤、分析栈、输入栈和推导结果添加到 ListView 控件中。

这样,用户就可以清晰地看到每一步分析过程中的分析栈、输入栈和推导过程,方便学习和理解LL(1)语法分析算法。

C#实现LL(1)语法分析器,可视化分析栈、输入栈和每一步推导过程

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

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