// 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); }
public void Register(TokenType tokenType, IPrefixParselet parselet, params Type[] types) { if (types.Length > 0) { if (!_contextPrefixParselets.ContainsKey(tokenType)) { _contextPrefixParselets.Add(tokenType, new Dictionary <Type, IPrefixParselet>()); } foreach (Type type in types) { _contextPrefixParselets[tokenType].Add(type, parselet); } } else { _prefixParselets.Add(tokenType, parselet); } }
protected void RegisterParselet(string tokenType, IPrefixParselet parselet) { _prefixParselets.Add(tokenType, parselet); }
static void RegisterPrefix(LoonyTokenType type, IPrefixParselet parselet) { _prefixParselets.Add(type, parselet); }
private void Register(TokenType token, IPrefixParselet parselet) { prefixParselets.Add(token, parselet); }
public void Register(TokenType token, IPrefixParselet parselet) { _prefixParselets.Add(token, parselet); }
private void RegisterPrefix(TokenType type, IPrefixParselet handler) { prefixParselets.Add(type, handler); }
public void AddPrefix(TokenType tokenType, IPrefixParselet parselet) { _prefixParselets.Add(tokenType, parselet); }
public bool TryGetPrefixParselet(out IPrefixParselet parselet, TextSpan token) { return(_prefixParselets.TryGetValue(token.Type, out parselet)); }
static void RegisterPrefix(ExpressionKind kind, IPrefixParselet parselet) => PreParselets.Add(kind, parselet);
protected void Register(SqlToken tokenType, IPrefixParselet parselet) { Register(tokenType.ToString(), parselet); }
/// <summary> /// Registers a token type to a prefix parselet /// </summary> /// <param name="token">Token type to register</param> /// <param name="parselet">Parselet to register to</param> public static void RegisterPrefix(TokenType token, IPrefixParselet parselet) { Logger.Log(LogLevel.Debug, Logger.REGISTRY, "Registering prefix parselet for token " + token.ToString()); PrefixParselets.Add(token, parselet); }
protected void RegisterPrefix(TokenType type, IPrefixParselet parselet) { _prefixParselets.Add(type, parselet); }