Beispiel #1
0
        private ReturnValue AddStuffTogetherHack()
        {
            ReturnValue rhs = PopValue();
            ReturnValue lhs = PopValue();

            if (rhs.getReturnValueType() == ReturnValueType.NUMBER &&
                lhs.getReturnValueType() == ReturnValueType.NUMBER)
            {
                return(new ReturnValue(rhs.NumberValue + lhs.NumberValue));
            }
            else if (rhs.getReturnValueType() != ReturnValueType.STRING &&
                     lhs.getReturnValueType() != ReturnValueType.STRING)
            {
                SortedDictionary <int, ReturnValue> newArray = new SortedDictionary <int, ReturnValue>();
                //int totalLength = lhs.ArrayValue.Count + rhs.ArrayValue.Count;
                //ReturnValue[] array = new ReturnValue[totalLength];
                for (int i = 0; i < lhs.ArrayValue.Count; i++)
                {
                    newArray.Add(i, lhs.ArrayValue[i]);
                }
                for (int i = 0; i < rhs.ArrayValue.Count; i++)
                {
                    newArray.Add(i + lhs.ArrayValue.Count, rhs.ArrayValue[i]);
                }
                return(new ReturnValue(newArray));
            }
            else
            {
                return(new ReturnValue(lhs.ToString() + rhs.ToString()));
            }
        }
Beispiel #2
0
        private ReturnValue equalityTest()
        {
            ReturnValue rhs = PopValue();
            ReturnValue lhs = PopValue();

            if (rhs.getReturnValueType() == ReturnValueType.NUMBER &&
                lhs.getReturnValueType() == ReturnValueType.NUMBER)
            {
                return(new ReturnValue(lhs.NumberValue == rhs.NumberValue));
            }

            if (rhs.getReturnValueType() == ReturnValueType.BOOL &&
                lhs.getReturnValueType() == ReturnValueType.BOOL)
            {
                return(new ReturnValue(lhs.BoolValue == rhs.BoolValue));
            }

            if (rhs.getReturnValueType() == ReturnValueType.STRING &&
                lhs.getReturnValueType() == ReturnValueType.STRING)
            {
                return(new ReturnValue(lhs.StringValue.ToLower() == rhs.StringValue.ToLower()));
            }

            throw new Error("Can't compare those two things (" + lhs.ToString() + " of type " + lhs.getReturnValueType() + " and " + rhs.ToString() + " of type " + rhs.getReturnValueType() + ")");
        }
Beispiel #3
0
        private void JumpToFunction()
        {
            AST_FunctionDefinitionNode functionDefinitionNode = (CurrentNode as AST_FunctionCall).FunctionDefinitionRef;
            string functionName = functionDefinitionNode.getChild(1).getTokenString();

            int nrOfParameters = functionDefinitionNode.getChild(2).getChildren().Count;

            ReturnValue[] parameters = new ReturnValue[nrOfParameters];
            for (int i = nrOfParameters - 1; i >= 0; i--)
            {
                parameters[i] = PopValue();
            }

            if (m_externalFunctionCreator.externalFunctions.ContainsKey(functionName))
            {
                //Console.WriteLine("Calling external function " + functionName);
                ExternalFunctionCreator.OnFunctionCall fc = m_externalFunctionCreator.externalFunctions[functionName];
                ReturnValue rv = fc(parameters);
                if (rv.getReturnValueType() != ReturnValueType.VOID)
                {
                    PushValue(rv);
                }
            }
            else
            {
                PushNewScope(functionDefinitionNode.getScope(), functionName + "_memorySpace" + functionCounter++, functionDefinitionNode);

                for (int i = nrOfParameters - 1; i >= 0; i--)
                {
                    PushValue(parameters[i]); // reverse order
                }
            }
        }
Beispiel #4
0
        private AST CreateAssignmentTreeFromInitValue(string pVariableName, ReturnValue pInitValue)
        {
            Token.TokenType tokenType;
            switch (pInitValue.getReturnValueType())
            {
            case ReturnValueType.BOOL:
                tokenType = Token.TokenType.BOOLEAN_VALUE;
                break;

            case ReturnValueType.STRING:
                tokenType = Token.TokenType.QUOTED_STRING;
                break;

            case ReturnValueType.NUMBER:
                tokenType = Token.TokenType.NUMBER;
                break;

            case ReturnValueType.ARRAY:
                tokenType = Token.TokenType.ARRAY;
                break;

            case ReturnValueType.VOID:
                throw new Error("Can't assign void to variable");

            default:
                throw new Exception("Forgot to implement support for a type?");
            }
            Token initValueToken = new TokenWithValue(tokenType, pInitValue.ToString(), pInitValue);
            AST   assignmentTree = new AST_Assignment(new Token(Token.TokenType.ASSIGNMENT, "="), pVariableName);

            assignmentTree.addChild(initValueToken);
            return(assignmentTree);
        }
Beispiel #5
0
        private ReturnValue ConvertToType(ReturnValue valueToConvert, ReturnValueType type)
        {
#if WRITE_CONVERT_INFO
            Console.WriteLine("Converting from " + valueToConvert.getReturnValueType() +
                              " (" + valueToConvert.ToString() + ")" +
                              " to " + type);
#endif
            ReturnValue result = null;

            if (type == ReturnValueType.VOID)
            {
                throw new Error("Can't convert to void.");
            }
            else if (type == ReturnValueType.UNKNOWN_TYPE)
            {
                // Don't convert but make a new copy with the same type
                type = valueToConvert.getReturnValueType();
            }

            if (type == ReturnValueType.ARRAY)
            {
                result = new ReturnValue(valueToConvert.ArrayValue);
            }
            else if (type == ReturnValueType.BOOL)
            {
                result = new ReturnValue(valueToConvert.BoolValue);
            }
            else if (type == ReturnValueType.NUMBER)
            {
                result = new ReturnValue(valueToConvert.NumberValue);
            }
            else if (type == ReturnValueType.STRING)
            {
                result = new ReturnValue(valueToConvert.StringValue);
            }
            else
            {
                throw new Exception("Can't happen!");
            }
#if WRITE_CONVERT_INFO
            Console.WriteLine("Result: " + result.ToString());
#endif
            return(result);
        }
Beispiel #6
0
        private ReturnValue sqrt(ReturnValue[] parameters)
        {
            ReturnValue parameter0 = parameters[0];

            if (parameter0.getReturnValueType() == ReturnValueType.NUMBER)
            {
                return(new ReturnValue((float)(Math.Sqrt(parameter0.NumberValue))));
            }
            else
            {
                m_sprakRunner.getRuntimeErrorHandler().errorOccured(new Error("Can't use sqrt on something that's not a number", Error.ErrorType.SYNTAX, 0, 0));
                return(new ReturnValue(0.0f));
            }
        }
Beispiel #7
0
 private AST CreateAssignmentTreeFromInitValue(string pVariableName, ReturnValue pInitValue)
 {
     Token.TokenType tokenType;
     switch(pInitValue.getReturnValueType()) {
         case ReturnValueType.BOOL:
             tokenType = Token.TokenType.BOOLEAN_VALUE;
         break;
         case ReturnValueType.STRING:
             tokenType = Token.TokenType.QUOTED_STRING;
         break;
         case ReturnValueType.NUMBER:
             tokenType = Token.TokenType.NUMBER;
         break;
         case ReturnValueType.ARRAY:
             tokenType = Token.TokenType.ARRAY;
         break;
         case ReturnValueType.VOID:
             throw new Error("Can't assign void to variable");
         default:
             throw new Exception("Forgot to implement support for a type?");
     }
     Token initValueToken = new TokenWithValue(tokenType, pInitValue.ToString(), pInitValue);
     AST assignmentTree = new AST_Assignment(new Token(Token.TokenType.ASSIGNMENT, "="), pVariableName);
     assignmentTree.addChild(initValueToken);
     return assignmentTree;
 }