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; } } } }
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); }