コード例 #1
0
ファイル: LR0.cs プロジェクト: Johnsonscottboger/Compiler-1
        private closure_word go_function(List <Item> tt, char w)
        {
            closure_word fff = new closure_word();

            for (int i = 0; i < tt.Count; i++)
            {
                if (tt[i].VT.IndexOf('.') == tt[i].VT.Length - 1)
                {
                    List <Item> t6 = new List <Item>();
                    t6.Add(tt[i]);
                    fff.closure = t6;


                    List <char> ssa = new List <char>();
                    ssa.Add(' ');
                    fff.word = ssa;
                }
                else
                {
                    if (w == tt[i].VT[tt[i].VT.IndexOf('.') + 1])
                    {
                        string str    = tt[i].VT;
                        string temp_s = "";

                        for (int k = 0; k < str.Length; k++) //取出点后面的字符,并将点后移一位
                        {
                            if (str[k] != '.')
                            {
                                temp_s = temp_s + str[k];
                            }
                            else
                            {
                                temp_s = temp_s + str[k + 1] + '.';
                                k      = k + 1;
                            }
                        }
                        Item ttd = new Item();
                        ttd.VN      = tt[i].VN;
                        ttd.VT      = temp_s;
                        fff.closure = closure(ttd); //获得下一个状态的子集

                        List <char> word_form = new List <char>();

                        for (int ii = 0; ii < fff.closure.Count; ii++)
                        {
                            char aad = ' ';
                            if (fff.closure[ii].VT.IndexOf('.') == fff.closure[ii].VT.Length - 1)
                            {
                            }
                            else
                            {
                                aad = fff.closure[ii].VT[fff.closure[ii].VT.IndexOf('.') + 1];
                            }
                            word_form.Add(aad);
                        }
                        fff.word = word_form;
                        break;
                    }
                }
            }

            return(fff);
        }
コード例 #2
0
ファイル: LR0.cs プロジェクト: Johnsonscottboger/Compiler-1
        private void button7_Click(object sender, EventArgs e)
        {
            List <Item> temp_item = new List <Item>();
            List <char> word_form = new List <char>();

            listView1.Items.Clear();
            L_arc.Clear();
            state_word.Clear();
            temp_I.Clear();
            if (ItemC.Count == 0)
            {
                MessageBox.Show("请先确认文法");
                //  this.Close();
            }
            else
            {
                //---------------------获得起始状态的#_Closure----------------------//

                temp_item.Add(ItemC[0]);
                for (int i = 0; i < ItemC.Count; i++)
                {
                    if (ItemC[i].VN.ToString() == temp_item[0].VT)
                    {
                        Item tt = new Item();
                        tt.VN = ItemC[i].VN;
                        tt.VT = '.' + ItemC[i].VT;
                        temp_item.Add(tt);
                    }
                }
                temp_item[0].VT = '.' + temp_item[0].VT;
                temp_I.Add(temp_item);

                for (int i = 0; i < temp_I[0].Count; i++)
                {
                    char aad = temp_I[0][i].VT[temp_I[0][i].VT.IndexOf('.') + 1];
                    word_form.Add(aad);
                }
                state_word.Add(word_form);

                //----------------------------------------------------------------//
                int tmp2 = 0;
                for (int ii = 0; ii < temp_I.Count; ii++)
                {
                    int tmp_num = temp_I[ii].Count;

                    for (int jj = 0; jj < state_word[ii].Count; jj++)
                    {
                        closure_word cw = new closure_word();
                        cw = go_function(temp_I[ii], state_word[ii][jj]);
                        //--------------------判断是否已经存在--------------------------------//
                        Boolean fla = false;
                        int     num = 0;
                        int     p;
                        for (p = 0; p < temp_I.Count; p++)
                        {
                            if (cw.closure.Count == temp_I[p].Count)
                            {
                                for (int pp = 0; pp < cw.closure.Count; pp++)
                                {
                                    for (int ppp = 0; ppp < cw.closure.Count; ppp++)
                                    {
                                        if ((cw.closure[ppp].VN == temp_I[p][pp].VN) && (cw.closure[ppp].VT == temp_I[p][pp].VT))
                                        {
                                            num++;
                                            break;
                                        }
                                    }
                                }
                                if (num == cw.closure.Count)
                                {
                                    fla = true;
                                    break;
                                }
                                num = 0;
                            }
                        }
                        //----------------------------------------------------------------------------------------//
                        if (fla == false)
                        {
                            tmp_num--;
                            if (tmp_num >= 0)
                            {
                                tmp2++;
                            }
                            state_word.Add(cw.word);
                            temp_I.Add(cw.closure);

                            NFANode ARC = new NFANode();
                            ARC.From = ii;
                            ARC.To   = tmp2;
                            ARC.Word = state_word[ii][jj];
                            L_arc.Add(ARC);
                        }
                        else
                        {
                            fla = false;

                            NFANode ARC = new NFANode();
                            ARC.From = ii;
                            ARC.To   = p;
                            ARC.Word = state_word[ii][jj];
                            L_arc.Add(ARC);
                        }
                    }
                }
                /////////////////////////////////
                listView1.Items.Clear();
                for (int ab = 0; ab < temp_I.Count; ab++)
                {
                    string asf = "";
                    for (int dsf = 0; dsf < temp_I[ab].Count; dsf++)
                    {
                        asf = asf + temp_I[ab][dsf].VN + "->" + temp_I[ab][dsf].VT + "  ";
                    }
                    ListViewItem lvi = new ListViewItem();
                    lvi.Text = ab.ToString();
                    lvi.SubItems.Add(asf);
                    listView1.Items.Add(lvi);
                }
            }
        }