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); }
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; }
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); }
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); }
private void Comparision(Instruction il, CodeBinaryOperator op) { var rhs = Pop(); var lhs = Pop(); RefineBinaryExpression(lhs, rhs); var expr = OptimizeBinaryExpression(lhs, op, rhs); Push(expr); }
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; }