Exemple #1
0
        public override void Extract()
        {
            EntityCol = _grammar.Entities;
            TerminalCol = _grammar.Terminals;
            NonTerminalCol = _grammar.NonTerminals;

            // removing augmented entity
            var augment = EntityCol[0];
            _entityColO = EntityCol - augment;
            NonTerminalCol.Remove((NonTerminal) augment);

            //Cloure_GoToTable
            _prods = new CLRProduction(_grammar[0].Producer, _grammar[0].Product, new EntityCollection<Terminal>(new[] { (Terminal) "$" }));

            _gotoCount = 0;
            _dotCount = 0;

            _closureCol = new ClosureCollection(new Closure[] { new CLRClosure(GotoTitle(), _grammar, new SLRProduction[] { _prods }) });

            ++_gotoCount;
            _gotoTable = new GotoEntry[0];
            for (int c = 0; c < _closureCol.Count; ++c)
            {
                var closure = (SLRClosure) _closureCol[c];
                var entityColO = _entityColO - (Terminal) "$";
                foreach (var entity in entityColO)
                {
                    var gotoClosure = closure.GoToEntity(entity);
                    if (!gotoClosure.IsNull && gotoClosure.Count != 0)
                    {
                        var index =
                            //_closureCol.List.FindIndex((Closure clr) => (clr == gotoClosure));
                            _closureCol.List.IndexOf(gotoClosure);
                        if (index == -1)
                        {
                            // add new Goto State
                            gotoClosure.Title = GotoTitle();
                            _closureCol += gotoClosure;
                            ++_gotoCount;
                        }
                        else
                        {
                            // error here
                            //var closureC = gotoClosure as CLRClosure;
                            //closureC.AddLookAhead(_closureCol[ index ].SLRProductions.ToArray());
                            //gotoClosure = closureC;

                            var closureC = gotoClosure as CLRClosure;
                            closureC.AddLookAhead(_closureCol[index].SLRProductions.ToArray());
                            gotoClosure.Title = _closureCol[index].Title;

                        }
                        var length = _gotoTable.Length;
                        var newTable = new GotoEntry[length + 1];
                        for (var g = 0; g < length; ++g)
                        {
                            newTable[g] = _gotoTable[g];
                        }
                        newTable[length] = new GotoEntry(closure, entity, gotoClosure);
                        _gotoTable = newTable;
                    }
                    ++_dotCount;
                }
            }

            // LR Table
            _tableForm = new String[EntityCol.Count, _closureCol.Count];

            for (var c = 0; c < _closureCol.Count; ++c)
            {
                var terminalLength = TerminalCol.Count;
                //Shift
                for (var t = 0; t < terminalLength; ++t)
                {
                    foreach (var gotoEntity in _gotoTable)
                    {
                        if (gotoEntity.X == TerminalCol[t] && gotoEntity.I == _closureCol[c])
                        {
                            _tableForm[t, c] = "s" + gotoEntity.Goto.Title.Split('[', ']')[1];
                            break;
                        }
                    }
                }

                //Reduce
                for (var p = 0; p < _closureCol[c].Count; ++p)
                {
                    SLRProduction production = _closureCol[c][p];
                    if (production.DotPosition == (production.Count - 1)
                    && production == _closureCol[1][0] // S' --> S .$
                      )  // Accepted
                    {
                        _tableForm[TerminalCol & (Terminal) "$", 1] = "!!";
                    }
                    if (production.DotPosition == production.Count)
                    {
                        var followCol = _grammar.Follow(production.Producer);
                        if (followCol == default(EntityCollection<Terminal>)) continue;
                        //followCol.Remove( (Terminal)"$" );
                        foreach (var follow in followCol)
                        {
                            _tableForm[TerminalCol & follow, c] = "r" + (_grammar & production);
                        }
                    }
                }

                // Goto
                for (var n = 0; n < NonTerminalCol.Count; ++n)
                {
                    foreach (var gotoEntity in _gotoTable.Where(gotoEntity => gotoEntity.X == NonTerminalCol[n] && gotoEntity.I == _closureCol[c]))
                    {
                        _tableForm[(terminalLength + 0) + n, c] = gotoEntity.Goto.Title.Split('[', ']')[1];
                    }
                }
            }
        }
Exemple #2
0
        public override void Extract(Grammar grammar)
        {
            _Grammar = grammar;
            EntityCol = grammar.Entities;
            TerminalCol = grammar.Terminals;
            NonTerminalCol = grammar.NonTerminals;

            // removing augmented entity
            var augment = EntityCol[0];
            _EntityColO = EntityCol - augment;
            NonTerminalCol.Remove((NonTerminal) augment);

            //Cloure_GoToTable
            _Production = new CLRProduction(grammar[0].Producer, grammar[0].Product,
                                       new EntityCollection<Terminal>(new[] { (Terminal) "$" }));

            _GotoCount = 0;
            _DotCount = 0;

            _ClosureCol =
                new ClosureCollection(new Closure[] { new CLRClosure(GotoTitle(), grammar, new SLRProduction[] { _Production }) });

            ++_GotoCount;
            _GotoEntries = new GotoEntry[0];
            for (var c = 0; c < _ClosureCol.Count; ++c)
            {
                var closure = (SLRClosure) _ClosureCol[c];
                var tmp = _EntityColO - (Terminal) "$";
                for (var e = 0; e < tmp.Count; ++e) //foreach (var entity in _entityColO - (Terminal) "$")
                {
                    var entity = tmp[e];
                    var gotoClosure = closure.GoToEntity(entity);
                    if (!gotoClosure.IsEmpty)
                    {
                        var index =
                            //_closureCol.List.FindIndex((Closure clr) => (clr == gotoClosure));
                            _ClosureCol.Closures.IndexOf(gotoClosure);
                        if (-1 == index)
                        {
                            // add new Goto State
                            gotoClosure.Title = GotoTitle();
                            _ClosureCol += gotoClosure;
                            ++_GotoCount;
                        }
                        else
                        {
                            // error here
                            //CLRClosure closureC = gotoClosure as CLRClosure;
                            //closureC.AddLookAhead(_ClosureCol[ index ].SLRProductions.ToArray());
                            //gotoClosure = closureC;

                            var closureC = gotoClosure as CLRClosure;
                            if (default(Closure) != closureC) closureC.AddLookAhead(_ClosureCol[index].SLRProductions.ToArray());
                            gotoClosure.Title = _ClosureCol[index].Title;
                        }

                        var length = _GotoEntries.Length;
                        var newGotoEntries = new GotoEntry[length + 1];
                        Array.Copy(_GotoEntries, newGotoEntries, length);

                        newGotoEntries[length] = new GotoEntry(closure, entity, gotoClosure);
                        _GotoEntries = newGotoEntries;
                    }
                    ++_DotCount;
                }
            }

            // LR Table
            _GoTotable = new String[EntityCol.Count, _ClosureCol.Count];

            for (var c = 0; c < _ClosureCol.Count; ++c)
            {
                var terminalLength = TerminalCol.Count;

                //Shift
                for (var t = 0; t < terminalLength; ++t)
                    foreach (var gotoEntity in _GotoEntries)
                    {
                        if (gotoEntity.X != TerminalCol[t] || gotoEntity.I != _ClosureCol[c]) continue;

                        _GoTotable[t, c] = "s" + gotoEntity.Goto.Title.Split('[', ']')[1];
                        break;
                    }

                //Reduce
                for (var p = 0; p < _ClosureCol[c].Count; ++p)
                {
                    var production = _ClosureCol[c][p];
                    if (production.DotPosition == (production.Count - 1)
                        && production == _ClosureCol[1][0] // S' --> S .$
                        ) // Accepted
                        _GoTotable[TerminalCol & (Terminal) "$", 1] = "!!";

                    if (production.DotPosition != production.Count) continue;
                    var followCol = grammar.Follow(production.Producer);
                    if (default(EntityCollection<Terminal>) == followCol) continue;
                    //followCol.Remove( (Terminal)"$" );
                    foreach (var follow in followCol) _GoTotable[TerminalCol & follow, c] = "r" + (grammar & production);
                }

                // Goto
                for (var n = 0; n < NonTerminalCol.Count; ++n)
                    foreach (var gotoEntity in _GotoEntries)
                        if (gotoEntity.X == NonTerminalCol[n] && gotoEntity.I == _ClosureCol[c])
                            _GoTotable[(terminalLength + 0) + n, c] = gotoEntity.Goto.Title.Split('[', ']')[1];
            }
        }
Exemple #3
0
 public bool NotEquals(CLRProduction prod)
 {
     return !Equals(prod);
 }
Exemple #4
0
 public bool Equals(CLRProduction prod)
 {
     return base.Equals(prod) && (LookAheads == prod.LookAheads);
 }
Exemple #5
0
 public void Remove(CLRProduction production)
 {
     RemoveAt(IndexOf(production));
 }
Exemple #6
0
 public void Remove(CLRProduction production)
 {
     RemoveAt(FindFirstIndex(production));
 }
Exemple #7
0
 public int FindFirstIndex(CLRProduction find)
 {
     return FindFirstIndex(find, 0);
 }