// 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); }