public SyntaxTree Parse(TokenList tokenList)
        {
            LRParsingMap   parsingMap = GetParsingMap();
            RegulationList grammar    = GetGrammar();

            //TODO:这个convertor以后是可以配置的。
            var tokenTypeConvertor = new TokenType2TreeNodeType();
            var context            = new ParsingContext(tokenList, grammar, parsingMap, tokenTypeConvertor);

            while (context.CurrentTokenIndex < context.TokenList.Count + 1)
            {
                PrintParsingProgress(context);
                TreeNodeType    nodeType          = context.CurrentNodeType();
                int             stateId           = context.StateIdStack.Peek();
                LRParsingAction action            = parsingMap.GetAction(stateId, nodeType);
                int             currentTokenIndex = action.Execute(context);
                context.CurrentTokenIndex = currentTokenIndex;
            }

            PrintLastState(context);

            if (context.TreeStack.Count > 0)
            {
                return(context.TreeStack.Peek());
            }
            else
            {
                return(new SyntaxTree());
            }
        }
        public ParsingContext(TokenList tokenList,
                              RegulationList grammar,
                              LRParsingMap parsingMap,
                              TokenType2TreeNodeType tokenTypeConvertor)
        {
            this.StateIdStack = new Stack <int>();
            this.StateIdStack.Push(1);
            this.TreeStack = new Stack <SyntaxTree>();

            this.TokenList          = tokenList;
            this.Grammar            = grammar;
            this.ParsingMap         = parsingMap;
            this.TokenTypeConvertor = tokenTypeConvertor;
        }