Пример #1
0
        protected void GenerateAllFirstSets()
        {
            bool bChanged = true;

            while (bChanged)
            {
                bChanged = false;
                for (int i = 0; i < m_Rules.Count; i++)
                {
                    MyArrayList FirstSet = new MyArrayList();
                    BNFRule     bnfRl    = (BNFRule)m_Rules[i];
                    RuleStart   strt     = bnfRl.GetStart();
                    if (strt != null)
                    {
                        RuleElement re = strt.GetNext();
                        FirstSet = BetaTotalRuleFirstSet(re);
                    }
                    int FrstSize = 0;
                    if (strt.GetRuleConnect().FirstSet != null)
                    {
                        FrstSize = strt.GetRuleConnect().FirstSet.Count;
                    }
                    strt.GetRuleConnect().FirstSet = ParseHelper.UnionSet(strt.GetRuleConnect().FirstSet, FirstSet);
                    FrstSize = strt.GetRuleConnect().FirstSet.Count - FrstSize;
                    if (FrstSize != 0)
                    {
                        bChanged = true;
                    }
                }
            }
        }
Пример #2
0
        private bool FirstClosureFromRule(MyArrayList Huelle, string Token, MyArrayList FirstSet)
        {
            bool        bChanged = false;
            MyArrayList TkRules  = base.GetStartRulesOneToken(Token);

            if (TkRules != null && Huelle != null)
            {
                for (int i = 0; i < TkRules.Count; i++)
                {
                    RuleStart rs      = (RuleStart)TkRules[i];
                    int       RuleNr  = rs.GetRuleConnect().Index;
                    int       HuelPos = RuleInsideHuelle(Huelle, RuleNr, 1);
                    if (HuelPos < 0)
                    {
                        LR1Element LrElm = new LR1Element(rs.GetRuleConnect().Index, m_HuellenCounter, m_LRMECnter++);
                        LrElm.FirstSet = FirstSet;
                        Huelle.Add(LrElm);
                        bChanged = true;
                    }
                    else
                    {
                        LR1Element LrElm    = (LR1Element)Huelle[HuelPos];
                        int        FrstSize = LrElm.FirstSet.Count;
                        LrElm.FirstSet = ParseHelper.UnionSet(LrElm.FirstSet, FirstSet);
                        if (FrstSize != LrElm.FirstSet.Count)
                        {
                            bChanged = true;
                        }
                    }
                }
            }
            return(bChanged);
        }
Пример #3
0
        protected void CheckEpsilonInRules()
        {
            bool bChanged = true;

            while (bChanged)
            {
                bChanged = false;
                for (int i = 0; i < m_Rules.Count; i++)
                {
                    bool      EpsFree = false;
                    BNFRule   bnfRl   = (BNFRule)m_Rules[i];
                    RuleStart strt    = bnfRl.GetStart();
                    if (strt != null)
                    {
                        RuleElement re = strt.GetNext();
                        EpsFree = BetaTotalRuleEpsFree(re);
                    }
                    if (strt.GetRuleConnect().EpsilonFree != EpsFree)
                    {
                        bChanged = true;
                    }
                    strt.GetRuleConnect().EpsilonFree = EpsFree;
                }
            }
        }
Пример #4
0
        private MyArrayList GenerateFollowList(MyArrayList NonTerms)
        {
            MyArrayList Follows = new MyArrayList();

            for (int i = 0; i < NonTerms.Count; i++)
            {
                RuleElement re     = (RuleElement)NonTerms[i];
                RuleStart   rs     = re.GetBegin();
                BNFRule     rl     = rs.GetRuleConnect();
                RuleElement nextRe = re.GetNext();
                if (nextRe == null)
                {
                    Follows = ParseHelper.UnionSet(Follows, rl.FollowSet);
                }
                else
                {
                    if (nextRe.IsTerminal())
                    {
                        Follows.Add(nextRe);
                    }
                    else
                    {
                        RuleToken   rt          = (RuleToken)nextRe;
                        MyArrayList AllFirstSet = BetaTotalRuleFirstSet(rt);
                        Follows = ParseHelper.UnionSet(Follows, AllFirstSet);
                        if (!BetaTotalRuleEpsFree(rt))
                        {
                            Follows = ParseHelper.UnionSet(Follows, rl.FollowSet);
                        }
                    }
                }
            }
            return(Follows);
        }
Пример #5
0
        protected virtual bool  GenerateParseTable()
        {
            MyArrayList Terminals = GetAllTerminals();

            Terminals.Add(new RuleTerminal(m_EofTerminal, null));
            MyArrayList StartTokens = GetDifStartTokens();

            m_LL1ParseTabelle = new TopDownParseTabelle(Terminals, StartTokens);

            bool dblEntry = false;

            for (int i = 0; i < m_Rules.Count; i++)
            {
                BNFRule   rl  = (BNFRule)m_Rules[i];
                RuleStart rs  = rl.GetStart();
                int       len = rs.GetRuleConnect().FirstSet.Count;
                for (int j = 0; j < len; j++)
                {
                    RuleElement re      = (RuleElement)rs.GetRuleConnect().FirstSet[j];
                    string      colSign = re.GetToken();
                    string      rowSign = rs.GetToken();
                    if (!m_LL1ParseTabelle.Add(colSign, rowSign, rs))
                    {
                        dblEntry = true;
                    }
                }

                if (!rl.EpsilonFree)
                {
                    len = rs.GetRuleConnect().FollowSet.Count;
                    for (int j = 0; j < len; j++)
                    {
                        RuleElement re      = (RuleElement)rs.GetRuleConnect().FollowSet[j];
                        string      colSign = re.GetToken();
                        string      rowSign = rs.GetToken();

                        if (!m_LL1ParseTabelle.Add(colSign, rowSign, rs))
                        {
                            dblEntry = true;
                        }
                    }
                }
            }
            return(!dblEntry);
        }
Пример #6
0
        protected virtual bool RuleIsEpsilonFree(RuleStart rs)
        {
            RuleElement re = null;

            if (rs != null)
            {
                re = rs.GetNext();
            }
            else
            {
                return(false);
            }
            while (re != null)
            {
                if (re.IsTerminal())
                {
                    rs.GetRuleConnect().EpsilonFree = true;
                    return(true);
                }
                else
                {
                    if (re.GetToken().Equals(""))
                    {
                        rs.GetRuleConnect().EpsilonFree = false;
                        return(false);
                    }
                    else
                    {
                        RuleToken rt  = (RuleToken)re;
                        bool      res = RuleIsEpsilonFree(rt.GetConnected());
                        if (res)
                        {
                            rs.GetRuleConnect().EpsilonFree = res;
                            return(res);
                        }
                        else
                        {
                            re = re.GetNext();
                        }
                    }
                }
            }
            rs.GetRuleConnect().EpsilonFree = false;
            return(false);
        }
Пример #7
0
        private MyArrayList TotalRuleFollowSet(RuleStart rs)
        {
            MyArrayList res = new MyArrayList();

            rs = GoToFirstStartRule(rs);
            while (rs != null)
            {
                res = ParseHelper.UnionSet(res, rs.GetRuleConnect().FollowSet);
                rs  = rs.GetAlternate();
            }
            return(res);
        }
Пример #8
0
        private bool FirstClosureFromRule(MyArrayList Huelle, string Token)
        {
            bool        bChanged = false;
            MyArrayList TkRules  = base.GetStartRulesOneToken(Token);

            if (TkRules != null && Huelle != null)
            {
                for (int i = 0; i < TkRules.Count; i++)
                {
                    RuleStart rs     = (RuleStart)TkRules[i];
                    int       RuleNr = rs.GetRuleConnect().Index;
                    if (!IsRuleInsideHuelle(Huelle, RuleNr, 1))
                    {
                        LRElement LrElm = new LRElement(rs.GetRuleConnect().Index, m_HuellenCounter, m_LRMECnter++);
                        Huelle.Add(LrElm);
                        bChanged = true;
                    }
                }
            }
            return(bChanged);
        }
Пример #9
0
        private bool SetAllFollows(RuleStart rs, MyArrayList Follows)
        {
            bool changed = false;

            rs = GoToFirstStartRule(rs);
            while (rs != null)
            {
                int FlwSize = 0;
                if (rs.GetRuleConnect().FollowSet != null)
                {
                    FlwSize = rs.GetRuleConnect().FollowSet.Count;
                }
                rs.GetRuleConnect().FollowSet = ParseHelper.UnionSet(rs.GetRuleConnect().FollowSet, Follows);
                FlwSize = rs.GetRuleConnect().FollowSet.Count - FlwSize;
                if (FlwSize != 0)
                {
                    changed = true;
                }
                rs = rs.GetAlternate();
            }
            return(changed);
        }
Пример #10
0
//		protected virtual void GenerateAllFirstSets()
//		{
//			for(int i=0;i<m_Rules.Count;i++)
//			{
//				BNFRule bnfRl = (BNFRule)m_Rules[i];
//				RuleStart strt = bnfRl.GetStart();
//				strt.GetRuleConnect().FirstSet = GenerateFirstSet(strt);
//			}
//		}

//		protected virtual void CheckEpsilonInRules()
//		{
//			for(int i=0;i<m_Rules.Count;i++)
//			{
//				BNFRule bnfRl = (BNFRule)m_Rules[i];
//				RuleStart strt = bnfRl.GetStart();
//				RuleIsEpsilonFree(strt);
//			}
//		}

        protected bool TotalRuleEpsFree(RuleStart rs)
        {
            rs = GoToFirstStartRule(rs);
            while (rs != null)
            {
                if (!rs.GetRuleConnect().EpsilonFree)
                {
                    return(false);
                }
                rs = rs.GetAlternate();
            }
            return(true);
        }
Пример #11
0
        private void DeleteStartRule(RuleStart rs)
        {
            BNFRule   bnfRl   = rs.GetRuleConnect();
            RuleStart AltNext = rs.GetAlternate();
            RuleStart AltBack = rs.GetAlternateBack();

            if (AltBack != null)
            {
                AltBack.SetAlternate(AltNext);
            }
            if (AltNext != null)
            {
                AltNext.SetAlternateBack(AltBack);
            }
            int index = bnfRl.Index;

            m_Rules.RemoveAt(index);
        }