public Expression(AbstractNode lhs, ExpressionEnums op, AbstractNode rhs) { ExpressionType = op; adoptChildren(lhs); adoptChildren(rhs); }
private string GetOpSymbol(ExpressionEnums op) { switch (op) { case ExpressionEnums.EQUALS: return(" = "); case ExpressionEnums.OP_LOR: return(" || "); case ExpressionEnums.OP_LAND: return(" && "); case ExpressionEnums.PIPE: return(" | "); case ExpressionEnums.HAT: return(" ^ "); case ExpressionEnums.AND: return(" & "); case ExpressionEnums.OP_EQ: return(" == "); case ExpressionEnums.OP_NE: return(" != "); case ExpressionEnums.OP_GT: return(" > "); case ExpressionEnums.OP_LT: return(" < "); case ExpressionEnums.OP_LE: return(" <= "); case ExpressionEnums.OP_GE: return(" >= "); case ExpressionEnums.PLUSOP: return(" + "); case ExpressionEnums.MINUSOP: return(" - "); case ExpressionEnums.ASTERISK: return(" * "); case ExpressionEnums.RSLASH: return(" / "); case ExpressionEnums.PERCENT: return(" % "); default: return("[" + op + "]"); } }
public Expression(AbstractNode arithmeticUnaryOperator, AbstractNode expression, string prec, ExpressionEnums op) { ExpressionType = op; _precision = Int32.Parse(prec); ArithmeticUnaryOperator = ((ArithmeticUnaryOperator)arithmeticUnaryOperator).GetOp; adoptChildren(expression); }
private string GetOpName(ExpressionEnums op) { switch (op) { case ExpressionEnums.EQUALS: return("assignment"); case ExpressionEnums.OP_LOR: return("comparison"); case ExpressionEnums.OP_LAND: return("comparison"); case ExpressionEnums.HAT: return("exponentiation"); case ExpressionEnums.OP_EQ: return("comparison"); case ExpressionEnums.OP_NE: return("comparison"); case ExpressionEnums.OP_GT: return("comparison"); case ExpressionEnums.OP_LT: return("comparison"); case ExpressionEnums.OP_LE: return("comparison"); case ExpressionEnums.OP_GE: return("comparison"); case ExpressionEnums.PLUSOP: return("addition"); case ExpressionEnums.MINUSOP: return("subtraction"); case ExpressionEnums.ASTERISK: return("multiplication"); case ExpressionEnums.RSLASH: return("division"); case ExpressionEnums.PERCENT: return("mod"); default: return("[" + op + "]"); } }
private TypeDescriptor BoolBinaryExp(AbstractNode lhs, AbstractNode rhs, ExpressionEnums op) { lhs.Accept(this); rhs.Accept(this); if (TypesCompatible(lhs.TypeDescriptor, rhs.TypeDescriptor)) { return(new PrimitiveTypeBooleanDescriptor()); } return(new ErrorDescriptor("Comparison of incompatible types: " + GetSimpleName(lhs.TypeDescriptor) + GetOpSymbol(op) + GetSimpleName(rhs.TypeDescriptor))); }
private TypeDescriptor EvalBinaryExp(AbstractNode lhs, AbstractNode rhs, ExpressionEnums op) { lhs.Accept(this); rhs.Accept(this); if (TypesCompatible(lhs.TypeDescriptor, rhs.TypeDescriptor)) { // catch two errors if (lhs.TypeDescriptor is ErrorDescriptor && rhs.TypeDescriptor is ErrorDescriptor) { // combine error messages return(((ErrorDescriptor)lhs.TypeDescriptor).CombineErrors ((ErrorDescriptor)rhs.TypeDescriptor)); } // change from number to primitive type int where possible if (lhs.TypeDescriptor is PrimitiveTypeIntDescriptor) { return(lhs.TypeDescriptor); } if (rhs.TypeDescriptor is PrimitiveTypeIntDescriptor) { return(rhs.TypeDescriptor); } // otherwise propagate up matching type return(lhs.TypeDescriptor); } if (lhs.TypeDescriptor is ErrorDescriptor) { return(lhs.TypeDescriptor); } if (rhs.TypeDescriptor is ErrorDescriptor) { return(rhs.TypeDescriptor); } // Otherwise return incompatible types error string err = (GetOpName(op).Length > 0) ? "attempted " + GetOpName(op) + ": " : "attempted: "; err = "Evaluation of incompatible types, " + err + GetSimpleName(lhs.TypeDescriptor) + GetOpSymbol(op) + GetSimpleName(rhs.TypeDescriptor); return(new ErrorDescriptor(err)); }
public ArithmeticUnaryOperator(ExpressionEnums op) { this.op = op; }
// TODO: Add functionaility for strings & bools private string GetIlOp(ExpressionEnums expEnum, TypeDescriptor type) { switch (expEnum) { //case ExpressionEnums.EQUALS: // break; case ExpressionEnums.OP_LOR: return("or"); case ExpressionEnums.OP_LAND: return("and"); //case ExpressionEnums.PIPE: // break; //case ExpressionEnums.HAT: // break; case ExpressionEnums.AND: return("and"); case ExpressionEnums.OP_EQ: return("ceq"); case ExpressionEnums.OP_NE: return("cne"); case ExpressionEnums.OP_GT: return("cgt"); case ExpressionEnums.OP_LT: return("clt"); case ExpressionEnums.OP_LE: return("cle"); case ExpressionEnums.OP_GE: return("cge"); case ExpressionEnums.PLUSOP: return("add"); case ExpressionEnums.MINUSOP: return("sub"); case ExpressionEnums.ASTERISK: return("mul"); case ExpressionEnums.RSLASH: return("div"); case ExpressionEnums.PERCENT: return("rem"); case ExpressionEnums.UNARY: return("neg"); //case ExpressionEnums.PRIMARY: // break; default: return("something bad happened"); } }