Exemplo n.º 1
0
        private bool statsAreEqual(SLRDFASTAT first, SLRDFASTAT second)
        {
            bool flag = false;

            if (first.Statements.Count != second.Statements.Count)
            {
                return(false);
            }

            for (int i = 0; i < first.Statements.Count; i++)
            {
                flag = false;
                for (int j = 0; j < second.Statements.Count; j++)
                {
                    if (
                        (first.Statements[i].Presentation == second.Statements[j].Presentation) &&
                        first.Statements[i].DotIndex == second.Statements[j].DotIndex
                        )
                    {
                        flag = true;
                    }
                }
                if (!flag)
                {
                    return(false);
                }
            }
            return(true);
        }
Exemplo n.º 2
0
        StatAndNumber defineCellType(SLRDFASTAT stat, string token)
        {
            //moshakhas mikone ke halat shift ie ya kaheshi
            StatAndNumber result = new StatAndNumber();

            result.type      = new List <SLRTableCell.Type>();
            result.RightSide = new List <RightSide>();
            string[] words;
            foreach (var rl in stat.Statements)
            {
                words = rl.Right.words;
                for (int i = 0; i < words.Length; i++)
                {
                    if (words[i] == token)
                    {
                        if (i == rl.DotIndex)
                        {
                            if (!result.type.Contains(SLRTableCell.Type.SHIFT))
                            {
                                result.type.Add(SLRTableCell.Type.SHIFT);//yani agar noghte poshte token bud
                                result.RightSide.Add(rl.Right);
                            }
                        }
                        else if (i == words.Length - 1 && i + 1 == rl.DotIndex)
                        {
                            result.type.Add(SLRTableCell.Type.REDUCE);    //agar noghte bade token bud
                            result.RightSide.Add(rl.Right);
                        }
                    }
                }
            }

            return(result);
        }
Exemplo n.º 3
0
        private void BuildSLRDFA()
        {
            SLRDFASTAT stat;

            stats = new List <SLRDFASTAT>();


            stat = new SLRDFASTAT(null, "");
            stat.State_Number = 0;

            //Adding start'->. <start> as the first state
            SLRDFASTAT.Statement statem = new SLRDFASTAT.Statement();
            statem.isCore = true;
            statem.Left   = "start'";
            statem.Right  = new RightSide()
            {
                Right = "<start>", Left = "start'", isEpsilon = false
            };
            statem.Right.AddFollow("$");
            //statem.DotIndex = 0; it is zero by defualt
            foreach (var fr in grammer["start"].Firsts)
            {
                statem.Right.AddFirst(fr);
            }

            stat.AddStatement(statem);
            recursiveStateBuilder(stat, null);
        }
Exemplo n.º 4
0
        public SLRDFASTAT(SLRDFASTAT prt, string passed)
        {
            State_Number = -1;//meghdare default ro -1 mizarim ke age ye
            //stat dg badesh be hich ja naraft meghdaresh 0 nabashe

            parent = new List <SLRDFASTAT>();
            if (prt != null)
            {
                parent.Add(prt);
            }
            passedBy = passed;

            Statements    = new List <Statement>();
            next_pointers = new Dictionary <string, SLRDFASTAT>();
        }
Exemplo n.º 5
0
        /// <summary>
        /// Builds the LR DFA states recursivly
        /// </summary>
        /// <param name="current">Current state</param>
        /// <param name="parent">Parent</param>
        /// <returns></returns>
        private SLRDFASTAT recursiveStateBuilder(SLRDFASTAT current, SLRDFASTAT parent)
        {
            string afterDot = "";
            int    index    = 0;

            while (true)
            {
                if (index == current.Statements.Count)
                {
                    break;
                }
                int Dot = current.Statements[index].DotIndex;
                if (!current.Statements[index].DotIsAtEnd)
                {
                    afterDot = current.Statements[index].Right.words[Dot];
                }
                else
                {
                    index++;
                    continue;
                }
                if (afterDot == "epsilon")
                {
                    //Since epsilon is not a token we always just pass the dot over epsilon
                    current.Statements[index].DotIndex++;
                    continue;
                }
                SLRDFASTAT.Statement statem = new SLRDFASTAT.Statement();
                statem.Left     = current.Statements[index].Left;
                statem.Right    = current.Statements[index].Right;
                statem.DotIndex = current.Statements[index].DotIndex;
                statem.isCore   = true;

                if (current.next_pointers.ContainsKey(afterDot))
                {
                    if (!current.next_pointers[afterDot].Statements.Contains(statem))
                    {
                        current.next_pointers[afterDot].Statements.Add(statem);
                    }
                }
                else
                {
                    SLRDFASTAT newStat = new SLRDFASTAT(current, afterDot);
                    newStat.AddStatement(statem);
                    current.next_pointers.Add(afterDot, newStat);
                }

                //Creating prediction set
                if (Parser.isRule(afterDot))

                {
                    foreach (var right in grammer[Parser.returnRuleName(afterDot)].Rights)
                    {
                        statem = new SLRDFASTAT.Statement();

                        statem.Left   = afterDot;
                        statem.Right  = right;
                        statem.isCore = false;

                        bool include = false;
                        foreach (var cr in current.Statements)
                        {
                            if (cr.Presentation == statem.Presentation && cr.DotIndex == statem.DotIndex)
                            {
                                include = true;
                            }
                        }
                        if (!include)
                        {
                            current.AddStatement(statem);
                        }
                    }
                }

                if (index == current.Statements.Count - 1)
                {
                    break;
                }

                index++;
            }

            foreach (var st in stats)
            {
                //we will add this state to list if it is not repetetive
                if (statsAreEqual(st, current))
                {
                    current.State_Number = st.State_Number;
                    st.parent.AddRange(current.parent);
                    return(current);
                }
            }
            current.State_Number = stat_number++;
            stats.Add(current);

            for (int j = 0; j < current.next_pointers.Count; j++)
            {
                string key = current.next_pointers.Keys.ElementAt(j);
                foreach (var stat in current.next_pointers[key].Statements)
                {
                    stat.DotIndex++;
                }
                current.next_pointers[key] = recursiveStateBuilder(current.next_pointers[key], current);
            }

            return(current);
        }