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 productionRule = table[nonterminal][terminal];
        result_parse.Add(nonterminal + '->' + productionRule);
        analyse.Pop();
        if (productionRule != '#')
        {
            for (int i = productionRule.Length - 1; i >= 0; i--)
            {
                analyse.Push(productionRule[i]);
            }
        }
        result_analys.Add(new string(analyse.Reverse().ToArray()));
        result_input.Add(new string(input.Reverse().ToArray()));
    }

    // 显示分析结果
    for (int i = 0; i < result_analys.Count; i++)
    {
        string step = (i + 1).ToString();
        string analys = result_analys[i];
        string input = result_input[i];
        string parse = result_parse[i];
        listView4.Items.Add(new ListViewItem(new string[] { step, analys, input, parse }));
    }
    button8.Enabled = true;
    button9.Enabled = true;
}
C#语法分析器实现:语句分析与错误处理

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

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