public class SentenceAnalyzer
{
    private string text;
    private Dictionary<string, Dictionary<char, string>> select;
    private Stack<char> analyse;
    private Stack<char> input;
    private List<string> result_analys;
    private List<string> result_input;
    private List<string> result_parse;

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

    private void AnalyzeResult()
    {
        analyse.Push('#');
        analyse.Push(select.Keys.First()[0]);
        input.Push('#');
        for (int i = text.Length - 1; i >= 0; i--)
        {
            input.Push(text[i]);
        }

        result_analys.Add(GetString(analyse));
        result_input.Add(GetString(input));

        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(GetString(analyse));
                    result_input.Add(GetString(input));
                    continue;
                }
                else
                {
                    result_parse.Add('失败');
                    return;
                }
            }

            int flag = 0;
            string nofinal = analyse.Peek().ToString();
            string final = input.Peek().ToString();
            foreach (var parse in select[nofinal])
            {
                if (parse.Value.Contains(final))
                {
                    result_parse.Add($'{nofinal}->{parse.Key}');
                    analyse.Pop();
                    if (parse.Key != '#')
                    {
                        AddAnalyse(parse.Key);
                    }
                    result_analys.Add(GetString(analyse));
                    result_input.Add(GetString(input));
                    flag = 1;
                    break;
                }
            }

            if (flag == 0)
            {
                result_parse.Add('失败');
                return;
            }
        }
    }

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

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

    private string GetString(Stack<char> stack)
    {
        return new string(stack.Reverse().ToArray());
    }
}

// 在button9_Click事件处理程序中使用SentenceAnalyzer类
private void button9_Click(object sender, EventArgs e)
{
    listView4.Items.Clear();
    SentenceAnalyzer analyzer = new SentenceAnalyzer(textBox1.Text, production);
    for (int i = 0; i < analyzer.result_analys.Count; i++)
    {
        ListViewItem item = new ListViewItem((i + 1).ToString());
        item.SubItems.Add(analyzer.result_analys[i]);
        item.SubItems.Add(analyzer.result_input[i]);
        item.SubItems.Add(analyzer.result_parse[i]);
        listView4.Items.Add(item);
    }
}
C# 语法分析器:使用栈实现句子分析

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

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