Ejemplo n.º 1
0
        /// <summary>
        /// Gets the index of the terminal with the highest priority that is possible in the contexts
        /// </summary>
        /// <param name="state">The DFA state</param>
        /// <param name="provider">The current applicable contexts</param>
        /// <returns>The index of the terminal</returns>
        private int GetTerminalFor(int state, IContextProvider provider)
        {
            AutomatonState  stateData     = automaton.GetState(state);
            MatchedTerminal mt            = stateData.GetTerminal(0);
            int             id            = symTerminals[mt.Index].ID;
            int             currentResult = mt.Index;

            if (id == separatorID)
            {
                // the separator trumps all
                return(currentResult);
            }
            int currentPriority = provider.GetContextPriority(mt.Context, id);

            for (int i = 1; i != stateData.TerminalsCount; i++)
            {
                mt = stateData.GetTerminal(i);
                id = symTerminals[mt.Index].ID;
                if (id == separatorID)
                {
                    // the separator trumps all
                    return(mt.Index);
                }
                int priority = provider.GetContextPriority(mt.Context, id);
                if (currentPriority < 0 || (priority >= 0 && priority < currentPriority))
                {
                    currentResult   = mt.Index;
                    currentPriority = priority;
                }
            }
            return(currentResult);
        }