public LiteralExpression parseLiteralExpression() { LiteralExpression lit; switch (currentToken.type) { case Token.TokenValue.STRING: case Token.TokenValue.CHAR: case Token.TokenValue.INT: case Token.TokenValue.BOOLEAN: lit = new LiteralExpression(currentToken); nextToken(); return lit; default: throw new UndefinedException(lineNumber, colNumber); } }
public ObjectExpression evalSimpleExpression(SimpleExpression exp) { if (exp is LiteralExpression) { lit = (LiteralExpression)exp; switch (lit.value.type) { case ParserUtils.Token.TokenValue.STRING: return new ObjectExpression(ObjectType.stringType, lit.value.stringValue); case ParserUtils.Token.TokenValue.INT: return new ObjectExpression(ObjectType.intType, lit.value.intValue); case ParserUtils.Token.TokenValue.CHAR: return new ObjectExpression(ObjectType.charType, lit.value.charValue); case ParserUtils.Token.TokenValue.BOOLEAN: return new ObjectExpression(ObjectType.booleanType, lit.value.booleanValue); default: break; } } else if (exp is SubSimpleExpression) { return evalSimpleExpression(((SubSimpleExpression)exp).exp); } else if (exp is NullExpression) { return null; } else if (exp is BinaryOperatorExpression) { BinaryOperatorExpression binExp = (BinaryOperatorExpression)exp; ObjectExpression oLeft = evalSimpleExpression(binExp.e1), oRight; switch (binExp.op) { case ParserUtils.Token.TokenValue.AND: if ((bool)oLeft.value) { oRight = evalSimpleExpression(binExp.e2); return new ObjectExpression(ObjectType.booleanType, (bool)oRight.value); } return new ObjectExpression(ObjectType.booleanType, false); case ParserUtils.Token.TokenValue.OR: if ((bool)oLeft.value) { return new ObjectExpression(ObjectType.booleanType, true); } oRight = evalSimpleExpression(binExp.e2); return new ObjectExpression(ObjectType.booleanType, (bool)oRight.value); case ParserUtils.Token.TokenValue.PLUS: oRight = evalSimpleExpression(binExp.e2); if (oLeft.type == ObjectType.stringType || oRight.type == ObjectType.stringType) { return new ObjectExpression(ObjectType.stringType, oLeft.value.ToString() + oRight.value.ToString()); } if (oLeft.type == ObjectType.intType && oRight.type == ObjectType.intType) { return new ObjectExpression(ObjectType.intType, (int)oLeft.value + (int)oRight.value); } break; case ParserUtils.Token.TokenValue.MINUS: oRight = evalSimpleExpression(binExp.e2); return new ObjectExpression(ObjectType.intType, (int)oLeft.value - (int)oRight.value); case ParserUtils.Token.TokenValue.TIMES: oRight = evalSimpleExpression(binExp.e2); return new ObjectExpression(ObjectType.intType, (int)oLeft.value * (int)oRight.value); case ParserUtils.Token.TokenValue.DIV: oRight = evalSimpleExpression(binExp.e2); return new ObjectExpression(ObjectType.intType, (int)oLeft.value / (int)oRight.value); case ParserUtils.Token.TokenValue.LT: oRight = evalSimpleExpression(binExp.e2); return new ObjectExpression(ObjectType.booleanType, (int)oLeft.value < (int)oRight.value); case ParserUtils.Token.TokenValue.GT: oRight = evalSimpleExpression(binExp.e2); return new ObjectExpression(ObjectType.booleanType, (int)oLeft.value > (int)oRight.value); case ParserUtils.Token.TokenValue.LEQ: oRight = evalSimpleExpression(binExp.e2); return new ObjectExpression(ObjectType.booleanType, (int)oLeft.value <= (int)oRight.value); case ParserUtils.Token.TokenValue.GEQ: oRight = evalSimpleExpression(binExp.e2); return new ObjectExpression(ObjectType.booleanType, (int)oLeft.value >= (int)oRight.value); case ParserUtils.Token.TokenValue.EQBOOL: oRight = evalSimpleExpression(binExp.e2); if (oLeft.type == ObjectType.intType) { return new ObjectExpression(ObjectType.booleanType, (int)oLeft.value == (int)oRight.value); } if (oLeft.type == ObjectType.stringType) { return new ObjectExpression(ObjectType.booleanType, ((string)oLeft.value).Equals((string)oRight.value)); } if (oLeft.type == ObjectType.booleanType) { return new ObjectExpression(ObjectType.booleanType, (bool)oLeft.value == (bool)oRight.value); } if (oLeft.type == ObjectType.charType) { return new ObjectExpression(ObjectType.booleanType, (char)oLeft.value == (char)oRight.value); } break; default: break; } } else if (exp is UnaryOperatorExpression) { unExp = (UnaryOperatorExpression)exp; switch (unExp.op) { case ParserUtils.Token.TokenValue.NEG: o1 = evalSimpleExpression(((UnaryOperatorExpression)exp).exp); return new ObjectExpression(ObjectType.booleanType, !((bool)o1.value)); } } else if (exp is VariableExpression) { return variables[((VariableExpression)exp).name]; } else if (exp is CharacterVariableExpression) { return new ObjectExpression(ObjectType.intType, IrisData.getPlayerVariable(((CharacterVariableExpression)exp).name)); } return null; }
public CaseExpression(LiteralExpression literalValue, Expression bodyExp) { this.literal = literalValue; }