示例#1
0
        private IExpression Parse(TokenOrExpression tokenOrExpression)
        {
            if (tokenOrExpression.Expression != null)
            {
                return(tokenOrExpression.Expression);
            }

            return(Parse(tokenOrExpression.Token));
        }
示例#2
0
        private bool TryParseVariableReference(List <TokenOrExpression> tokens)
        {
            if (Matches(tokens, TokenType.Dollar, TokenType.Literal))
            {
                TokenOrExpression name = tokens[1];
                tokens.RemoveRange(0, 2);
                tokens.Insert(0, new TokenOrExpression(CreateVariableExpression(name.Token.Value)));
                return(true);
            }

            return(false);
        }
示例#3
0
        private IExpression Parse(IEnumerable <Token> tokens)
        {
            var stack             = new List <TokenOrExpression>();
            int highestPrecedence = 0;

            using (IEnumerator <Token> iterator = tokens.GetEnumerator())
            {
                while (iterator.MoveNext())
                {
                    Token token = iterator.Current;
                    if (token.Type == TokenType.Whitespace)
                    {
                        continue;
                    }

                    if (IsOperator(token.Type))
                    {
                        int precedence = Precedence(token.Type);
                        if (precedence < highestPrecedence)
                        {
                            TryParseLeftToRight(stack);
                        }

                        stack.Add(token);
                        highestPrecedence = precedence;
                    }
                    else if (token.Type == TokenType.Quotation)
                    {
                        var stringTokens = FindTokensInString(iterator);
                        stack.Add(new TokenOrExpression(StringLiteral.Create(stringTokens)));
                    }
                    else
                    {
                        stack.Add(token);
                    }
                }
            }

            if (stack.Count == 0)
            {
                return(null);
            }

            if (!TryParseLeftToRight(stack))
            {
                throw new ParseException();
            }

            TokenOrExpression tok = stack[0];

            return(tok.Expression);
        }
示例#4
0
        private bool TryParseLiteral(List <TokenOrExpression> tokens)
        {
            if (Matches(tokens, TokenType.True))
            {
                tokens[0] = new TokenOrExpression(new BoolLiteral(true));
                return(true);
            }

            if (Matches(tokens, TokenType.False))
            {
                tokens[0] = new TokenOrExpression(new BoolLiteral(false));
                return(true);
            }

            if (Matches(tokens, TokenType.Literal))
            {
                tokens[0] = new TokenOrExpression(Literal.Create(tokens[0].Token.Value));
                return(true);
            }

            return(false);
        }
示例#5
0
        private bool TryParseOne(List <TokenOrExpression> tokens)
        {
            if (TryParseVariableReference(tokens))
            {
                return(true);
            }

            if (TryParseBinaryOperation(tokens))
            {
                return(true);
            }

            if (TryParseUnaryOperation(tokens))
            {
                return(true);
            }

            if (TryParseLiteral(tokens))
            {
                return(true);
            }

            if (tokens.Count >= 1)
            {
                if (tokens[0].Expression != null)
                {
                    return(true);
                }

                if (tokens[0].Token.Type == TokenType.Literal)
                {
                    tokens[0] = new TokenOrExpression(new StringLiteral(tokens[0].Token.Value));
                    return(true);
                }
            }

            return(false);
        }
示例#6
0
        private bool TryParseBinaryOperation(List <TokenOrExpression> tokens)
        {
            if (tokens.Count >= 3 && IsBinaryOperator(tokens[1].Token.Type, out var operation))
            {
                // Binary expression
                TokenOrExpression lhs = tokens[0];
                tokens.RemoveRange(0, 2);
                TryParseLeftToRight(tokens);
                if (tokens.Count != 1)
                {
                    throw new ParseException();
                }

                IExpression leftHandSide  = Parse(lhs);
                IExpression rightHandSide = tokens[0].Expression;

                var expression = BinaryExpression.Create(operation, leftHandSide, rightHandSide);
                tokens.RemoveAt(0);
                tokens.Insert(0, new TokenOrExpression(expression));
                return(true);
            }

            return(false);
        }