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

📄 form1.cs

📁 编译原理实验中的词法分析器,软件有待改进 但基本可用
💻 CS
📖 第 1 页 / 共 2 页
字号:

        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (richTextBox1.Text[richTextBox1.Text.Length - 1] != ';')
            {
                richTextBox3.Text+="无终结符!"+"\r\n";
                return;
            }
            richTextBox3.Text = "";
            richTextBox2.Text = "";
            zhifuclass zhifuclsm = new zhifuclass();
            zhifuclsm.isVT=true;
            zhifuclsm.yuanvalue = Convert.ToString('#');
            zhifuclsm.zhuanhuavalue = '#';
            zhifuls.Add(0, zhifuclsm);
            zhifulslen++;
            if (richTextBox1.Text == "")
            {
                MessageBox.Show("没有表达式,无法完成分析" + "\r\n" + "请您输入或选择表达式");
                return;
            }
            GetChar();
            while (ch != ';')
            {
                strToken = null;
                GetBC();
                if (IsLetter())
                {
                    while (IsLetter() || IsDigit())
                    {
                        Concat();
                        GetChar();

                    }
                    Retract();
                    InsertId();
                    //richTextBox2.Text += strToken + "     " + "字符" + "\r\n";
                    zhifuclass zhifucl = new zhifuclass();
                    zhifucl.isVT = true;
                    zhifucl.yuanvalue = strToken;
                    zhifucl.zhuanhuavalue = 'i';
                    zhifuls.Add(zhifulslen,zhifucl);
                    zhifulslen++;
                }
                else if (IsDigit())
                {
                    while (IsDigit())
                    {
                        Concat();
                        GetChar();
                    }
                    Retract();
                    InsertConst();
                    //richTextBox2.Text += strToken + "     " + "常量" + "\r\n";
                    zhifuclass zhifucl = new zhifuclass();
                    zhifucl.isVT = true;
                    zhifucl.yuanvalue = strToken;
                    zhifucl.zhuanhuavalue = 'i';
                    zhifuls.Add(zhifulslen, zhifucl);
                    zhifulslen++;
                }
                else if (ch == '(')
                {
                    //richTextBox2.Text += ch + "     " + "分隔符" + "\r\n";
                    zhifuclass zhifucl = new zhifuclass();
                    zhifucl.isVT = true;
                    zhifucl.yuanvalue = Convert.ToString(ch);
                    zhifucl.zhuanhuavalue = '(';
                    zhifuls.Add(zhifulslen, zhifucl);
                    zhifulslen++;

                }
                else if (ch == ')')
                {
                    //richTextBox2.Text += ch + "     " + "分隔符" + "\r\n";
                    zhifuclass zhifucl = new zhifuclass();
                    zhifucl.isVT = true;
                    zhifucl.yuanvalue = Convert.ToString(ch);
                    zhifucl.zhuanhuavalue = ')';
                    zhifuls.Add(zhifulslen, zhifucl);
                    zhifulslen++;
                }
                else if (ch == '=')
                {
                    //richTextBox2.Text += ch + "     " + "分隔符" + "\r\n";
                    zhifuclass zhifucl = new zhifuclass();
                    zhifucl.isVT = true;
                    zhifucl.yuanvalue = Convert.ToString(ch);
                    zhifucl.zhuanhuavalue = '=';
                    zhifuls.Add(zhifulslen, zhifucl);
                    zhifulslen++;
                }
                
                else if (ch == '+')
                {
                    //richTextBox2.Text += ch + "     " + "分隔符" + "\r\n";
                    zhifuclass zhifucl = new zhifuclass();
                    zhifucl.isVT = true;
                    zhifucl.yuanvalue = Convert.ToString(ch);
                    zhifucl.zhuanhuavalue = '+';
                    zhifuls.Add(zhifulslen, zhifucl);
                    zhifulslen++;
                }
                else if (ch =='-')
                {
                    //richTextBox2.Text += ch + "     " + "分隔符" + "\r\n";
                    zhifuclass zhifucl = new zhifuclass();
                    zhifucl.isVT = true;
                    zhifucl.yuanvalue = Convert.ToString(ch);
                    zhifucl.zhuanhuavalue = '-';
                    zhifuls.Add(zhifulslen, zhifucl);
                    zhifulslen++;
                }
                else if (ch == '*')
                {
                    //richTextBox2.Text += ch + "     " + "分隔符" + "\r\n";
                    zhifuclass zhifucl = new zhifuclass();
                    zhifucl.isVT = true;
                    zhifucl.yuanvalue = Convert.ToString(ch);
                    zhifucl.zhuanhuavalue = '*';
                    zhifuls.Add(zhifulslen, zhifucl);
                    zhifulslen++;
                }
                else if (ch == '/')
                {
                    //richTextBox2.Text += ch + "     " + "分隔符" + "\r\n";
                    zhifuclass zhifucl = new zhifuclass();
                    zhifucl.isVT = true;
                    zhifucl.yuanvalue = Convert.ToString(ch);
                    zhifucl.zhuanhuavalue = '/';
                    zhifuls.Add(zhifulslen, zhifucl);
                    zhifulslen++;
                }
                else
                {
                    richTextBox3.Text+="表达式出错!"+"\r\n";
                }
                GetChar();
            }
            zhifuclass zhifucls=new zhifuclass();
            zhifucls.isVT = true;
            int x=1;
            zhifucls.yuanvalue = Convert.ToString(';');
            zhifucls.zhuanhuavalue = ';';
            zhifuls.Add(zhifulslen, zhifucls);
            int k = 0; scls[] s = new scls[100]; s[k] = new scls(); s[k].E = '#'; s[k].val = Convert.ToString('#');
            int j;
            char EX = 'A';
            char a; int lent = 1; char q;
            bool bl = false;
            for (int i = 0; i < zhifuls.Count; i++)
            {
                if (zhifuls.Values[i].zhuanhuavalue == '=')
                {
                    bl = true;
                    break;
                }
            }
            if (bl==false)
            {
                richTextBox3.Text+="不是表达式"+"\r\n";
                return;
            }
            do
            {
                a = zhifuls.Values[lent].zhuanhuavalue;
                lent++;
                if (isvt(s[k].E))
                    j = k;
                else
                    j = k - 1;
                while (yuxianguanxi(s[j].E, a) == 1)
                {
                    do
                    {
                        q = s[j].E;
                        if (isvt(s[j - 1].E))
                            j = j - 1;
                        else
                            j = j - 2;
                    } while (yuxianguanxi(s[j].E, q) != -1);
                    if ((j + 1) == k)
                    {
                        k = j + 1;
                        s[k].E = EX;
                        EX++;
                        
                    }
                    else
                        if (k - (j + 1) == 1)
                        {
                            
                            k = j + 1;
                            s[k].E = EX;
                            richTextBox2.Text += "(" + Convert.ToString(s[j + 1].val) + "," + Convert.ToString(s[k].val) + "-" + "T" + Convert.ToString(x) + ")" + "\r\n";
                            EX++;
                            x++;
                        }
                        else
                            if (k - (j + 1) == 2)
                            {
                                if ((s[j + 1].E == '(') && s[j + 3].E == ')')
                                {

                                    k = j + 1;
                                    s[k].E = EX;
                                    s[k].val = s[j + 2].val;
                                    EX++;
                                }
                                if ((s[j + 1].E != '(')&&s[j+3].E!=')')
                                {
                                    k = j + 1;
                                    s[k].E = EX;
                                    if (s[k + 1].E != '=')
                                    {
                                        
                                        richTextBox2.Text += "(" + s[j + 2].val + "," + Convert.ToString(s[j + 1].val) + "," + Convert.ToString(s[j + 3].val) + "," + "T" + Convert.ToString(x) + ")"+"\r\n";
                                        
                                        s[k].val = "T" + Convert.ToString(x );
                                        x++;
                                        EX++;
                                    }
                                    if (s[k + 1].E == '=')
                                    {
                                        richTextBox2.Text += "(" + s[j + 2].val + "," + Convert.ToString(s[j + 1].val) + "," + Convert.ToString(s[j + 3].val) + "," + "-" + ")" + "\r\n";
                                        EX++;
                                        x++;
                                    }
                                    
                                }
                            }
                }
                if (((yuxianguanxi(s[j].E, a)) == -1) || ((yuxianguanxi(s[j].E, a)) == 0))
                {
                    k = k + 1;
                    s[k] = new scls();
                    s[k] .E= a;
                    s[k].val = Convert.ToString(zhifuls.Values[lent-1].yuanvalue);
                }
                else
                    richTextBox3.Text+="表达式中存在无优先关系的字符!"+"\r\n";

            } while (a != ';');

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (richTextBox2.Text == "")
            {
                MessageBox.Show("没有表达式,无法完成保存" + "\r\n" + "请您输入或选择表达式");
                return;
            }
            SaveFileDialog savefiledialog = new SaveFileDialog();
            DialogResult result = savefiledialog.ShowDialog();
            if (result == DialogResult.OK)
            {
                filename = savefiledialog.FileName;
                StreamWriter sw;
                try
                {
                    sw = File.CreateText(filename);
                }
                catch
                {
                    MessageBox.Show("文件保存失败");
                    return;
                }
                string str = richTextBox2.Text;
                string[] arrystr = str.Split('\n');
                for (int i = 0; i < arrystr.Length; i++)
                {
                    sw.WriteLine(arrystr[i]);
                }

                sw.Close();
                MessageBox.Show("保存完毕!");
            }


        }
    }
}

⌨️ 快捷键说明

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