예제 #1
0
        public void createParsingTable(List <States> states)
        {
            init(states, Grammar.GrammarDictionary);

            foreach (var state in states)
            {
                int stateNo = state.StateNo;
                if (state.Leaf)
                {
                    foreach (var token in Grammar.TerminalTokens)
                    {
                        var reducedLeftHandSide = Grammar.NumberedGrammar.GetValueOrDefault(state.LrItem.HashCode);
                        _action[stateNo][token.Kind] = new ParseAction('r', reducedLeftHandSide);
                    }
                    continue;
                }

                foreach (var transision in state.Transisions)
                {
                    GrammarToken token = transision.Value;
                    int          dest  = transision.Key;

                    if (token.IsTerminal)
                    {
                        _action[stateNo][token.Kind] = new ParseAction('s', dest);
                    }
                    else
                    {
                        _goto[stateNo][token.Kind] = dest;
                    }
                }
            }
        }
예제 #2
0
        public static List <States> GetStates(GrammarToken start, Dictionary <GrammarToken, List <CompositeGrammarToken> > grammar)
        {
            // listing of all states
            List <States> statesList = new List <States>();

            // initialize
            int state      = 0;
            int dotPointer = 0;

            //pair => closure item and dot pointer => A.A=> AA,1
            Queue <KeyValuePair <CompositeGrammarToken, int> > queue = new Queue <KeyValuePair <CompositeGrammarToken, int> >();
            //dictionary  pair => closure item and dot pointer => A.A=> AA,1 <><><>  state
            Dictionary <KeyValuePair <int, int>, int> seen = new Dictionary <KeyValuePair <int, int>, int>();

            queue.Enqueue(new KeyValuePair <CompositeGrammarToken, int>(new CompositeGrammarToken(new List <GrammarToken> {
                start
            }), dotPointer));
            // seen.Add(new KeyValuePair<string, int>(start,dotPointer),state);


            while (queue.Count > 0)
            {
                gl++;
                if (gl > 1000)
                {
                    break;
                }

                var currentNode = queue.Dequeue();
                // A.A,1
                List <KeyValuePair <CompositeGrammarToken, int> > canonicalCollections = new List <KeyValuePair <CompositeGrammarToken, int> >();
                // state,(dot going over=> .AB=>A.B => A)
                List <KeyValuePair <int, GrammarToken> > transisionList = new List <KeyValuePair <int, GrammarToken> >();
                canonicalCollections = GetCanonicalCollections(currentNode, grammar);

                if (currentNode.Value < currentNode.Key.Length)
                {
                    Dictionary <GrammarToken, int> seenTransisionOfNode = new Dictionary <GrammarToken, int>();
                    foreach (var canonicalItem in canonicalCollections)
                    {
                        var transisionEvent = canonicalItem.Key.Get(canonicalItem.Value);
                        var gotoState       = 0;
                        if (!seen.ContainsKey(new KeyValuePair <int, int>(canonicalItem.Key.HashCode, canonicalItem.Value + 1)))
                        {
                            queue.Enqueue(new KeyValuePair <CompositeGrammarToken, int>(canonicalItem.Key, canonicalItem.Value + 1));

                            if (seenTransisionOfNode.ContainsKey(transisionEvent))
                            {
                                seenTransisionOfNode.TryGetValue(transisionEvent, out gotoState);
                            }
                            else
                            {
                                gotoState = ++state;
                            }

                            seen.Add(new KeyValuePair <int, int>(canonicalItem.Key.HashCode, canonicalItem.Value + 1), gotoState);
                        }
                        else
                        {
                            gotoState = seen.GetValueOrDefault(new KeyValuePair <int, int>(canonicalItem.Key.HashCode, canonicalItem.Value + 1));
                        }

                        if (!seenTransisionOfNode.ContainsKey(transisionEvent))
                        {
                            seenTransisionOfNode.Add(transisionEvent, gotoState);
                        }

                        transisionList.Add(new KeyValuePair <int, GrammarToken>(gotoState, transisionEvent));
                    }
                }

                int stateNow = seen.GetValueOrDefault(new KeyValuePair <int, int>(currentNode.Key.HashCode, currentNode.Value));
                statesList.Add(new States(stateNow, currentNode.Key, currentNode.Value, canonicalCollections, transisionList));
            }
            return(statesList);
        }