private void ComputeLookaheads(LRItemSet forItems) { foreach (var reduceItem in forItems) { // Find all source states - those that contribute lookaheads var sourceStates = new ParserStateSet(); foreach (var lookbackTrans in reduceItem.Lookbacks) { sourceStates.Add(lookbackTrans.ToState); sourceStates.UnionWith(lookbackTrans.ToState.BuilderData.ReadStateSet); foreach (var includeTrans in lookbackTrans.Includes) { sourceStates.Add(includeTrans.ToState); sourceStates.UnionWith(includeTrans.ToState.BuilderData.ReadStateSet); } //foreach includeTrans } //foreach lookbackTrans //Now merge all shift terminals from all source states foreach (var state in sourceStates) { reduceItem.Lookaheads.UnionWith(state.BuilderData.ShiftTerminals); } //Remove SyntaxError - it is pseudo terminal if (reduceItem.Lookaheads.Contains(_grammar.SyntaxError)) { reduceItem.Lookaheads.Remove(_grammar.SyntaxError); } //Sanity check if (reduceItem.Lookaheads.Count == 0) { _language.Errors.Add(GrammarErrorLevel.InternalError, reduceItem.State, "Reduce item '{0}' in state {1} has no lookaheads.", reduceItem.Core, reduceItem.State); } } //foreach reduceItem } //method
private void ComputeLookaheads(LRItemSet forItems) { foreach(var reduceItem in forItems) { // Find all source states - those that contribute lookaheads var sourceStates = new ParserStateSet(); foreach(var lookbackTrans in reduceItem.Lookbacks) { sourceStates.Add(lookbackTrans.ToState); sourceStates.UnionWith(lookbackTrans.ToState.BuilderData.ReadStateSet); foreach(var includeTrans in lookbackTrans.Includes) { sourceStates.Add(includeTrans.ToState); sourceStates.UnionWith(includeTrans.ToState.BuilderData.ReadStateSet); }//foreach includeTrans }//foreach lookbackTrans //Now merge all shift terminals from all source states foreach(var state in sourceStates) reduceItem.Lookaheads.UnionWith(state.BuilderData.ShiftTerminals); //Remove SyntaxError - it is pseudo terminal if (reduceItem.Lookaheads.Contains(_grammar.SyntaxError)) reduceItem.Lookaheads.Remove(_grammar.SyntaxError); //Sanity check if (reduceItem.Lookaheads.Count == 0) _language.Errors.Add(GrammarErrorLevel.InternalError, reduceItem.State, "Reduce item '{0}' in state {1} has no lookaheads.", reduceItem.Core, reduceItem.State); }//foreach reduceItem }