private bool ResolveConflictByPrecedence(ParserState state, BnfTerm conflict)
        {
            var stateData = state.BuilderData;

            if (!conflict.IsSet(TermOptions.UsePrecedence))
            {
                return(false);
            }
            if (!stateData.ShiftTerms.Contains(conflict))
            {
                return(false);                                    //it is not shift-reduce
            }
            //first find reduce items
            var reduceItems = stateData.ReduceItems.SelectByLookahead(conflict);

            if (reduceItems.Count > 1)
            {
                return(false);                 // if it is reduce-reduce conflict, we cannot fix it by precedence
            }
            var reduceItem = reduceItems.First();
            //remove shift action and replace it with operator action
            var oldAction = state.Actions[conflict];
            var action    = ParserAction.CreateOperator(oldAction.NewState, reduceItem.Core.Production);

            state.Actions[conflict] = action;
            stateData.ResolvedConflicts.Add(conflict);
            return(true);
        }
示例#2
0
 private bool ResolveConflictByPrecedence(ParserState state, BnfTerm conflict)
 {
     var stateData = state.BuilderData;
       if (!conflict.IsSet(TermOptions.UsePrecedence)) return false;
       if (!stateData.ShiftTerms.Contains(conflict)) return false; //it is not shift-reduce
       //first find reduce items
       var reduceItems = stateData.ReduceItems.SelectByLookahead(conflict);
       if (reduceItems.Count > 1) return false; // if it is reduce-reduce conflict, we cannot fix it by precedence
       var reduceItem = reduceItems.First();
       //remove shift action and replace it with operator action
       var oldAction = state.Actions[conflict];
       var action = ParserAction.CreateOperator(oldAction.NewState, reduceItem.Core.Production);
       state.Actions[conflict] = action;
       stateData.ResolvedConflicts.Add(conflict);
       return true;
 }