Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
 /// <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));
 }
Ejemplo n.º 4
0
 /// <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);
 }