using System; using System.Collections.Generic; using System.Text; using CLab.Auxiliary; using CLab.Exceptions; namespace CLab { /// /// Superclass for the different types of Expressions /// abstract public class Expression { private Common.ExprType type; /// /// Constructor /// /// The type of the expression: This can be either an operator /// working on a left and right side, or an id or integer expression public Expression(Common.ExprType type) { this.type = type; } /// /// Returns the type /// public Common.ExprType Type { get { return this.type; } } /// /// Converts the type to an operator sign for printout /// /// The operator to print out /// public String Type2oper(Common.ExprType type) { String setOper; switch (type) { case Common.ExprType.et_impl: setOper = ">>"; break; case Common.ExprType.et_or: setOper = "|"; break; case Common.ExprType.et_and: setOper = "&"; break; case Common.ExprType.et_lte: setOper = "<="; break; case Common.ExprType.et_gte: setOper = ">="; break; case Common.ExprType.et_lt: setOper = "<"; break; case Common.ExprType.et_gt: setOper = ">"; break; case Common.ExprType.et_ne: setOper = "!="; break; case Common.ExprType.et_eq: setOper = "=="; break; case Common.ExprType.et_minus: setOper = "-"; break; case Common.ExprType.et_plus: setOper = "+"; break; case Common.ExprType.et_mod: setOper = "%"; break; case Common.ExprType.et_div: setOper = "/"; break; case Common.ExprType.et_times: setOper = "*"; break; default: throw new ClabInternalErrorException("Invalid ExpressionGammel type"); } return setOper; } public override string ToString() { if (this.type.Equals(Common.ExprType.et_id)) { IdExpression idExpression = (IdExpression)this; return (String.Format("{0}", idExpression.Id)); } else if (this.type.Equals(Common.ExprType.et_val)) { IntExpression intExpression = (IntExpression)this; return (String.Format("{0}", intExpression.IntegerValue)); } else if (this.type.Equals(Common.ExprType.et_neg)) { NotNegExpression nnExpression = (NotNegExpression)this; return (String.Format("(-{0})", nnExpression.Left)); } else if (this.type.Equals(Common.ExprType.et_not)) { NotNegExpression nnExpression = (NotNegExpression)this; return (String.Format("(!{0})", nnExpression.Left)); } else { BinaryExpression binExpression = (BinaryExpression)this; return (String.Format("({0} {1} {2})", binExpression.Left, Type2oper(binExpression.Type), binExpression.Right)); } } } }