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

📄 doing.cs

📁 实现LL1文法
💻 CS
📖 第 1 页 / 共 2 页
字号:
                                                            if (!IsInString(temp2[j1], temp))
                                                            {
                                                                temp[NumOfFollow++] = temp2[j1];
                                                            }
                                                        }
                                                    }
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                }
                                else 
                                {
                                    if (!IsInString(temp0[0], temp)) 
                                    {
                                        temp[NumOfFollow++] = temp0[0];
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return temp;
        }
        public void Made_FenxiTable()
        {
            bool bl=true;
            Ff = new FirstFollow[NumOfNonTerminal];
            Fenxibiao = new FenxiTable(Terminal,NonTerminal);
            Wenfa wf = new Wenfa();
            for (int i = 0; i < NumOfNonTerminal; i++) 
            {
                Ff[i] = new FirstFollow();
                Ff[i].Symbols = NonTerminal[i];
                char[] aas = new char[1];
                Ff[i].first = First(NonTerminal[i]);
            }
            for (int i = 0; i < NumOfNonTerminal; i++)
            {
                Ff[i].follow = Follow(NonTerminal[i]);
            }
            
            for (int i = 0; i < NumOfNonTerminal; i++) 
            {
                Console.Write("\n非终结符"+NonTerminal[i]+"\n  First 集是:");
                for(int j=0;Ff[i].first[j]!='\0';j++)
                {
                    Console.Write("  "+Ff[i].first[j]);
                }
                Console.Write("\n  Follow集是:");
                for (int j = 0; Ff[i].follow[j] != '\0'; j++)
                {
                    Console.Write("  " + Ff[i].follow[j]);
                }
            }
            for (int i0 = 0; i0 < Gram.Get_NumOfWenfa(); i0++)
            {
                wf = Gram.Get_Wenfa(i0);
                {
                    if (!IsInString('e', Ff[GetPos(wf.Wenfa_Left)].first))
                    {
                        int len = charlength(Ff[GetPos(wf.Wenfa_Left)].first);
                        for (int i1 = 0; i1 < len; i1++)
                        {
                            bl = Fenxibiao.Add(Ff[GetPos(wf.Wenfa_Left)].first[i1], wf);
                            if (!bl)
                            {
                                Console.Write("\n 在分析表的M[" + wf.Wenfa_Left + ",");
                                Console.Write(Ff[GetPos(wf.Wenfa_Left)].first[i1] + "]项中已有产生式.");
                                Console.Write("\n " + wf.Wenfa_Left + "->");
                                print(wf.Wenfa_Right);
                                Console.Write("和现在要添进的M[" + wf.Wenfa_Left + ",");
                                Console.Write(Ff[GetPos(wf.Wenfa_Left)].first[i1] + "]的产生式发生冲突!");
                                Console.Write("\n 输入的文法不是LL1文法!Q");
                                break;
                            }
                        }
                    }
                    else
                    {
                        if (!IsInString('$', Ff[GetPos(wf.Wenfa_Left)].follow))
                        {
                            bl = Fenxibiao.Add('$', wf);
                            if (!bl)
                            {
                                Console.Write("\n 在分析表的M[" + wf.Wenfa_Left + ",$]项中已有产生式.");
                                Console.Write("\n " + wf.Wenfa_Left + "->");
                                print(wf.Wenfa_Right);
                                Console.Write("和现在要添进的M[" + wf.Wenfa_Left + ",$]的产生式发生冲突!");
                                Console.Write("\n 输入的文法不是LL1文法!W");
                                break;
                            }
                        }
                        else
                        {
                            int len = charlength(Ff[GetPos(wf.Wenfa_Left)].follow);
                            for (int i2 = 0; i2 < len; i2++)
                            {
                                bl = Fenxibiao.Add(Ff[GetPos(wf.Wenfa_Left)].follow[i2], wf);
                                if (!bl)
                                {
                                    Console.Write("\n 在分析表的M[" + wf.Wenfa_Left + ",");
                                    Console.Write(Ff[GetPos(wf.Wenfa_Left)].first[i2] + "]项中已有产生式.");
                                    Console.Write("\n " + wf.Wenfa_Left + "->");
                                    print(wf.Wenfa_Right);
                                    Console.Write("和现在要添进的M[" + wf.Wenfa_Left + ",");
                                    Console.Write(Ff[GetPos(wf.Wenfa_Left)].first[i2] + "]的产生式发生冲突!");
                                    Console.Write("\n 输入的文法不是LL1文法!E");
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            Fenxibiao.Output();
        }

        public void MoveSentence(char[] sentence)
        {
            char[] str=new char[20];
            char[] temp0 = new char[50];
            char[] temp1 = new char[50];
            Stack<char> S0=new Stack<char>();
            Stack<char> S1=new Stack<char>();
            int len0 = charlength(str);
            for (int ii = 0; ii < len0; ii++)
            {
                str[ii] = sentence[ii];
            }
            S0.Push('$');
            Console.Write("\n 下面是对");
            print(str);
            Console.Write("进行分析所做的移动:");
            Console.Write("\n ━━━━━━━┯━━━━━━━━━┯━━━━━━━━━");
            Console.Write("\n    STACK      │     输   入      │     输 出 ");
            Console.Write("\n ━━━━━━━┿━━━━━━━━━┿━━━━━━━━━");
            str[len0++] = '$';
            temp0 = str;
            for (int i = len0 - 1; i >= 0; i--) 
            {
                S1.Push(str[i]);
            }
            int len1 = 0;
            temp1[len1++] = '$';
            temp1[len1++] = Gram.Get_StartSymbols();
            S0.Push(Gram.Get_StartSymbols());
            Console.Write("\n  ");
            print(temp1);
            for (int j = 0; j < 13 - charlength(temp1); j++) 
            {
                Console.Write(" ");
            }
            Console.Write("│");
            for (int j = 0; j < 18 - S1.Count; j++) 
            {
                Console.Write(" ");
            }
            print(temp0);
            Console.Write("│");
            bool flag = false;
            char ch = S0.Peek();
            int k = 0;
            while (str[k] != '$' && ch != '$') 
            {
                char ip = str[k];
                ch = S0.Peek();
                if (IsInString(ch, Terminal) || ch == '$')
                {
                    if (ch == ip)
                    {
                        S0.Pop();
                        S1.Pop();
                        k++;
                        for (int k0 = 0; k0 < S1.Count; k0++) 
                        {
                            temp0[k0] = str[k0 + k];
                        }
                        temp1[len1 - 1] = '\0';
                        len1--;
                        Console.Write("\n  ");
                        print(temp1);
                        for (int k1 = 0; k1 < 13 - charlength(temp1); k1++) 
                        {
                            Console.Write(" ");
                        }
                        Console.Write("│");
                        for (int k2 = 0; k2 < 18 - S1.Count; k2++) 
                        {
                            Console.Write(" ");
                        }
                        print(temp0);
                        Console.Write("│");
                    }
                    else 
                    {
                        flag = true;
                        break;
                    }
                }
                else 
                {
                    if(!Fenxibiao.IsEmpty(ch,ip))
                    {
                        Wenfa wf = new Wenfa();
                        wf = Fenxibiao.Get(ch,ip);
                        S0.Pop();
                        temp1[len1 - 1] = '\0';
                        len1--;
                        for (int j = charlength(wf.Wenfa_Right) - 1; j >= 0; j--) 
                        {
                            S0.Push(wf.Wenfa_Right[j]);
                            temp1[len1++] = wf.Wenfa_Right[j];
                        }
                        Console.Write("\n  ");
                        print(temp1);
                        for (int k0 = 0; k0 < 13 - charlength(temp1); k0--)
                        {
                            Console.Write(" ");
                        }
                        Console.Write("│");
                        for (int k0 = 0; k0 < 18 - S1.Count; k0++) 
                        {
                            Console.Write(" ");
                        }
                        print(temp0);
                        Console.Write("│");
                        Console.Write(" "+wf.Wenfa_Left+"->");
                        print(wf.Wenfa_Right);
                    }
                    else
                    {
                        flag = true;
                        break;
                    }
                }
            }
            if (flag)
            {
                Console.Write("\n ━━━━━━━┷━━━━━━━━━┷━━━━━━━━━");
                Console.Write("\n 检测出现错误! 你输入的字符串不是LL1文法。");
                Console.Write("\n 请按任意键继续......");
            }
            else 
            {
                Console.Write("\n ━━━━━━━┷━━━━━━━━━┷━━━━━━━━━");
                Console.Write("\n 检测成功! ");
                Console.Write("\n");
            }
        }

        public void Run() 
        {
            char bl='y';
            char[] sentence=new char[20];
            Get_Grammar();
            Made_FenxiTable();
            while(bl=='y')
            {
                Console.Write("\n\n请输入要验证的字符串:");
                string a=Console.ReadLine();
                sentence = a.ToCharArray();
                MoveSentence(sentence);
                Console.Write("\n是否继续进行验证(y or n)?");
                bl =Convert.ToChar(Console.ReadLine());
            }
        }

        public int charlength(char[] a) 
        {
            int i = 0;
            for (; i<a.Length; i++)
            {
                if (a[i] == '\0') 
                {
                    break;
                }
            }
            return i;
        }
        public bool IsInString(char a,char [] b) 
        {
            for (int i = 0; b[i] != '\0'; i++) 
            {
                if (b[i] == a) 
                {
                    return true;
                }
            }
            return false;
        }
        public int GetPos(char ch) 
        {
            int j = 0;
            for (int i=0; i < NumOfNonTerminal; i++) 
            {
                if (ch == Ff[i].Symbols)
                {
                    j = i;
                    break;
                }
            }
            return j;
        }
        public void print(char[] a) 
        {
            for (int i = 0; i < charlength(a); i++) 
            {
                Console.Write(a[i]);
            }
        }
    }
}

⌨️ 快捷键说明

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