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

📄 doing.cs

📁 实现LL1文法
💻 CS
📖 第 1 页 / 共 2 页
字号:
using System;
using System.Collections.Generic;
using System.Text;

namespace LL1
{
    class doing
    {
        private Grammar Gram;
        private FenxiTable Fenxibiao;
        private FirstFollow[] Ff;
        private char[] Terminal;
        private char[] NonTerminal;
        private int NumOfWenfa;
        private int NumOfTerminal;
        private int NumOfNonTerminal;

        public doing()
        {
            Terminal = new char[20];
            NonTerminal = new char[30];
            NumOfWenfa = 0;
            NumOfTerminal = 0;
            NumOfNonTerminal = 0;
            Gram = new Grammar();
        }

        public void Get_Grammar()
        {
            Console.Write("请你输入文法的条数:");
            NumOfWenfa =Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("\n请输入你的文法(如S→DE|a|e 终结符用小写,非终结符用大写,e表示空串):");
            char[] st=new char[20];
            for (int i = 0; i < NumOfWenfa; i++) 
            {
                int j=i+1;
                int k=0;
                char[] temp=new char[20];
                Console.Write(" "+j.ToString()+": ");            
                string aaa =Console.ReadLine();
                st=aaa.ToCharArray();
                NonTerminal[NumOfNonTerminal++]=st[0];
                if (i == 0) { Gram.Set_StartSymbols(st[0]); }
                for (int m = 3;m<aaa.Length; m++) 
                {
                    if (st[m] == '|')
                    {
                        Gram.Insert_Wenfa(st[0], temp);
                        temp = new char[20];
                        k=0;
                    }
                    else 
                    {
                        temp[k]=st[m];
                        k++;
                        if (m == (aaa.Length - 1))
                        {
                            Gram.Insert_Wenfa(st[0],temp);
                            temp = new char[20];
                            k = 0;
                        }
                    }
                }
                for (int m = 3; m<aaa.Length;m++)
                {
                    if ((!char.IsUpper(st[m])) && (st[m] != '|') && (st[m] != 'e'))
                    {
                        int n = 0;
                        for (; n < NumOfTerminal; n++) 
                        {
                            if (st[m] == Terminal[n])
                                break;
                        }
                        if(n==NumOfTerminal)
                        {
                            Terminal[NumOfTerminal++]=st[m];
                        }
                    }
                }
            }
            Console.Clear();
            Console.WriteLine("你输入的文法是:");
            Wenfa wf=new Wenfa();
            for (int i = 0; i < Gram.Get_NumOfWenfa(); i++) 
            {
                int j=i+1;
                wf = Gram.Get_Wenfa(i);
                char[] a = new char[20];
                Console.Write(" "+j.ToString()+": "+wf.Wenfa_Left+"->");
                Console.WriteLine(wf.Wenfa_Right);
            }
            Console.WriteLine("\n非终结符是:");
            for (int i = 0; i < NumOfNonTerminal; i++) 
            {
                Console.Write("    "+NonTerminal[i]);
            }
            Console.WriteLine("\n终结符是:");
            for (int i = 0; i < NumOfTerminal; i++) 
            {
                Console.Write("    "+Terminal[i]);
            }
            Terminal[NumOfTerminal++]='$';
        }
        public char[] First(char Symbols) 
        {
            char[] ft = new char[20];
            int NumOfFirst=0;
            if (char.IsUpper(Symbols))
            {
                for (int j = 0; j < Gram.Get_NumOfWenfa(); j++)
                {
                    Wenfa wff = new Wenfa();
                    wff = Gram.Get_Wenfa(j);
                    if (wff.Wenfa_Left == Symbols)
                    {
                        if (wff.Wenfa_Right[0] == 'e')
                        {
                            if (!IsInString('e', ft))
                            {
                                ft[NumOfFirst++] = 'e';
                            }
                        }
                        else
                        {
                            int h = 0;
                            for (; h < charlength(wff.Wenfa_Right); h++)
                            {
                                char[] dd = new char[20];
                                char[] aa = new char[20];
                                dd = First(wff.Wenfa_Right[h]);
                                for (int hh = 0; dd[hh] != '\0'; hh++)
                                {
                                    if (!IsInString(dd[hh],ft))
                                    {
                                        ft[NumOfFirst++] = dd[hh];
                                    }
                                }
                                if (ft[NumOfFirst-1]!='e')
                                {
                                    break;
                                }
                            }
                            if (h == charlength(wff.Wenfa_Right))
                            {
                                if (!IsInString('e', ft))
                                {
                                    ft[NumOfFirst++] = 'e';
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                if (!IsInString(Symbols, ft))
                {
                    ft[NumOfFirst++] = Symbols;
                }
            }
            return ft;
        }
        public char[] Follow(char Symbols) 
        {
            int count=0;
            int NumOfFollow=0;
            Wenfa wf = new Wenfa();
            char[] temp = new char[20];
            char[] temp0 = new char[20];
            char[] temp1 = new char[20];
            char[] temp2 = new char[20];
            if (Symbols == Gram.Get_StartSymbols())
            {
                temp[NumOfFollow++] = '$';
            }
            for(int i0=0;i0<Gram.Get_NumOfWenfa();i0++)
            {
                wf = Gram.Get_Wenfa(i0);
                if (IsInString(Symbols, wf.Wenfa_Right)) 
                {
                    for (int i1=0; wf.Wenfa_Right[i1] != '\0'; i1++) 
                    {
                        if (wf.Wenfa_Right[i1] == Symbols) 
                        {
                            for (int i2 = i1 + 1; wf.Wenfa_Right[i2] != '\0'; i2++) 
                            {
                                temp0[count] = wf.Wenfa_Right[i2];
                            }
                            if (charlength(temp0) == 0)
                            {
                                if (wf.Wenfa_Left != Symbols)
                                {
                                    for (int i3 = 0; i3 < NumOfNonTerminal; i3++)
                                    {
                                        if (Ff[i3].Symbols == wf.Wenfa_Left)
                                        {
                                            if (Ff[i3].follow[0] != '\0')
                                            {
                                                for (int i4 = 0; i4 < charlength(Ff[i3].follow); i4++)
                                                {
                                                    if (!IsInString(Ff[i3].follow[i4], temp))
                                                    {
                                                        temp[NumOfFollow++] = Ff[i3].follow[i4];
                                                    }
                                                }
                                            }
                                            else
                                            {
                                                temp1 = Follow(wf.Wenfa_Left);
                                                for (int i4 = 0; i4 < charlength(temp1); i4++)
                                                {
                                                    if (!IsInString(temp1[i4], temp))
                                                    {
                                                        temp[NumOfFollow++] = temp1[i4];
                                                    }
                                                }
                                            }
                                            break;
                                        }
                                    }
                                }
                            }
                            else
                            {
                                int i5 = 0;
                                int i6=0;
                                bool bl=true;
                                if (char.IsUpper(temp0[0]))
                                {
                                    while(bl)
                                    {
                                        for(;i5<NumOfNonTerminal;i5++)
                                        {
                                            if(Ff[i5].Symbols==temp0[i6])
                                            {
                                                for(int i7=0;Ff[i5].first[i7]!='\0';i7++)
                                                {
                                                    if((!IsInString(Ff[i5].first[i7],temp))&&(Ff[i5].first[i7]!='e'))
                                                    {
                                                        temp[NumOfFollow++]=Ff[i5].first[i7];
                                                    }
                                                }
                                                break;
                                            }
                                        }
                                        if (IsInString('e', Ff[i5].first))
                                        {
                                            i6 = i6 + 1;
                                            if (!char.IsUpper(temp0[i6]))
                                            {
                                                if ((!IsInString(temp0[i6], temp))&&(temp0[i6]!='\0'))
                                                {
                                                    temp[NumOfFollow++] = temp0[i6];
                                                }
                                                bl = false;
                                            }
                                            else 
                                            {
                                                bl = true;
                                            }
                                        }
                                        else
                                        {
                                            bl = false;
                                        }
                                    }
                                    int i8 = 0;
                                    bool bbll = true;
                                    for (; temp0[i8] != '\0'; i8++) 
                                    {
                                        if (!char.IsUpper(temp0[i8])) 
                                        {
                                            bbll = false;
                                            break;
                                        }
                                    }
                                    if (i8 == charlength(temp0)) 
                                    {
                                        for (int i9 = 0; temp0[i9] != '\0'; i9++) 
                                        {
                                            for (int i10=0; i10 < NumOfNonTerminal;i10++)
                                            {
                                                if (Ff[i10].Symbols == temp0[i9]) 
                                                {
                                                    if (!IsInString('e', Ff[i10].first)) 
                                                    {
                                                        bbll = false;
                                                    }
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                    if (bbll) 
                                    {
                                        if (wf.Wenfa_Left != Symbols)
                                        {
                                            for (int j0 = 0; j0 < NumOfNonTerminal; j0++)
                                            {
                                                if (Ff[j0].Symbols == wf.Wenfa_Left)
                                                {
                                                    if (Ff[j0].follow[0] != '\0')
                                                    {
                                                        for (int j1 = 0;j1 < charlength(Ff[j0].follow); j1++)
                                                        {
                                                            if (!IsInString(Ff[j0].follow[j1], temp))
                                                            {
                                                                temp[NumOfFollow++] = Ff[j0].follow[j1];
                                                            }
                                                        }
                                                    }
                                                    else
                                                    {
                                                        temp2 = Follow(wf.Wenfa_Left);
                                                        for (int j1 = 0; j1 < charlength(temp1); j1++)
                                                        {

⌨️ 快捷键说明

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