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;
                }
            }
        }
        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;
                    }
                }
            }
        }
Beispiel #3
0
        /// <summary>
        /// Find all Tokens inside Rule
        /// </summary>
        /// <param name="Token">Token String to find</param>
        /// <returns></returns>
        public MyArrayList FindToken(string Token)
        {
            MyArrayList sr = new MyArrayList();

            if (Start != null)
            {
                RuleElement pos = Start.GetNext();
                while (pos != null)
                {
                    if (pos.GetToken().Equals(Token))
                    {
                        sr.Add(pos);
                    }
                    pos = pos.GetNext();
                }
            }
            return(sr);
        }
        protected virtual MyArrayList GenerateFirstSet(RuleStart rs)
        {
            MyArrayList res = new MyArrayList();
            RuleElement re  = null;

            if (rs != null)
            {
                re = rs.GetNext();
            }
            else
            {
                return(null);
            }

            while (re != null)
            {
                if (re.GetToken().Equals(""))
                {
                    re = re.GetNext();
                }
                else
                {
                    if (re.IsTerminal())
                    {
                        res.Add(re);
                        return(res);
                    }
                    else
                    {
                        RuleToken   rt     = (RuleToken)re;
                        RuleStart   conStr = GoToFirstStartRule(rt.GetConnected());
                        MyArrayList res2   = null;
                        while (conStr != null)
                        {
                            res2   = GenerateFirstSet(conStr);
                            res    = ParseHelper.UnionSet(res, res2);
                            conStr = conStr.GetAlternate();
                        }
                        if (TotalRuleEpsFree(rt.GetConnected()))
                        {
                            return(res);
                        }
                        else
                        {
                            re = re.GetNext();
                        }
                    }
                }
            }
            return(res);
        }
        private void EleminateDirectLeftRecursion(RuleStart strt)
        {
            string ElemStartTkn = "";

            if (strt != null)
            {
                ElemStartTkn = FindUnusedToken(strt.GetToken());
            }
            while (strt != null)
            {
                if (IsRuleLeftRekursiv(strt))
                {
                    RuleElement re = strt.GetNext();
                    if (re != null)
                    {
                        strt.SetNext(re.GetNext());
                        re = GotoLastRule(strt);
                        re.SetNext(new RuleToken(ElemStartTkn, strt));
                        strt.SetToken(ElemStartTkn);
                    }
                    BNFRule bnfRl = new BNFRule(m_Rules.Count);
                    bnfRl.SetStart(ElemStartTkn);
                    bnfRl.GetStart().SetNext(new RuleEpsilon(bnfRl.GetStart()));
                    m_Rules.Add(bnfRl);
                }
                else
                {
                    RuleElement re = strt.GetNext();
                    if (re != null)
                    {
                        re = GotoLastRule(strt);
                        re.SetNext(new RuleToken(ElemStartTkn, strt));
                    }
                }
                strt = strt.GetAlternate();
            }
        }
        private string[] Rule2String(RuleStart rs)
        {
            MyArrayList elements = new MyArrayList();

            if (rs != null)
            {
                RuleElement re = rs.GetNext();
                while (re != null)
                {
                    elements.Add(re.GetToken());
                    re = re.GetNext();
                }
            }
            return((string[])elements.ToArray(typeof(string)));
        }
        private bool IsRuleLeftRekursiv(RuleStart rs)
        {
            RuleElement re = rs.GetNext();

            if (re != null)
            {
                string StartToken = rs.GetToken();
                string FirstToken = re.GetToken();
                if (StartToken.Equals(FirstToken))
                {
                    return(true);
                }
            }
            return(false);
        }
Beispiel #8
0
        private MyArrayList Rules2Array(RuleStart rs)
        {
            MyArrayList invRules = new MyArrayList();

            if (rs != null)
            {
                RuleElement re = rs.GetNext();
                while (re != null)
                {
                    invRules.Add(re);
                    re = re.GetNext();
                }
            }
            return(invRules);
        }
        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);
        }