Exemplo n.º 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);
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
 protected void RegisterParselet(string tokenType, IInfixParselet parselet)
 {
     _infixParselets.Add(tokenType, parselet);
 }
Exemplo n.º 4
0
 static void RegisterInfix(LoonyTokenType type, IInfixParselet parselet)
 {
     _infixParselets.Add(type, parselet);
 }
Exemplo n.º 5
0
 private void Register(TokenType token, IInfixParselet parselet)
 {
     infixParselets.Add(token, parselet);
 }
Exemplo n.º 6
0
 public void Register(TokenType token, IInfixParselet parselet)
 {
     _infixParselets.Add(token, parselet);
 }
Exemplo n.º 7
0
 static void RegisterInfix(LoonyTokenType type, IInfixParselet parselet)
 {
     _infixParselets.Add(type, parselet);
 }
Exemplo n.º 8
0
 private void RegisterInfix(TokenType type, IInfixParselet handler)
 {
     infixParselets.Add(type, handler);
 }
Exemplo n.º 9
0
 public void AddInfix(TokenType tokenType, IInfixParselet parselet)
 {
     _infixParselets.Add(tokenType, parselet);
 }
Exemplo n.º 10
0
 public void Register(TokenType token, IInfixParselet parselet)
 {
     _infixParselets.Add(token, parselet);
 }
Exemplo n.º 11
0
 protected void RegisterParselet(string tokenType, IInfixParselet parselet)
 {
     _infixParselets.Add(tokenType, parselet);
 }
Exemplo n.º 12
0
 public bool TryGetInfixParselet(out IInfixParselet parselet, TextSpan token)
 {
     return(_infixParselets.TryGetValue(token.Type, out parselet));
 }
Exemplo n.º 13
0
 protected void Register(SqlToken tokenType, IInfixParselet parselet)
 {
     Register(tokenType.ToString(), parselet);
 }
Exemplo n.º 14
0
 /// <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);
 }
Exemplo n.º 15
0
 protected void RegisterInfix(TokenType type, IInfixParselet parselet)
 {
     _infixParselets.Add(type, parselet);
 }