Example #1
0
        public void ComputeFollowSet()
        {
            bool FoundLambda = false;

            NonTerminal lhs = Prod[0].lhs as NonTerminal;

            ((IList)lhs.Follow).Add(TokenLookup.TokenKind.EOI);

            do
            {
                FollowSetChanged = false;
                foreach (Production pp in Prod)
                {
                    for (int j = 0; j < pp.rhs.Count; j++)
                    {
                        FoundLambda = ComputeFirstSetHelper(pp, j);
                        if (FoundLambda)
                        {
                            NonTerminal nt = pp.rhs[j] as NonTerminal;
                            if (nt == null)
                            {
                                continue;
                            }
                            foreach (TokenLookup.TokenKind tok in ((NonTerminal)pp.lhs).Follow)
                            {
                                if (!((IList)nt.Follow).Contains(tok))
                                {
                                    ((IList)nt.Follow).Add(tok);
                                }
                            }
                        }
                    }
                }
            } while (FollowSetChanged);
        }
Example #2
0
        public bool ComputeProductionFirstSet(Production pp)
        {
            int  k        = 0;
            bool Continue = false;

            k = 0;
            NonTerminal lhs = pp.lhs as NonTerminal;

            do
            {
                Continue = false;
                NonTerminal nt = pp.rhs[k] as NonTerminal;
                if (nt != null)
                {
                    foreach (TokenLookup.TokenKind tok in nt.First)
                    {
                        if (tok != TokenLookup.TokenKind.Lambda)
                        {
                            Production p = (Production)M[(int)lhs.Category, (int)tok];
                            if (p != null && p.prodno != pp.prodno)
                            {
                                MessageBox.Show("duplicate table entry productions : " + p.prodno + " and " + pp.prodno +
                                                " category " + lhs.Category + " token " + tok);
                            }
                            else
                            {
                                M[(int)lhs.Category, (int)tok] = pp;
                            }
                        }
                        else
                        {
                            Continue = true;
                        }
                    }
                }
                else
                {
                    Terminal t = pp.rhs[k] as Terminal;
                    if (t.Token != TokenLookup.TokenKind.Lambda)
                    {
                        Production p = (Production)M[(int)lhs.Category, (int)t.Token];
                        if (p != null && p.prodno != pp.prodno)
                        {
                            MessageBox.Show("duplicate table entry productions : " + p.prodno + " and " + pp.prodno +
                                            " category " + lhs.Category + " token " + t.Token);
                        }
                        else
                        {
                            M[(int)lhs.Category, (int)t.Token] = pp;
                        }
                    }
                    else
                    {
                        Continue = true;
                    }
                }
                k = k + 1;
            } while (Continue && k <= pp.rhs.Count - 1);
            return(Continue);
        }
Example #3
0
        public bool ComputeFirstSetHelper(Production pp, int index)
        {
            int         k        = 0;
            bool        Continue = false;
            NonTerminal lhs      = null;

            if (index == pp.rhs.Count - 1)
            {
                return(true);
            }

            lhs = pp.rhs[index] as NonTerminal;
            if (lhs == null)
            {
                return(false);
            }
            k = index + 1;

            do
            {
                Continue = false;
                NonTerminal nt = pp.rhs[k] as NonTerminal;
                if (nt != null)
                {
                    foreach (TokenLookup.TokenKind tok in nt.First)
                    {
                        if (tok != TokenLookup.TokenKind.Lambda && !((IList)lhs.Follow).Contains(tok))
                        {
                            ((IList)lhs.Follow).Add(tok);
                            lhs.Follow.HasChanged = true;
                        }
                        if (tok == TokenLookup.TokenKind.Lambda)
                        {
                            Continue = true;
                        }
                    }
                }
                else
                {
                    Terminal t = pp.rhs[k] as Terminal;
                    if (t.Token != TokenLookup.TokenKind.Lambda && !((IList)lhs.Follow).Contains(t.Token))
                    {
                        ((IList)lhs.Follow).Add(t.Token);
                        lhs.Follow.HasChanged = true;
                    }
                    if (t.Token == TokenLookup.TokenKind.Lambda)
                    {
                        Continue = true;
                    }
                }
                k = k + 1;
            } while (Continue && k <= pp.rhs.Count - 1);

            return(Continue);
        }
Example #4
0
        public NonTerminal FindNTermByName(string name)
        {
            NonTerminal nt = null;

            nt = (NonTerminal)HashNTerm[name];
            if (nt == null)
            {
                MessageBox.Show(" NonTerminal " + name + " does not exist");
                return(null);
            }
            return(nt);
        }
Example #5
0
 private Production FindLambdaProduction(NonTerminal lhs)
 {
     foreach (Production pp in Prod)
     {
         Terminal t = pp.rhs[0] as Terminal;
         if (t == null)
         {
             continue;
         }
         if (pp.lhs == lhs && t.Token == TokenLookup.TokenKind.Lambda)
         {
             return(pp);
         }
     }
     return(null);
 }
Example #6
0
        /// <summary>
        /// 预测分析表
        /// </summary>
        public void FillTable()
        {
            bool       FoundLambda = false;
            Production lpp         = null;

            M = (Production[, ]) new Production[NTerm.Count, Term.Count];

            foreach (Production pp in Prod)
            {
                FoundLambda = ComputeProductionFirstSet(pp);
                if (FoundLambda)
                {
                    NonTerminal lhs = pp.lhs as NonTerminal;
                    lpp = FindLambdaProduction(lhs);
                    if (lpp == null)
                    {
                        continue;
                    }
                    foreach (TokenLookup.TokenKind tok in lhs.Follow)
                    {
                        if (tok == TokenLookup.TokenKind.UnKnown)
                        {
                            continue;
                        }
                        Production p = (Production)M[(int)lhs.Category, (int)tok]; // first set has precedence
                        if (p == null)
                        {
                            M[(int)lhs.Category, (int)tok] = lpp;
                            //        MessageBox.Show("duplicate table entry productions : " + p.prodno + " and " + pp.prodno +
                            //            " category " + lhs.Category + " token " + tok);
                        }
                        //else
                    }
                }
            }
        }
Example #7
0
        public void ComputeFirstSet()
        {
            int         k           = 0;
            bool        FoundLambda = false;
            bool        Continue    = true;
            NonTerminal lhs         = null;

            foreach (Terminal term in Term)
            {
                ((IList)term.First).Add(term.Token);
            }
            do
            {
                FirstSetChanged = false;
                foreach (Production pp in Prod)
                {
                    k        = 0;
                    Continue = true;
                    while (Continue && k <= pp.rhs.Count - 1)
                    {
                        NonTerminal nt = pp.rhs[k] as NonTerminal;
                        if (nt != null)
                        {
                            FoundLambda = false;
                            foreach (TokenLookup.TokenKind tok in nt.First)
                            {
                                lhs = pp.lhs as NonTerminal;
                                if (tok != TokenLookup.TokenKind.Lambda && !((IList)lhs.First).Contains(tok))
                                {
                                    ((IList)lhs.First).Add(tok);
                                    lhs.First.HasChanged = true;
                                }
                                if (tok == TokenLookup.TokenKind.Lambda)
                                {
                                    FoundLambda = true;
                                }
                            }
                            Continue = FoundLambda;
                        }
                        else
                        {
                            FoundLambda = false;
                            Terminal t = pp.rhs[k] as Terminal;
                            lhs = pp.lhs as NonTerminal;

                            if (t.Token != TokenLookup.TokenKind.Lambda && !((IList)lhs.First).Contains(t.Token))
                            {
                                ((IList)lhs.First).Add(t.Token);
                                lhs.First.HasChanged = true;
                            }
                            if (t.Token == TokenLookup.TokenKind.Lambda)
                            {
                                FoundLambda = true;
                            }
                            Continue = FoundLambda;
                        }
                        k = k + 1;
                    }
                    if (Continue && !((IList)lhs.First).Contains(TokenLookup.TokenKind.Lambda))
                    {
                        ((IList)lhs.First).Add(TokenLookup.TokenKind.Lambda);
                        lhs.First.HasChanged = true;
                    }
                }
            } while (FirstSetChanged);
        }