public Expression ParseExpression(int precedence = 0) { var token = Take(); IPrefixParselet prefix; IInfixParselet infix; if (!PrefixParselets.TryGetValue(token.ID, out prefix)) { throw new RantException(_src, token, "Invalid expression '\{token.Value}'."); } var left = prefix.Parse(this, token); // Break when the next token's precedence is less than or equal to the current precedence // This will assure that higher precedence operations like multiplication are parsed before lower operations. while (GetPrecedence() > precedence) { token = Take(); if (!InfixParselets.TryGetValue(token.ID, out infix)) { throw new RantException(_src, token, "Invalid operator '\{token.Value}'."); } // Replace the left expression with the next parsed expression. left = infix.Parse(this, left, token); } return(left); }
/// <summary> /// Gets the prefix parselet registered to the token type /// </summary> /// <param name="tokenClass">Token type to check</param> /// <returns>Parslet the token type is registered to</returns> public static IPrefixParselet GetPrefix(TokenType tokenClass) { if (PrefixParselets.ContainsKey(tokenClass)) { return(PrefixParselets[tokenClass]); } return(null); }
/// <summary> /// Registers a token type to a new PrefixOperatorParselet /// </summary> /// <param name="opToken">Token type to register</param> public static void RegisterPrefixOperator(TokenType opToken) { Logger.Log(LogLevel.Debug, Logger.REGISTRY, "Registering prefix operator parselet for token " + opToken.ToString()); PrefixParselets.Add(opToken, new PrefixOperatorParselet(Precedence.PREFIX)); }
/// <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); }