⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yufa.cs

📁 一个非常好的语法分析器
💻 CS
📖 第 1 页 / 共 2 页
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace 语法分析042791
{
    public partial class yufa : Form
    {
        //临时存放读入的内容
        public char[] Arrayget = null; 

        //存放算符优先表
        char[,] table = new char[10,9];

        //变量
        int i,j,k,l,m,s;

        //判断标志符
        int flag = -1; 
        int vt=0;
        int t=0;
        int find=-1;
      
        //栈
        char[] zhan = new char[50];

        //指向下一个要读入的字符
        char temp=' ';

        //临时标志
        char op=' ';

        public yufa()
        {
            InitializeComponent();
        }

        //得到相应字符在优先表中的索引值
        public int getid(char a)
        {
            int n;
            for (n = 1; n < 9;n++ )
            {
                if (a == table[0, n]) //找到则返回索引
                {
                    return n;
                }
            }
                return 0; 

        }

        private void Bfenxi_Click(object sender, EventArgs e)
        {
            TOut.Text = null;
            string str= null;
            str=T1.Text.ToString();
            str = str + T2.Text.ToString();
            str = str + T3.Text.ToString();
            str = str + T4.Text.ToString();
            str = str + T5.Text.ToString();
            str = str + T6.Text.ToString();
            str = str + T7.Text.ToString();
            str = str + T8.Text.ToString(); //读入终结符
            Arrayget = str.ToCharArray();
            for (i = 1; i <= Arrayget.Length; i++)
                table[0, i] = Arrayget[i - 1]; //终结符存入table表


            str = T9.Text.ToString().Trim();
            str = str + T10.Text.ToString();
            str = str + T11.Text.ToString();
            str = str + T12.Text.ToString();
            str = str + T13.Text.ToString();
            str = str + T14.Text.ToString();
            str = str + T15.Text.ToString();
            str = str + T16.Text.ToString(); //读入列向终结符
            Arrayget = str.ToCharArray();
            for (i = 1; i <= Arrayget.Length; i++)
                table[9, i] = Arrayget[i - 1]; //终结符存入table表

            for (i = 1; i <= Arrayget.Length; i++)   //校对终结符的输入行列方向是否符合
            {
                if (table[0, i] != table[9, i])
                {
                    MessageBox.Show(" 输入的终结符行向与列向不符,请重新校对输入 !");
                    flag = 0;
                    break;
                }
                else flag = 1;
            }

            if (flag == 1) //非终结符输入合法
            {
                str = a11.Text.ToString();
                str = str + a12.Text.ToString();
                str = str + a13.Text.ToString();
                str = str + a14.Text.ToString();
                str = str + a15.Text.ToString();
                str = str + a16.Text.ToString();
                str = str + a17.Text.ToString();
                str = str + a18.Text.ToString(); 
                Arrayget = str.ToCharArray();
                for (i = 1; i <= Arrayget.Length; i++)
                    table[1, i] = Arrayget[i - 1]; //第1行优先级存入table表

                str = a21.Text.ToString();
                str = str + a22.Text.ToString();
                str = str + a23.Text.ToString();
                str = str + a24.Text.ToString();
                str = str + a25.Text.ToString();
                str = str + a26.Text.ToString();
                str = str + a27.Text.ToString();
                str = str + a28.Text.ToString(); 
                Arrayget = str.ToCharArray();
                for (i = 1; i <= Arrayget.Length; i++)
                    table[2, i] = Arrayget[i - 1]; //第2行优先级存入table表

                str = a31.Text.ToString();
                str = str + a32.Text.ToString();
                str = str + a33.Text.ToString();
                str = str + a34.Text.ToString();
                str = str + a35.Text.ToString();
                str = str + a36.Text.ToString();
                str = str + a37.Text.ToString();
                str = str + a38.Text.ToString(); 
                Arrayget = str.ToCharArray();
                for (i = 1; i <= Arrayget.Length; i++)
                    table[3, i] = Arrayget[i - 1]; //第3行优先级存入table表

                str = a41.Text.ToString();
                str = str + a42.Text.ToString();
                str = str + a43.Text.ToString();
                str = str + a44.Text.ToString();
                str = str + a45.Text.ToString();
                str = str + a46.Text.ToString();
                str = str + a47.Text.ToString();
                str = str + a48.Text.ToString(); 
                Arrayget = str.ToCharArray();
                for (i = 1; i <= Arrayget.Length; i++)
                    table[4, i] = Arrayget[i - 1]; //第4行优先级存入table表

                str = a51.Text.ToString();
                str = str + a52.Text.ToString().Trim();
                str = str + a53.Text.ToString().Trim();
                str = str + a54.Text.ToString().Trim();
                str = str + a55.Text.ToString().Trim();
                str = str + a56.Text.ToString().Trim();
                str = str + a57.Text.ToString().Trim();
                str = str + a58.Text.ToString().Trim(); 
                Arrayget = str.ToCharArray();
                for (i = 1; i <= Arrayget.Length; i++)
                    table[5, i] = Arrayget[i - 1]; //第5行优先级存入table表

                str = a61.Text.ToString();
                str = str + a62.Text.ToString();
                str = str + a63.Text.ToString();
                str = str + a64.Text.ToString();
                str = str + a65.Text.ToString();
                str = str + a66.Text.ToString();
                str = str + a67.Text.ToString();
                str = str + a68.Text.ToString(); 
                Arrayget = str.ToCharArray();
                for (i = 1; i <= Arrayget.Length; i++)
                    table[6, i] = Arrayget[i - 1]; //第6行优先级存入table表

                str = a71.Text.ToString();
                str = str + a72.Text.ToString();
                str = str + a73.Text.ToString();
                str = str + a74.Text.ToString();
                str = str + a75.Text.ToString();
                str = str + a76.Text.ToString();
                str = str + a77.Text.ToString();
                str = str + a78.Text.ToString();
                Arrayget = str.ToCharArray();
                for (i = 1; i <= Arrayget.Length; i++)
                    table[7, i] = Arrayget[i - 1]; //第7行优先级存入table表

                str = a81.Text.ToString();
                str = str + a82.Text.ToString();
                str = str + a83.Text.ToString();
                str = str + a84.Text.ToString();
                str = str + a85.Text.ToString();
                str = str + a86.Text.ToString();
                str = str + a87.Text.ToString();
                str = str + a88.Text.ToString();
                Arrayget = str.ToCharArray();
                for (i = 1; i <= Arrayget.Length; i++)
                    table[8, i] = Arrayget[i - 1]; //第8行优先级存入table表  优先级表构造完毕

                //读入要分析的句子
                
                str = Code.Text.ToString().Trim();
                if (str.Length == 0)
                {
                    MessageBox.Show("请输入要分析的句子");
                }
                string getin = str;
                str = str + "#" + "!";
                Arrayget = str.ToCharArray();

                //句子输入不合法,报错
                for (k = 0; k <= Arrayget.Length - 3; k++) 
                {
                    for (i = 1; i <= 8; i++)
                    {
                        if (Arrayget[k] == table[0, i])
                        {
                            find = 1;
                            break;
                        }
                        else
                            find = 0;
                    }
                    if (find == 0)
                    {
                        MessageBox.Show("输入的句子中含有未在优先表中定义的终结符!");
                        break;
                    }
                }

                //分析归约
                k = 0;
                zhan[k] = '#';
                i = 0;
                string putout = null;

                putout = "输入的句子为:    " + getin+ "\r\n";
                putout = putout + "要分析的句子是: #" + getin + "# \r\n\r\n";
                putout = putout + "                      栈的内容为:  #\r\n\r\n";
                string arr;
                do
                {
                     arr = null;
                    temp = Arrayget[i]; //存放要读入的下一个字符
                    putout = putout + "将要读入的字符 " + temp+"\r\n";

                    vt = 0;
                    for (l = 1; l <= 8; l++)
                    {    
                        if (zhan[k] == table[0, l])
                        {

                            j = k;
                            vt = 1;
                            break;
                        }
                    }  //   查询zhan[k]是否是终结符,是则j=k,记录起点
                    if (vt == 0)
                    {
                        j = k - 1;
                    }//  是非终结符,则j=k-1,即跳过这个非终结符,以他前面的终结符为记录起点

                    while (table[getid(zhan[j]), getid(temp)] == '>')//比较起点与要读入的temp的优先级,若起点的优先级高
                    {
                        do
                        {
                            op = zhan[j];    //op暂存起点
                            t = 0;
                            for (l = 1; l <= 8; l++)
                            {
                                if (zhan[j - 1] == table[0, l])
                                {
                                    j = j - 1;
                                    t = 1;
                                    break;
                                }  //查询zhan[j-1]是否是终结符,是则j=j - 1,j-1成为新起点
                            }
                            if (t == 0)
                            {
                                j = j - 2;  //不是,则再向前查询

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -