public ParserType Visit(ParserUnaryOp op) { ParserType subExpr = op.Expr.Accept(this); if (subExpr.Typ != ParserTypeEnum.Pair || !(subExpr is ParserProdType)) { throw new ArgumentException("Projection must apply to a pair. Current type: " + subExpr.ToString()); } var prod = subExpr as ParserProdType; switch (op.OpType) { case ParserUnaryOpType.ProjL: op.Type = prod.Left; return(prod.Left); case ParserUnaryOpType.ProjR: op.Type = prod.Right; return(prod.Right); default: throw new ArgumentException("Unknown Unary Operation"); } }
public Expression Visit(ParserUnaryOp op) { Expression subExpr = op.Expr.Accept(this); ParserProdType type = op.Expr.Type as ParserProdType; switch (op.OpType) { case ParserUnaryOpType.ProjL: if (type.Left is ParserNumType) { return(new NumProjL(subExpr as AbstractPairExpression)); } if (type.Left is ParserLogicType) { return(new LogicProjL(subExpr as AbstractPairExpression)); } if (type.Left is ParserProdType) { return(new PairProjL(subExpr as AbstractPairExpression)); } if (type.Left is ParserLambdaType) { return(new LambdaProjL(subExpr as AbstractPairExpression)); } break; case ParserUnaryOpType.ProjR: if (type.Right is ParserNumType) { return(new NumProjR(subExpr as AbstractPairExpression)); } if (type.Right is ParserLogicType) { return(new LogicProjR(subExpr as AbstractPairExpression)); } if (type.Right is ParserProdType) { return(new PairProjR(subExpr as AbstractPairExpression)); } if (type.Right is ParserLambdaType) { return(new LambdaProjR(subExpr as AbstractPairExpression)); } break; default: break; } throw new ArgumentException("Unknown unary operation"); }