예제 #1
0
        public string convNToTableName(string N, List <FirstKEl> L)
        {
            var t  = new LLkT(0, N, L);
            var tf = t.toFlat();
            var i  = Helpers.indexOf(tf, this.LLksf);
            var lt = this.LLks[i];

            return(lt.name);
        }
예제 #2
0
        public void constructLLkTs()
        {
            //(1)
            var l = new List <FirstKEl>();

            l.Add(new FirstKEl(this.k));
            var t0 = this.constructLLkT(this.cfg.StartSymbol, l);

            this.LLks.Add(t0);

            //(2)
            var J = this.LLksf;

            J.Add(t0.toFlat());

            //(3)(4)
            LLkT     tabi;
            LLkTRow  rowj;
            FollowEl folk;
            LLkT     newt;
            string   newtf;

            for (var i = 0; i < this.LLks.Count; i++)
            {
                tabi = this.LLks[i];
                for (var j = 0; j < tabi.rows.Count; j++)
                {
                    rowj = tabi.rows[j];
                    for (var k = 0; k < rowj.follow.Count; k++)
                    {
                        folk = rowj.follow[k];

                        newt  = new LLkT(0, folk.N, folk.sets);
                        newtf = newt.toFlat();
                        if (!J.Contains(newtf))
                        {
                            newt = this.constructLLkT(folk.N, folk.sets);
                            this.LLks.Add(newt);
                            J.Add(newtf);
                        }
                    }
                }
            }
        }
예제 #3
0
        public LLkT constructLLkT(string N, List <FirstKEl> L)
        {
            var table = new LLkT(this.Tcounter, N, L);

            this.Tcounter++;

            List <FirstKEl> first, setu;
            CfgRule         rulei;
            LLkTRow         ltrow;
            List <FollowEl> follow;

            for (var i = 0; i < this.cfg.Rules.Count; i++)
            {
                rulei = this.cfg.Rules[i];

                // skip irrelevant rules
                if (rulei.Left != N)
                {
                    continue;
                }

                // compute u
                first = this.firstOp(rulei.Right, this.k);
                setu  = this.firstPlusOp(first, L, this.k);

                // compute follow
                follow = this.followOp(rulei.Right, L);

                // add rows
                for (var j = 0; j < setu.Count; j++)
                {
                    ltrow = new LLkTRow(setu[j], rulei, follow);
                    table.addRow(ltrow);
                }
            }

            return(table);
        }