示例#1
0
        // Pratt Parser (http://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-expression-parsing-made-easy/)
        /// <summary>
        /// Parses a token stream stored in Stream
        /// </summary>
        /// <param name="precedence">
        ///	  Precedence level to start at. Used only as
        ///	  inner part of the algorithm.
        /// </param>
        /// <returns>Resulting node in tree</returns>
        public NodeBase Parse(Precedence precedence = 0)
        {
            Logger.Log(LogLevel.Debug, Logger.PARSER,
                       "Beginning parse for precedence " + precedence.ToString());
            Token           token  = Consume();
            IPrefixParselet prefix = GetPrefix(token.Type);

            if (prefix == null)
            {
                Logger.Log(LogLevel.Error, Logger.PARSER,
                           "Parse failed on token " + token.ToString());
                throw new MismatchedRuleException("Could not parse: " + token.ToString());
            }

            NodeBase left = prefix.Parse(this, token);

            Logger.Log(LogLevel.Debug, Logger.PARSER, "Parse created " +
                       left.GetType().Name + " from initial token " + token.ToString());

            while (precedence < GetPrecedence())
            {
                token = Consume();

                IInfixParselet infix = GetInfix(token.Type);
                left = infix.Parse(this, left, token);
            }

            return(left);
        }