Example #1
0
        // 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);
        }
Example #2
0
 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);
     }
 }
Example #3
0
 protected void RegisterParselet(string tokenType, IPrefixParselet parselet)
 {
     _prefixParselets.Add(tokenType, parselet);
 }
Example #4
0
 static void RegisterPrefix(LoonyTokenType type, IPrefixParselet parselet)
 {
     _prefixParselets.Add(type, parselet);
 }
Example #5
0
 private void Register(TokenType token, IPrefixParselet parselet)
 {
     prefixParselets.Add(token, parselet);
 }
Example #6
0
 public void Register(TokenType token, IPrefixParselet parselet)
 {
     _prefixParselets.Add(token, parselet);
 }
Example #7
0
 static void RegisterPrefix(LoonyTokenType type, IPrefixParselet parselet)
 {
     _prefixParselets.Add(type, parselet);
 }
Example #8
0
 private void RegisterPrefix(TokenType type, IPrefixParselet handler)
 {
     prefixParselets.Add(type, handler);
 }
Example #9
0
 public void AddPrefix(TokenType tokenType, IPrefixParselet parselet)
 {
     _prefixParselets.Add(tokenType, parselet);
 }
Example #10
0
 public void Register(TokenType token, IPrefixParselet parselet)
 {
     _prefixParselets.Add(token, parselet);
 }
Example #11
0
 protected void RegisterParselet(string tokenType, IPrefixParselet parselet)
 {
     _prefixParselets.Add(tokenType, parselet);
 }
Example #12
0
 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);
Example #14
0
 protected void Register(SqlToken tokenType, IPrefixParselet parselet)
 {
     Register(tokenType.ToString(), parselet);
 }
Example #15
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);
 }
Example #16
0
 protected void RegisterPrefix(TokenType type, IPrefixParselet parselet)
 {
     _prefixParselets.Add(type, parselet);
 }