public class 语法分析器
{
    // ... 其他代码 ...

    public void analyse_sentence(string text, selects)
    {
        this.text = text;
        this.select = select;
        this.analyse = new Stack<char>();
        input = new Stack<char>();
        result_analys = new List<string>();
        result_input = new List<string>();
        result_parse = new List<string>();
        analyseresult();
    }

    void analyseresult()
    {
        var selects = select.getselects();
        analyse.Push('#');
        analyse.Push(selects.First().Key[0]);
        input.Push('#');
        for (int i = text.Length - 1; i >= 0; i--)
            input.Push(text[i]);
        result_analys.Add(new string(analyse.Reverse().ToArray()));
        result_input.Add(new string(input.Reverse().ToArray()));

        while (true)
        {
            //如果分析栈栈顶元素为终结符
            if (IsTerminal(analyse.Peek()))
            {
                //当两个栈都只剩下#时,说明匹配成功
                if (analyse.Peek() == input.Peek() && analyse.Count() == 1 && input.Count() == 1)
                {
                    result_parse.Add('成功');
                    return;
                }
                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('失败');
                    return;
                }
            }

            int flag = 0;
            string nofinal = analyse.Peek().ToString();
            string final = input.Peek().ToString();
            foreach (var parse in selects[nofinal])
            {
                if (parse.Value.Contains(final))
                {
                    result_parse.Add(nofinal + '->' + parse.Key);
                    analyse.Pop();
                    //当推出的产生式不为空时,对分析栈进行添加
                    if (!parse.Key.Equals('#'))
                    {
                        addanalyse(parse.Key);
                    }
                    result_analys.Add(new string(analyse.Reverse().ToArray()));
                    result_input.Add(new string(input.Reverse().ToArray()));
                    flag = 1;
                    break;
                }
            }
            //说明该非终结符中没有可推导出该终结符的产生式
            if (flag == 0)
            {
                result_parse.Add('失败');
                return;
            }
        }
    }

    void addanalyse(String t)
    {
        for (int i = t.Length - 1; i >= 0; i--)
        {
            analyse.Push(t[i]);
        }
    }

    static bool IsTerminal(char symbol)
    {
        return !char.IsUpper(symbol);
    }
}

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

    string text = textBox1.Text;
    Grammar grammar = new Grammar();
    grammar.analyse_sentence(text, select);

    listView4.Columns.Clear();
    listView4.Items.Clear();
    listView4.View = View.Details;

    listView4.Columns.Add('步骤', 60, HorizontalAlignment.Center);
    listView4.Columns.Add('分析串', 60, HorizontalAlignment.Center);
    listView4.Columns.Add('剩余输入串', 80, HorizontalAlignment.Center);
    listView4.Columns.Add('推导所用产生式或匹配', 150, HorizontalAlignment.Center);

    button8.Enabled = true;
    button9.Enabled = true;
}

private void button8_Click(object sender, EventArgs e)
{
    if (result_analys.Count == 0 || result_input.Count == 0 || result_parse.Count == 0)
    {
        MessageBox.Show('请先进行语法分析');
        return;
    }

    int step = listView4.Items.Count + 1;
    string analys = result_analys[step - 1];
    string input = result_input[step - 1];
    string parse = result_parse[step - 1];

    ListViewItem item = new ListViewItem(step.ToString());
    item.SubItems.Add(analys);
    item.SubItems.Add(input);
    item.SubItems.Add(parse);

    listView4.Items.Add(item);
}

private void button9_Click(object sender, EventArgs e)
{
    listView4.Items.Clear();
    result_analys.Clear();
    result_input.Clear();
    result_parse.Clear();
    button8.Enabled = false;
    button9.Enabled = false;
}
C# 语法分析器:实现句子分析与可视化

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

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