// 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); }
/// <summary> /// Gets the current precedence in the parser's current state /// </summary> /// <returns>The precendence level being parsed</returns> public Precedence GetPrecedence() { Token ahead = LookAhead(); if (ahead == null) { return(0); } IInfixParselet parselet = GetInfix(ahead.Type); if (parselet != null) { return(parselet.PrecedenceLevel); } return(0); }
protected void RegisterParselet(string tokenType, IInfixParselet parselet) { _infixParselets.Add(tokenType, parselet); }
static void RegisterInfix(LoonyTokenType type, IInfixParselet parselet) { _infixParselets.Add(type, parselet); }
private void Register(TokenType token, IInfixParselet parselet) { infixParselets.Add(token, parselet); }
public void Register(TokenType token, IInfixParselet parselet) { _infixParselets.Add(token, parselet); }
static void RegisterInfix(LoonyTokenType type, IInfixParselet parselet) { _infixParselets.Add(type, parselet); }
private void RegisterInfix(TokenType type, IInfixParselet handler) { infixParselets.Add(type, handler); }
public void AddInfix(TokenType tokenType, IInfixParselet parselet) { _infixParselets.Add(tokenType, parselet); }
public void Register(TokenType token, IInfixParselet parselet) { _infixParselets.Add(token, parselet); }
protected void RegisterParselet(string tokenType, IInfixParselet parselet) { _infixParselets.Add(tokenType, parselet); }
public bool TryGetInfixParselet(out IInfixParselet parselet, TextSpan token) { return(_infixParselets.TryGetValue(token.Type, out parselet)); }
protected void Register(SqlToken tokenType, IInfixParselet parselet) { Register(tokenType.ToString(), parselet); }
/// <summary> /// Registers a token type to an infix parselet /// </summary> /// <param name="token">Token type to register</param> /// <param name="parselet">Parselet to register to</param> public static void RegisterInfix(TokenType token, IInfixParselet parselet) { Logger.Log(LogLevel.Debug, Logger.REGISTRY, "Registering infix/postfix operator parselet for token " + token.ToString()); InfixParselets.Add(token, parselet); }
protected void RegisterInfix(TokenType type, IInfixParselet parselet) { _infixParselets.Add(type, parselet); }