Example #1
0
        public CodeObject Compile(AstNode syntaxNode, CodeProgram prog)
        {
            var syntaxAssignExpr = (ScriptAssignExpr)syntaxNode;

            if (syntaxAssignExpr.LeftExpression.IsVariable)
            {
                if (syntaxAssignExpr.Symbol == "++")
                {
                    var binary = new CodeBinaryOperator
                    {
                        Left  = new CodeVariableReference(syntaxAssignExpr.LeftExpression.Identifier),
                        Right = new CodeValueReference(1),
                        Type  = OperatorType.Plus
                    };

                    var codeAssign = new CodeAssignExpression(
                        syntaxAssignExpr.LeftExpression.Identifier,
                        binary)
                    {
                        SourceSpan = syntaxNode.Span
                    };

                    return(codeAssign);
                }
                else
                if (syntaxAssignExpr.Symbol == "--")
                {
                    var binary = new CodeBinaryOperator
                    {
                        Left  = new CodeVariableReference(syntaxAssignExpr.LeftExpression.Identifier),
                        Right = new CodeValueReference(1),
                        Type  = OperatorType.Minus
                    };

                    var codeAssign = new CodeAssignExpression(
                        syntaxAssignExpr.LeftExpression.Identifier,
                        binary)
                    {
                        SourceSpan = syntaxNode.Span
                    };

                    return(codeAssign);
                }
                else
                {
                    var codeAssign = new CodeAssignExpression(
                        syntaxAssignExpr.LeftExpression.Identifier,
                        (CodeExpression)AstDomCompiler.Compile(syntaxAssignExpr.RightExpression, prog))
                    {
                        SourceSpan = syntaxNode.Span
                    };

                    return(codeAssign);
                }
            }

            return(null);
        }
Example #2
0
        public CodeObject Compile(AstNode syntaxNode, CodeProgram prog)
        {
            var syntaxBinExpr = (ScriptBinExpr)syntaxNode;

            var binary = new CodeBinaryOperator
            {
                Left  = (CodeExpression)AstDomCompiler.Compile(syntaxBinExpr.Left, prog),
                Right = (CodeExpression)AstDomCompiler.Compile(syntaxBinExpr.Right, prog),
                Type  = Mapping[syntaxBinExpr.Symbol]
            };

            return(binary);
        }
    public CodeObject Compile(AstNode syntaxNode, CodeProgram prog)
    {
      var syntaxBinExpr = (ScriptBinExpr)syntaxNode;

      var binary = new CodeBinaryOperator
      {
        Left = (CodeExpression) AstDomCompiler.Compile(syntaxBinExpr.Left, prog),
        Right = (CodeExpression) AstDomCompiler.Compile(syntaxBinExpr.Right, prog),
        Type = Mapping[syntaxBinExpr.Symbol]
      };

      return binary;
    }
    public CodeObject Compile(AstNode syntaxNode, CodeProgram prog)
    {
      var syntaxAssignExpr = (ScriptAssignExpr)syntaxNode;
      
      if (syntaxAssignExpr.LeftExpression.IsVariable)
      {
        if (syntaxAssignExpr.Symbol == "++")
        {
          var binary = new CodeBinaryOperator
          {
            Left = new CodeVariableReference(syntaxAssignExpr.LeftExpression.Identifier),
            Right = new CodeValueReference(1),
            Type = OperatorType.Plus
          };

          var codeAssign = new CodeAssignExpression(
            syntaxAssignExpr.LeftExpression.Identifier,
            binary) {SourceSpan = syntaxNode.Span};

          return codeAssign;
        }
        else
          if (syntaxAssignExpr.Symbol == "--")
          {
            var binary = new CodeBinaryOperator
            {
              Left = new CodeVariableReference(syntaxAssignExpr.LeftExpression.Identifier),
              Right = new CodeValueReference(1),
              Type = OperatorType.Minus
            };

            var codeAssign = new CodeAssignExpression(
              syntaxAssignExpr.LeftExpression.Identifier,
              binary) {SourceSpan = syntaxNode.Span};

            return codeAssign;
          }
          else
          {
            var codeAssign = new CodeAssignExpression(
              syntaxAssignExpr.LeftExpression.Identifier,
              (CodeExpression)AstDomCompiler.Compile(syntaxAssignExpr.RightExpression, prog))
            {SourceSpan = syntaxNode.Span};

            return codeAssign;
          }
      }

      return null;
    }
Example #5
0
        private CodeExpression OptimizeBinaryExpression(CodeExpression lhs, CodeBinaryOperator op, CodeExpression rhs)
        {
            CodePrimitiveExpression cpe = rhs as CodePrimitiveExpression;
            if (cpe != null && cpe.Value is bool) {
                bool test = (bool)cpe.Value;
                if ((test && op == CodeBinaryOperator.IdentityEquality) ||
                    (!test && op == CodeBinaryOperator.IdentityInequality)) {
                    // (x == true) -> (x)
                    // (x != false) -> (x)
                    return lhs;
                }
                else if ((test && op == CodeBinaryOperator.IdentityInequality) ||
                    (!test && op == CodeBinaryOperator.IdentityEquality)) {
                    // (x != true) -> !(x)
                    // (x == false) -> !(x)
                    return lhs.Invert();
                }
                else {
                    throw new NotSupportedException();
                }
            }

            if (IsBooleanExpression(lhs) && IsFalse(rhs)) {
                return lhs.Invert();
            }

            return new CodeBinaryExpression(lhs, op, rhs);
        }
Example #6
0
 private void ConditionalBranch(Instruction il, CodeBinaryOperator op)
 {
     var rhs = Pop();
     var lhs = Pop();
     RefineBinaryExpression(lhs, rhs);
     var condition = OptimizeBinaryExpression(lhs, op, rhs);
     var stmt = new CodeExpressionStatement(condition);
     AddStatment(stmt);
 }
Example #7
0
 private void Comparision(Instruction il, CodeBinaryOperator op)
 {
     var rhs = Pop();
     var lhs = Pop();
     RefineBinaryExpression(lhs, rhs);
     var expr = OptimizeBinaryExpression(lhs, op, rhs);
     Push(expr);
 }
Example #8
0
 static bool IsComparisonOperator(CodeBinaryOperator op)
 {
     switch (op) {
         case CodeBinaryOperator.GreaterThan:
         case CodeBinaryOperator.LessThan:
         case CodeBinaryOperator.GreaterThanOrEqual:
         case CodeBinaryOperator.LessThanOrEqual:
         case CodeBinaryOperator.IdentityEquality:
         case CodeBinaryOperator.IdentityInequality:
             return true;
     }
     return false;
 }