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); } }
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}"); } }