Exemple #1
0
 public bool ValueEquals(AddExpression other)
 {
     if (ReferenceEquals(null, other))
     {
         return(false);
     }
     if (ReferenceEquals(this, other))
     {
         return(true);
     }
     return(Left.ValueEquals(other.Left) && Right.ValueEquals(other.Right));
 }
Exemple #2
0
        static Expression ParseStringExpression(Uno.Compiler.SourceFile file, string code)
        {
            if (string.IsNullOrEmpty(code))
            {
                return(null);
            }

            var parts = new List <Expression>();
            int p     = 0;

            for (int i = 0; i < code.Length; i++)
            {
                if (code[i] == '{' && (i == 0 || code[i - 1] != '\\'))
                {
                    if (i != p)
                    {
                        parts.Add(new StringLiteral(code.Substring(p, i - p)));
                    }

                    // Skip to end of binding expression
                    int start = i;
                    i++;
                    for (int scopes = 1; scopes > 0 && i < code.Length; i++)
                    {
                        if (code[i] == '}' && code[i - 1] != '\\')
                        {
                            scopes--;
                        }
                        if (code[i] == '{' && code[i - 1] != '\\')
                        {
                            scopes++;
                        }
                    }

                    var binding = code.Substring(start, i - start);
                    var be      = Parse(new Uno.Compiler.SourceFile(file.FullPath, binding), binding, false);
                    if (be == null)
                    {
                        throw new Exception("Expected binding expression after '{'");
                    }
                    parts.Add(be);
                    p = i;
                }
            }
            if (p < code.Length)
            {
                parts.Add(new StringLiteral(code.Substring(p, code.Length - p)));
            }

            return(parts.Count > 1
                ? AddExpression.Create(parts.ToArray())
                : parts[0]);
        }
Exemple #3
0
        Expression ParseExpression(Precedence p, bool vectorMode)
        {
            var e = ParseUnaryExpression(vectorMode);

            while (e != null)
            {
                var op = Peek();

                if (op == TokenType.Period)
                {
                    Consume();
                    var id = Consume();
                    if (!IsIdentifier(id))
                    {
                        Error("Expected identifier after '.'");
                    }

                    e = new MemberExpression(e, id.Value);
                    continue;
                }

                if (op == TokenType.LeftSquareBrace)
                {
                    Consume();
                    var index = ParseExpression(Precedence.Invalid, true);
                    if (Peek() != TokenType.RightSquareBrace)
                    {
                        Error("Expected ]");
                    }

                    Consume();

                    e = new LookUpExpression(e, index);
                    continue;
                }

                if (p < Precedence.Assignment)
                {
                    if (TryConsume(TokenType.Colon))
                    {
                        e = new NameValuePairExpression(e, Expect(ParseExpression(Precedence.Assignment, false)));
                        continue;
                    }
                }

                if (p < Precedence.Conditional)
                {
                    if (TryConsume(TokenType.QuestionMark))
                    {
                        var case1 = Expect(ParseExpression(Precedence.Conditional, false));

                        if (!TryConsume(TokenType.Colon))
                        {
                            Error("Expected ':'");
                        }

                        var case2 = Expect(ParseExpression(Precedence.Conditional, false));

                        e = new ConditionalExpression(e, case1, case2);
                        continue;
                    }
                }

                if (p < Precedence.Multiplicative)
                {
                    if (TryConsume(TokenType.Mul))
                    {
                        e = new MultiplyExpression(e, Expect(ParseExpression(Precedence.Multiplicative, false)));
                        continue;
                    }
                    if (TryConsume(TokenType.Div))
                    {
                        e = new DivideExpression(e, Expect(ParseExpression(Precedence.Multiplicative, false)));
                        continue;
                    }
                }

                if (p < Precedence.Additive)
                {
                    if (TryConsume(TokenType.Plus))
                    {
                        e = new AddExpression(e, Expect(ParseExpression(Precedence.Additive, false)));
                        continue;
                    }
                    if (TryConsume(TokenType.Minus))
                    {
                        e = new SubtractExpression(e, Expect(ParseExpression(Precedence.Additive, false)));
                        continue;
                    }
                }

                if (p < Precedence.LogicalAnd)
                {
                    if (TryConsume(TokenType.LogAnd))
                    {
                        e = new LogicalAndExpression(e, Expect(ParseExpression(Precedence.LogicalAnd, false)));
                        continue;
                    }
                }

                if (p < Precedence.LogicalOr)
                {
                    if (TryConsume(TokenType.LogOr))
                    {
                        e = new LogicalOrExpression(e, Expect(ParseExpression(Precedence.LogicalOr, false)));
                        continue;
                    }
                }

                if (p < Precedence.Relational)
                {
                    if (TryConsume(TokenType.LessThan))
                    {
                        e = new LessThanExpression(e, Expect(ParseExpression(Precedence.Relational, false)));
                        continue;
                    }
                    if (TryConsume(TokenType.LessOrEqual))
                    {
                        e = new LessOrEqualExpression(e, Expect(ParseExpression(Precedence.Relational, false)));
                        continue;
                    }
                    if (TryConsume(TokenType.GreaterThan))
                    {
                        e = new GreaterThanExpression(e, Expect(ParseExpression(Precedence.Relational, false)));
                        continue;
                    }
                    if (TryConsume(TokenType.GreaterOrEqual))
                    {
                        e = new GreaterOrEqualExpression(e, Expect(ParseExpression(Precedence.Relational, false)));
                        continue;
                    }
                    if (TryConsume(TokenType.NotEqual))
                    {
                        e = new NotEqualExpression(e, Expect(ParseExpression(Precedence.Relational, false)));
                        continue;
                    }
                    if (TryConsume(TokenType.Equal))
                    {
                        e = new EqualExpression(e, Expect(ParseExpression(Precedence.Relational, false)));
                        continue;
                    }
                }

                if (p < Precedence.NullCoalescing)
                {
                    if (TryConsume(TokenType.DoubleQuestionMark))
                    {
                        e = new NullCoalesceExpression(e, Expect(ParseExpression(Precedence.NullCoalescing, false)));
                    }
                }

                // Vector op
                if (vectorMode && p == Precedence.Invalid && Peek() == TokenType.Comma)
                {
                    var comps = new List <Expression>();
                    comps.Add(e);
                    while (TryConsume(TokenType.Comma))
                    {
                        e = Expect(ParseExpression(Precedence.Invalid, false));
                        comps.Add(e);
                    }
                    e = new VectorExpression(comps.ToArray()).TryFold();
                }

                break;
            }

            return(e);
        }