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

namespace 语法分析器
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private analyse_sentence analyse;

        private void button7_Click(object sender, EventArgs e)
        {
            Select select = new Select();
            analyse = new analyse_sentence(textBox1.Text, select);
            listView4.Items.Clear();
            for (int i = 0; i < analyse.result_analys.Count; i++)
            {
                ListViewItem item = new ListViewItem(new string[] { analyse.result_analys[i], analyse.result_input[i], '' });
                listView4.Items.Add(item);
            }
        }

        private void button8_Click(object sender, EventArgs e)
        {
            if (analyse != null && analyse.result_parse.Count > 0)
            {
                ListViewItem item = listView4.Items[analyse.result_parse.Count - 1];
                item.SubItems[2].Text = analyse.result_parse[analyse.result_parse.Count - 1];
            }
        }

        private void button9_Click(object sender, EventArgs e)
        {
            if (analyse != null)
            {
                for (int i = 0; i < analyse.result_parse.Count; i++)
                {
                    ListViewItem item = listView4.Items[i];
                    item.SubItems[2].Text = analyse.result_parse[i];
                }
            }
        }
    }

    class analyse_sentence
    {
        string text;
        Select select;
        Stack analyse;
        Stack input;
        public List<string> result_analys;
        public List<string> result_input;
        public List<string> result_parse;

        public analyse_sentence(string text, Select select)
        {
            this.text = text;
            this.select = select;
            this.analyse = new Stack();
            input = new Stack();
            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(analyse.getString());
            result_input.Add(input.getString());

            while (true)
            {
                //如果分析栈栈顶元素为终结符
                if (IsTerminal(analyse.peek()))
                {
                    //当两个栈都只剩下#时,说明匹配成功
                    if (analyse.peek() == input.peek() && analyse.length() == 1 && input.length() == 1)
                    {
                        result_parse.Add('成功');
                        return;
                    }
                    if (analyse.peek() == input.peek())
                    {
                        result_parse.Add(''' + analyse.peek() + ''匹配');
                        analyse.pop();
                        input.pop();
                        result_analys.Add(analyse.getString());
                        result_input.Add(input.getString());
                        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(analyse.getString());
                        result_input.Add(input.getString());
                        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);
        }
    }
}
C#实现语法分析器:解析句子结构

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

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