Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
 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
 }