示例#1
0
 public void TestUnaryOpExp(UnaryOperatorAstNode expect,
                            UnaryOperatorAstNode actual, string traceMessage)
 {
     Assert.AreEqual(expect.Operator, expect.Operator,
                     traceMessage + " -> Operator");
     TestGeneral(expect.Expr, actual.Expr, traceMessage + " -> UnaryExpr");
 }
        public void Visit(UnaryOperatorAstNode visitable)
        {
            if (visitable.Operator == "+" || visitable.Operator == "-")
            {
                BasicAstNode lhs;
                if (visitable.Expr.GetType() == typeof(IntegerAstNode))
                {
                    lhs = new IntegerAstNode(0);
                }
                else
                {
                    lhs = new FloatAstNode(0);
                }

                Visit(new BinaryOperatorAstNode(visitable.Operator, lhs, visitable.Expr));
                return;
            }

            switch (visitable.Operator)
            {
            case "address_of":
                throw new NotSupportedException(
                          "It seems that clr does not support pointer");

            case "not":
                Visit(visitable.Expr);
                Gen.Emit(OpCodes.Not);
                break;

            default:
                throw new Exception(
                          "Unknown unary operator: " + visitable.Operator);
            }
        }
示例#3
0
        public void Visit(UnaryOperatorAstNode visitable)
        {
            if (visitable.Operator == "address_of")
            {
                throw new SemanticException("address_of operator is not implemented");
            }

            Visit(visitable.Expr);
            if (_exprType != "i64")
            {
                throw new WrongTypeException(
                          $"Cannot use {visitable.Operator} on type: {_exprType}");
            }
        }