Example #1
0
        public void ChangeGlobalVariableInitValue(string pName, object pobject)
        {
            bool foundVariable     = false;
            AST  statementListTree = m_ast.getChild(0);
            AST  globalVarDefs     = statementListTree.getChild(0);

            if (globalVarDefs.getTokenString() != "<GLOBAL_VARIABLE_DEFINITIONS_LIST>")
            {
                throw new Exception("Wrong node, " + globalVarDefs.getTokenString());
            }
            if (globalVarDefs.getChildren() != null && globalVarDefs.getChildren().Count > 0)
            {
                foreach (AST defAndAssignmentNode in globalVarDefs.getChildren())
                {
                    AST_Assignment assigmentNode = (AST_Assignment)defAndAssignmentNode.getChild(1);
                    if (assigmentNode.VariableName == pName)
                    {
                        defAndAssignmentNode.removeChild(1);
                        defAndAssignmentNode.addChild(CreateAssignmentTreeFromInitValue(pName, pobject));
                        foundVariable = true;
                        break;
                    }
                }
            }
            if (!foundVariable)
            {
                throw new Exception("Couldn't find and change the variable " + pName);
            }
        }
Example #2
0
        private void evaluateReferencesForNAME(AST tree)
        {
            Symbol symbol = m_currentScope.resolve(tree.getTokenString());

            if (symbol == null)
            {
                m_errorHandler.errorOccured(
                    new  Error("Can't find anything called '" + tree.getTokenString() + "'",
                               Error.ErrorType.SYNTAX,
                               tree.getToken().LineNr,
                               tree.getToken().LinePosition));
            }
            else if (symbol is FunctionSymbol)
            {
                m_errorHandler.errorOccured(
                    new  Error("'" + tree.getTokenString() + "' is a function and must be called with ()",
                               Error.ErrorType.SYNTAX,
                               tree.getToken().LineNr,
                               tree.getToken().LinePosition));
            }

            #if WRITE_DEBUG_INFO
            Console.WriteLine("Resolved symbol with name " + tree.getTokenString() + " (on line " + tree.getToken().LineNr + ")" + " in " + m_currentScope);
            #endif

            evaluateReferencesInAllChildren(tree);
        }
Example #3
0
        private void evaluateReferencesForARRAY_LOOKUP(AST tree)
        {
            AST lookup = tree;

            Symbol variableNameSymbol = m_currentScope.resolve(lookup.getTokenString());

            if (variableNameSymbol == null)
            {
                m_errorHandler.errorOccured("Can't lookup in undefined array " + lookup.getTokenString(),
                                            Error.ErrorType.SYNTAX,
                                            lookup.getToken().LineNr,
                                            lookup.getToken().LinePosition);
            }

            evaluateReferencesInAllChildren(tree);
        }
Example #4
0
        private ReturnValue name(AST tree)
        {
            string      name = tree.getTokenString();
            ReturnValue val  = null;

            val = m_currentMemorySpace.getValue(name);
            if (val == null)
            {
                val = m_globalMemorySpace.getValue(name);
            }

            Assert.IsNotNull(val);

#if WRITE_DEBUG_INFO
            Console.WriteLine("The fetched value is of type " + val.getReturnType());
            if (val.getReturnType() == ReturnType.FLOAT)
            {
                Console.WriteLine("And has value: " + val.FloatValue);
            }
            else if (val.getReturnType() == ReturnType.STRING)
            {
                Console.WriteLine("And has value: " + val.StringValue);
            }
#endif
            return(val);
        }
Example #5
0
        private ReturnValue execute(AST tree)
        {
            Token.TokenType tokenType   = tree.getToken().getTokenType();
            ReturnValue     returnValue = null;

            if (tokenType == Token.TokenType.FUNC_DECLARATION)
            {
                return(new ReturnValue());
            }

#if WRITE_DEBUG_INFO
            Console.WriteLine("Executing " + tree.getTokenType() + " " + tree.getTokenString());
#endif

            if (tokenType == Token.TokenType.STATEMENT_LIST)
            {
                executeAllChildNodes(tree);
            }
            else if (tokenType == Token.TokenType.FUNCTION_CALL)
            {
                returnValue = functionCall(tree);
            }
            else if (tokenType == Token.TokenType.NAME)
            {
                returnValue = name(tree);
            }
            else if (tokenType == Token.TokenType.NUMBER)
            {
                returnValue = number(tree);
            }
            else if (tokenType == Token.TokenType.OPERATOR)
            {
                returnValue = operation(tree);
            }
            else if (tokenType == Token.TokenType.QUOTED_STRING)
            {
                returnValue = quotedString(tree);
            }
            else if (tokenType == Token.TokenType.IF)
            {
                ifThenElse(tree);
            }
            else if (tokenType == Token.TokenType.VAR_DECLARATION)
            {
                varDeclaration(tree);
            }
            else if (tokenType == Token.TokenType.ASSIGNMENT)
            {
                assignment(tree);
            }
            else if (tokenType == Token.TokenType.RETURN)
            {
                returnStatement(tree);
            }
            else
            {
                throw new NotImplementedException("The interpreter hasn't got support for token type " + tokenType + " yet!");
            }
            return(returnValue);
        }
Example #6
0
        public AST findParent(AST ofThisChild)
        {
            Console.WriteLine("Going into " + getTokenString());

            if (ofThisChild == null)
            {
                return(null);
            }
            if (m_children == null)
            {
                return(null);
            }

            int i = m_children.IndexOf(ofThisChild);

            if (i >= 0)
            {
                Console.WriteLine("Found " + ofThisChild.getTokenString());
                return(this);
            }
            else
            {
                foreach (AST child in m_children)
                {
                    AST parent = child.findParent(ofThisChild);
                    if (parent != null)
                    {
                        return(parent);
                    }
                }
            }
            return(null);
        }
Example #7
0
        private ReturnValue functionCall(AST tree)
        {
            ReturnValue returnValue = null;

            if (m_externalFunctionCreator.externalFunctions.ContainsKey(tree.getTokenString()))
            {
                ExternalFunctionCreator.OnFunctionCall functionCall = m_externalFunctionCreator.externalFunctions[tree.getTokenString()];
                if (functionCall != null)
                {
                    ReturnValue[] parameters = new ReturnValue[tree.getChildren().Count];
                    int           i          = 0;
                    foreach (AST parameter in tree.getChildren())
                    {
                        parameters[i] = execute(parameter);
                        i++;
                    }
                    returnValue = functionCall(parameters);
                }
                else
                {
                    throw new Error("Can't find external function " + tree.getTokenString(), Error.ErrorType.UNDEFINED, tree.getToken().LineNr, tree.getToken().LinePosition);
                }
            }
            else
            {
                // Call user defined function
                string functionName = tree.getTokenString();
                AST    functionTree = getFunctionTreeNode(functionName);
                Assert.IsNotNull(functionTree);

                // Create list of parameter values
                List <ReturnValue> parameterValues        = new List <ReturnValue>();
                List <AST>         functionCallChildNodes = tree.getChildren();
                if (functionCallChildNodes != null)
                {
                    foreach (AST parameter in tree.getChildren())
                    {
                        ReturnValue val = execute(parameter);
                        parameterValues.Add(val);
                    }
                }

                returnValue = function(functionTree, parameterValues);
            }

            return(returnValue);
        }
Example #8
0
        private AST arrayLookup()
        {
            AST arrayName       = new AST(match(Token.TokenType.NAME));
            AST arrayLookupNode = new AST(new Token(Token.TokenType.ARRAY_LOOKUP, arrayName.getTokenString()));

            match(Token.TokenType.BRACKET_LEFT);
            AST arrayIndex = expression();

            match(Token.TokenType.BRACKET_RIGHT);
            arrayLookupNode.addChild(arrayIndex);
            return(arrayLookupNode);
        }
Example #9
0
        private void addToList(List <AST> list, AST ast)
        {
            switch (ast.getTokenType())
            {
            case  Token.TokenType.FUNC_DECLARATION:
                addToList(list, ast.getChild(2));
                addToList(list, ast.getChild(3));
                break;

            case Token.TokenType.IF:
                addToList(list, ast.getChild(0));
                list.Add(ast);
#if WRITE_DEBUG_INFO
                Console.WriteLine(": " + ast.getTokenString() + " of type " + ast.getTokenType());
#endif
                break;

            case Token.TokenType.LOOP:
                list.Add(ast);
#if WRITE_DEBUG_INFO
                Console.WriteLine(": " + ast.getTokenString() + " of type " + ast.getTokenType());
#endif
                break;

            case Token.TokenType.LOOP_BLOCK:
                list.Add(ast);
#if WRITE_DEBUG_INFO
                Console.WriteLine(": " + ast.getTokenString() + " of type " + ast.getTokenType());
#endif
                break;

            default:
                addChildren(list, ast);
#if WRITE_DEBUG_INFO
                Console.WriteLine(": " + ast.getTokenString() + " of type " + ast.getTokenType());
#endif
                list.Add(ast);
                break;
            }
        }
Example #10
0
        private void evaluateReferencesForFUNCTION_CALL(AST tree)
        {
            // Function name:
            string functionName = tree.getTokenString();

            var sym = m_currentScope.resolve(functionName);

            FunctionSymbol function = sym as FunctionSymbol;

            if (function == null)
            {
                m_errorHandler.errorOccured("Can't find function with name " + functionName,
                                            Error.ErrorType.SCOPE,
                                            tree.getToken().LineNr,
                                            tree.getToken().LinePosition
                                            );
            }
            else
            {
                #if WRITE_DEBUG_INFO
                Console.WriteLine("Resolved function call with name " + functionName + " (on line " + tree.getToken().LineNr + ")");
                #endif

                // Parameters
                evaluateReferencesInAllChildren(tree);

                AST node = function.getFunctionDefinitionNode();
                AST_FunctionDefinitionNode functionDefinitionTree = (AST_FunctionDefinitionNode)(node);

                /*if(functionDefinitionTree.getTokenString() != "<EXTERNAL_FUNC_DECLARATION>") {
                 * evaluateReferencesForFUNC_DECLARATION(functionDefinitionTree);
                 * }*/

                // Setup reference to Function Definition AST node
                AST_FunctionCall functionCallAst = tree as AST_FunctionCall;
                Debug.Assert(functionCallAst != null);
                functionCallAst.FunctionDefinitionRef = functionDefinitionTree;

                List <AST> calleeParameterList = functionDefinitionTree.getChild(2).getChildren();

                // Check that the number of arguments is right
                AST        callerParameterList = tree.getChild(0);
                List <AST> arguments           = callerParameterList.getChildren();

                if (arguments.Count != calleeParameterList.Count)
                {
                    m_errorHandler.errorOccured(
                        "Wrong nr of arguments to  '" + functionDefinitionTree.getChild(1).getTokenString() + "' , expected " + calleeParameterList.Count + " but got " + arguments.Count
                        , Error.ErrorType.SYNTAX, tree.getToken().LineNr, tree.getToken().LinePosition);
                }
            }
        }
Example #11
0
        private void evaluateReferencesForNAME(AST tree)
        {
#if DEBUG
            if (m_currentScope == null)
            {
                throw new Exception("m_currentScope is null");
            }
            if (tree == null)
            {
                throw new Exception("tree is null");
            }
#endif

            Symbol symbol = m_currentScope.resolve(tree.getTokenString());

            if (symbol == null)
            {
                m_errorHandler.errorOccured(
                    new  Error("Can't find variable or function '" + tree.getTokenString() + "' (forgot quotes?)",
                               Error.ErrorType.SYNTAX,
                               tree.getToken().LineNr,
                               tree.getToken().LinePosition));
            }
            else if (symbol is FunctionSymbol)
            {
                m_errorHandler.errorOccured(
                    new  Error("'" + tree.getTokenString() + "' is a function and must be called with ()",
                               Error.ErrorType.SYNTAX,
                               tree.getToken().LineNr,
                               tree.getToken().LinePosition));
            }

            #if WRITE_DEBUG_INFO
            Console.WriteLine("Resolved symbol with name " + tree.getTokenString() + " (on line " + tree.getToken().LineNr + ")" + " in " + m_currentScope);
            #endif

            evaluateReferencesInAllChildren(tree);
        }
Example #12
0
        private ReturnValue operation(AST tree)
        {
            ReturnValue returnValue = null;

            float lhs = execute(tree.getChild(0)).FloatValue;
            float rhs = execute(tree.getChild(1)).FloatValue;

            if (tree.getTokenString() == "+")
            {
                returnValue = new ReturnValue(lhs + rhs);
            }
            else if (tree.getTokenString() == "-")
            {
                returnValue = new ReturnValue(lhs - rhs);
            }
            else if (tree.getTokenString() == "*")
            {
                returnValue = new ReturnValue(lhs * rhs);
            }
            else if (tree.getTokenString() == "/")
            {
                returnValue = new ReturnValue(lhs / rhs);
            }
            else if (tree.getTokenString() == "<")
            {
                float v = lhs < rhs ? 1 : 0;
                returnValue = new ReturnValue(v);
            }
            else if (tree.getTokenString() == ">")
            {
                float v = lhs > rhs ? 1 : 0;
                returnValue = new ReturnValue(v);
            }
            else if (tree.getTokenString() == "<=")
            {
                float v = lhs <= rhs ? 1 : 0;
                returnValue = new ReturnValue(v);
            }
            else if (tree.getTokenString() == ">=")
            {
                float v = lhs >= rhs ? 1 : 0;
                returnValue = new ReturnValue(v);
            }
            else if (tree.getTokenString() == "==")
            {
                float v = lhs == rhs ? 1 : 0;
                returnValue = new ReturnValue(v);
            }
            else if (tree.getTokenString() == "!=")
            {
                float v = lhs != rhs ? 1 : 0;
                returnValue = new ReturnValue(v);
            }
            else if (tree.getTokenString() == "&&")
            {
                float v = ((lhs != 0 ? true : false) && (rhs != 0 ? true : false)) ? 1 : 0;
                returnValue = new ReturnValue(v);
            }
            else if (tree.getTokenString() == "||")
            {
                float v = ((lhs != 0 ? true : false) || (rhs != 0 ? true : false)) ? 1 : 0;
                returnValue = new ReturnValue(v);
            }
            else
            {
                throw new NotImplementedException("Operator " + tree.getTokenString() + " isn't implemented yet!");
            }

            return(returnValue);
        }
Example #13
0
        private void Operator()
        {
            object result;
            float  rhs, lhs;

            switch (CurrentNode.getTokenString())
            {
            case "+":
                result = AddStuffTogetherHack();
                break;

            case "-":
                rhs    = ConvertToNumber(PopValue());
                lhs    = ConvertToNumber(PopValue());
                result = lhs - rhs;
                break;

            case "*":
                result = ConvertToNumber(PopValue()) * ConvertToNumber(PopValue());
                break;

            case "/":
                rhs    = ConvertToNumber(PopValue());
                lhs    = ConvertToNumber(PopValue());
                result = lhs / rhs;
                break;

            case "<":
                rhs    = ConvertToNumber(PopValue());
                lhs    = ConvertToNumber(PopValue());
                result = lhs < rhs;
                break;

            case ">":
                rhs    = ConvertToNumber(PopValue());
                lhs    = ConvertToNumber(PopValue());
                result = lhs > rhs;
                break;

            case ">=":
                rhs    = ConvertToNumber(PopValue());
                lhs    = ConvertToNumber(PopValue());
                result = lhs >= rhs;
                break;

            case "<=":
                rhs    = ConvertToNumber(PopValue());
                lhs    = ConvertToNumber(PopValue());
                result = lhs <= rhs;
                break;

            case "==":
                result = equalityTest();
                break;

            case "!=":
                result = !ConvertToBool(equalityTest());
                break;

            case "&&":

                object a      = PopValue();
                bool   a_bool = ConvertToBool(a);
                //Console.WriteLine(a + " is of type " + a.GetType() + " , converted " + a_bool + " is of type " + a_bool.GetType());
                object b      = PopValue();
                bool   b_bool = ConvertToBool(b);
                result = a_bool && b_bool;
//				Console.WriteLine(string.Format("using &&, a = {0}, b = {1}, a_bool = {2}, b_bool = {3}, result = {4}", a, b, a_bool, b_bool, result));

                break;

            case "||":

                object a2      = PopValue();
                bool   a2_bool = ConvertToBool(a2);
                //Console.WriteLine(a + " is of type " + a.GetType() + " , converted " + a_bool + " is of type " + a_bool.GetType());
                object b2      = PopValue();
                bool   b2_bool = ConvertToBool(b2);
                result = a2_bool || b2_bool;
//				Console.WriteLine(string.Format("using ||, a2 = {0}, b2 = {1}, a2_bool = {2}, b2_bool = {3}, result = {4}", a2, b2, a2_bool, b2_bool, result));

                break;

            default:
                throw new Exception("Operator " + CurrentNode.getTokenString() + " is not implemented yet!");
            }

            //Console.WriteLine("Executing operator " + CurrentNode.getTokenString() + " with result " + result);

            PushValue(result);
        }
Example #14
0
        private void Operator()
        {
            ReturnValue result;
            float       rhs, lhs;

            switch (CurrentNode.getTokenString())
            {
            case "+":
                result = AddStuffTogetherHack();
                break;

            case "-":
                rhs    = PopValue().NumberValue;
                lhs    = PopValue().NumberValue;
                result = new ReturnValue(lhs - rhs);
                break;

            case "*":
                result = new ReturnValue(PopValue().NumberValue *PopValue().NumberValue);
                break;

            case "/":
                rhs    = PopValue().NumberValue;
                lhs    = PopValue().NumberValue;
                result = new ReturnValue(lhs / rhs);
                break;

            case "<":
                rhs    = PopValue().NumberValue;
                lhs    = PopValue().NumberValue;
                result = new ReturnValue(lhs < rhs);
                break;

            case ">":
                rhs    = PopValue().NumberValue;
                lhs    = PopValue().NumberValue;
                result = new ReturnValue(lhs > rhs);
                break;

            case ">=":
                rhs    = PopValue().NumberValue;
                lhs    = PopValue().NumberValue;
                result = new ReturnValue(lhs >= rhs);
                break;

            case "<=":
                rhs    = PopValue().NumberValue;
                lhs    = PopValue().NumberValue;
                result = new ReturnValue(lhs <= rhs);
                break;

            case "==":
                result = equalityTest();
                break;

            case "!=":
                result = new ReturnValue(!equalityTest().BoolValue);
                break;

            case "&&":
                rhs    = PopValue().NumberValue;
                lhs    = PopValue().NumberValue;
                result = new ReturnValue(lhs > 0 && rhs > 0);
                break;

            default:
                throw new Exception("Operator " + CurrentNode.getTokenString() + " is not implemented yet!");
            }

            //Console.WriteLine("Executing operator " + CurrentNode.getTokenString() + " with result " + result);

            PushValue(result);
        }
Example #15
0
 private AST arrayLookup()
 {
     AST arrayName = new AST(match(Token.TokenType.NAME));
     AST arrayLookupNode = new AST(new Token(Token.TokenType.ARRAY_LOOKUP, arrayName.getTokenString()));
     match(Token.TokenType.BRACKET_LEFT);
     AST arrayIndex = expression();
     match(Token.TokenType.BRACKET_RIGHT);
     arrayLookupNode.addChild(arrayIndex);
     return arrayLookupNode;
 }
Example #16
0
        private AST parameter()
        {
            #if WRITE_DEBUG_INFO
            Console.WriteLine("parameter");
            #endif

            AST parameterTree = new AST(new Token(Token.TokenType.PARAMETER, "<PARAMETER>", lookAhead(1).LineNr, lookAhead(1).LinePosition));

            AST type = null;

            if(lookAheadType(1) == Token.TokenType.BUILT_IN_TYPE_NAME) {
                type = new AST(match(Token.TokenType.BUILT_IN_TYPE_NAME));
            } else {
                type = new AST(new Token(Token.TokenType.BUILT_IN_TYPE_NAME, "var"));
            }
            AST name = new AST(match(Token.TokenType.NAME));

            AST declaration = new AST_VariableDeclaration(new Token(Token.TokenType.VAR_DECLARATION, "<PARAMETER_DECLARATION>"),
                                                          ExternalFunctionCreator.GetReturnTypeFromString(type.getTokenString()), name.getTokenString());

            AST assigment = new AST_Assignment(new Token(Token.TokenType.ASSIGNMENT, "="), name.getTokenString());

            parameterTree.addChild(declaration);
            parameterTree.addChild(assigment);

            return parameterTree;
        }
Example #17
0
 private ReturnValue number(AST tree)
 {
     ReturnValue returnValue = new ReturnValue((float)Convert.ToDouble(tree.getTokenString()));
     return returnValue;
 }
        private float evaluate(AST tree)
        {
            float returnValue = 0;

            if (tree.getTokenType() == Token.TokenType.NUMBER)
            {
                returnValue = (float)System.Convert.ToDouble(tree.getTokenString());
            }
            else if (tree.getTokenType() == Token.TokenType.OPERATOR)
            {
                if (tree.getTokenString() == "+")
                {
                    returnValue = evaluate(tree.getChild(0)) + evaluate(tree.getChild(1));
                }
                else if (tree.getTokenString() == "-")
                {
                    returnValue = evaluate(tree.getChild(0)) - evaluate(tree.getChild(1));
                }
                else if (tree.getTokenString() == "*")
                {
                    returnValue = evaluate(tree.getChild(0)) * evaluate(tree.getChild(1));
                }
                else if (tree.getTokenString() == "/")
                {
                    returnValue = evaluate(tree.getChild(0)) / evaluate(tree.getChild(1));
                }
                else if (tree.getTokenString() == "<")
                {
                    returnValue = (evaluate(tree.getChild(0)) < evaluate(tree.getChild(1))) ? 1 : 0;
                }
                else if (tree.getTokenString() == ">")
                {
                    returnValue = (evaluate(tree.getChild(0)) > evaluate(tree.getChild(1))) ? 1 : 0;
                }
                else if (tree.getTokenString() == "<=")
                {
                    returnValue = (evaluate(tree.getChild(0)) <= evaluate(tree.getChild(1))) ? 1 : 0;
                }
                else if (tree.getTokenString() == ">=")
                {
                    returnValue = (evaluate(tree.getChild(0)) >= evaluate(tree.getChild(1))) ? 1 : 0;
                }
                else if (tree.getTokenString() == "&&")
                {
                    returnValue = (evaluate(tree.getChild(0)) != 0 && evaluate(tree.getChild(1)) != 0) ? 1 : 0;
                }
                else if (tree.getTokenString() == "||")
                {
                    returnValue = (evaluate(tree.getChild(0)) != 0 || evaluate(tree.getChild(1)) != 0) ? 1 : 0;
                }
                else if (tree.getTokenString() == "!=")
                {
                    returnValue = (evaluate(tree.getChild(0)) != evaluate(tree.getChild(1))) ? 1 : 0;
                }
                else if (tree.getTokenString() == "==")
                {
                    returnValue = (evaluate(tree.getChild(0)) == evaluate(tree.getChild(1))) ? 1 : 0;
                }
                else
                {
                    throw new InvalidOperationException("ExpressionEvaluator can't handle operators with string " + tree.getTokenString());
                }
            }
            else
            {
                throw new InvalidOperationException("ExpressionEvaluator can't handle tokens of type " + tree.getTokenType());
            }
            return(returnValue);
        }
Example #19
0
        private AST parameter()
        {
#if WRITE_DEBUG_INFO
            Console.WriteLine("parameter");
#endif

            AST parameterTree = new AST(new Token(Token.TokenType.PARAMETER, "<PARAMETER>", lookAhead(1).LineNr, lookAhead(1).LinePosition));

            AST type = new AST(match(Token.TokenType.BUILT_IN_TYPE_NAME));
            AST name = new AST(match(Token.TokenType.NAME));

            AST declaration = new AST_VariableDeclaration(new Token(Token.TokenType.VAR_DECLARATION, "<PARAMETER_DECLARATION>"),
                                                          ReturnValue.getReturnValueTypeFromString(type.getTokenString()), name.getTokenString());


            AST assigment = new AST_Assignment(new Token(Token.TokenType.ASSIGNMENT, "="), name.getTokenString());

            parameterTree.addChild(declaration);
            parameterTree.addChild(assigment);

            return(parameterTree);
        }
Example #20
0
        private void evaluateReferencesForNAME(AST tree)
        {
            Symbol symbol = m_currentScope.resolve(tree.getTokenString());

            if(symbol == null) {
                m_errorHandler.errorOccured(
                                            new  Error("Can't find anything called '" + tree.getTokenString() + "'",
                                                       Error.ErrorType.SYNTAX,
                                                       tree.getToken().LineNr,
                                                       tree.getToken().LinePosition));
            }
            else if (symbol is FunctionSymbol) {
                m_errorHandler.errorOccured(
                                            new  Error("'" + tree.getTokenString() + "' is a function and must be called with ()",
                                                       Error.ErrorType.SYNTAX,
                                                       tree.getToken().LineNr,
                                                       tree.getToken().LinePosition));
            }

            #if WRITE_DEBUG_INFO
            Console.WriteLine("Resolved symbol with name " + tree.getTokenString() + " (on line " + tree.getToken().LineNr + ")" + " in " + m_currentScope);
            #endif

            evaluateReferencesInAllChildren(tree);
        }
Example #21
0
        private ReturnValue functionCall(AST tree)
        {
            ReturnValue returnValue = null;

            if (m_externalFunctionCreator.externalFunctions.ContainsKey(tree.getTokenString()))
            {
                ExternalFunctionCreator.OnFunctionCall functionCall = m_externalFunctionCreator.externalFunctions[tree.getTokenString()];
                if (functionCall != null)
                {
                    ReturnValue[] parameters = new ReturnValue[tree.getChildren().Count];
                    int i = 0;
                    foreach (AST parameter in tree.getChildren())
                    {
                        parameters[i] = execute(parameter);
                        i++;
                    }
                    returnValue = functionCall(parameters);
                }
                else
                {
                    throw new Error("Can't find external function " + tree.getTokenString(), Error.ErrorType.UNDEFINED, tree.getToken().LineNr, tree.getToken().LinePosition);
                }
            }
            else
            {
                // Call user defined function
                string functionName = tree.getTokenString();
                AST functionTree = getFunctionTreeNode(functionName);
                Assert.IsNotNull(functionTree);

                // Create list of parameter values
                List<ReturnValue> parameterValues = new List<ReturnValue>();
                List<AST> functionCallChildNodes = tree.getChildren();
                if (functionCallChildNodes != null)
                {
                    foreach(AST parameter in tree.getChildren())
                    {
                        ReturnValue val = execute(parameter);
                        parameterValues.Add(val);
                    }
                }

                returnValue = function(functionTree, parameterValues);
            }

            return returnValue;
        }
Example #22
0
        private ReturnValue execute(AST tree)
        {
            Token.TokenType tokenType = tree.getToken().getTokenType();
            ReturnValue returnValue = null;

            if (tokenType == Token.TokenType.FUNC_DECLARATION)
            {
                return new ReturnValue();
            }

            #if WRITE_DEBUG_INFO
            Console.WriteLine("Executing " + tree.getTokenType() + " " + tree.getTokenString());
            #endif

            if (tokenType == Token.TokenType.STATEMENT_LIST)
            {
                executeAllChildNodes(tree);
            }
            else if (tokenType == Token.TokenType.FUNCTION_CALL) {
                returnValue = functionCall(tree);
            }
            else if (tokenType == Token.TokenType.NAME) {
                returnValue = name(tree);
            }
            else if (tokenType == Token.TokenType.NUMBER) {
                returnValue = number(tree);
            }
            else if (tokenType == Token.TokenType.OPERATOR) {
                returnValue = operation(tree);
            }
            else if (tokenType == Token.TokenType.QUOTED_STRING) {
                returnValue = quotedString(tree);
            }
            else if (tokenType == Token.TokenType.IF) {
                ifThenElse(tree);
            }
            else if (tokenType == Token.TokenType.VAR_DECLARATION) {
                varDeclaration(tree);
            }
            else if (tokenType == Token.TokenType.ASSIGNMENT) {
                assignment(tree);
            }
            else if (tokenType == Token.TokenType.RETURN) {
                returnStatement(tree);
            }
            else {
                throw new NotImplementedException("The interpreter hasn't got support for token type " + tokenType + " yet!");
            }
            return returnValue;
        }
Example #23
0
 private ReturnValue quotedString(AST tree)
 {
     ReturnValue returnValue = new ReturnValue(tree.getTokenString());
     return returnValue;
 }
Example #24
0
        private ReturnValue operation(AST tree)
        {
            ReturnValue returnValue = null;

            float lhs = execute(tree.getChild(0)).FloatValue;
            float rhs = execute(tree.getChild(1)).FloatValue;

            if(tree.getTokenString() == "+") {
                returnValue = new ReturnValue(lhs + rhs);
            }
            else if(tree.getTokenString() == "-") {
                returnValue = new ReturnValue(lhs - rhs);
            }
            else if(tree.getTokenString() == "*") {
                returnValue = new ReturnValue(lhs * rhs);
            }
            else if(tree.getTokenString() == "/") {
                returnValue = new ReturnValue(lhs / rhs);
            }
            else if(tree.getTokenString() == "<") {
                float v = lhs < rhs ? 1 : 0;
                returnValue = new ReturnValue(v);
            }
            else if(tree.getTokenString() == ">") {
                float v = lhs > rhs ? 1 : 0;
                returnValue = new ReturnValue(v);
            }
            else if(tree.getTokenString() == "<=") {
                float v = lhs <= rhs ? 1 : 0;
                returnValue = new ReturnValue(v);
            }
            else if(tree.getTokenString() == ">=") {
                float v = lhs >= rhs ? 1 : 0;
                returnValue = new ReturnValue(v);
            }
            else if(tree.getTokenString() == "==") {
                float v = lhs == rhs ? 1 : 0;
                returnValue = new ReturnValue(v);
            }
            else if(tree.getTokenString() == "!=") {
                float v = lhs != rhs ? 1 : 0;
                returnValue = new ReturnValue(v);
            }
            else if(tree.getTokenString() == "&&") {
                float v = ((lhs != 0 ? true : false) && (rhs != 0 ? true : false)) ? 1 : 0;
                returnValue = new ReturnValue(v);
            }
            else if(tree.getTokenString() == "||") {
                float v = ((lhs != 0 ? true : false) || (rhs != 0 ? true : false)) ? 1 : 0;
                returnValue = new ReturnValue(v);
            }
            else {
                throw new NotImplementedException("Operator " + tree.getTokenString() + " isn't implemented yet!");
            }

            return returnValue;
        }
Example #25
0
        private ReturnValue number(AST tree)
        {
            ReturnValue returnValue = new ReturnValue((float)Convert.ToDouble(tree.getTokenString()));

            return(returnValue);
        }
Example #26
0
        private ReturnValue quotedString(AST tree)
        {
            ReturnValue returnValue = new ReturnValue(tree.getTokenString());

            return(returnValue);
        }
 private float evaluate(AST tree)
 {
     float returnValue = 0;
     if(tree.getTokenType() == Token.TokenType.NUMBER) {
         returnValue = (float)System.Convert.ToDouble(tree.getTokenString());
     }
     else if(tree.getTokenType() == Token.TokenType.OPERATOR) {
         if(tree.getTokenString() == "+") {
             returnValue = evaluate(tree.getChild(0)) + evaluate(tree.getChild(1));
         }
         else if(tree.getTokenString() == "-") {
             returnValue = evaluate(tree.getChild(0)) - evaluate(tree.getChild(1));
         }
         else if(tree.getTokenString() == "*") {
             returnValue = evaluate(tree.getChild(0)) * evaluate(tree.getChild(1));
         }
         else if(tree.getTokenString() == "/") {
             returnValue = evaluate(tree.getChild(0)) / evaluate(tree.getChild(1));
         }
         else if(tree.getTokenString() == "<") {
             returnValue = (evaluate(tree.getChild(0)) < evaluate(tree.getChild(1))) ? 1 : 0;
         }
         else if(tree.getTokenString() == ">") {
             returnValue = (evaluate(tree.getChild(0)) > evaluate(tree.getChild(1))) ? 1 : 0;
         }
         else if(tree.getTokenString() == "<=") {
             returnValue = (evaluate(tree.getChild(0)) <= evaluate(tree.getChild(1))) ? 1 : 0;
         }
         else if(tree.getTokenString() == ">=") {
             returnValue = (evaluate(tree.getChild(0)) >= evaluate(tree.getChild(1))) ? 1 : 0;
         }
         else if(tree.getTokenString() == "&&") {
             returnValue = (evaluate(tree.getChild(0)) != 0 && evaluate(tree.getChild(1)) != 0) ? 1 : 0;
         }
         else if(tree.getTokenString() == "||") {
             returnValue = (evaluate(tree.getChild(0)) != 0 || evaluate(tree.getChild(1)) != 0) ? 1 : 0;
         }
         else if(tree.getTokenString() == "!=") {
             returnValue = (evaluate(tree.getChild(0)) != evaluate(tree.getChild(1))) ? 1 : 0;
         }
         else if(tree.getTokenString() == "==") {
             returnValue = (evaluate(tree.getChild(0)) == evaluate(tree.getChild(1))) ? 1 : 0;
         }
         else {
             throw new InvalidOperationException("ExpressionEvaluator can't handle operators with string " + tree.getTokenString());
         }
     }
     else {
         throw new InvalidOperationException("ExpressionEvaluator can't handle tokens of type " + tree.getTokenType());
     }
     return returnValue;
 }
Example #28
0
        private void addToList(List<AST> list, AST ast)
        {
            switch (ast.getTokenType())
            {
                case  Token.TokenType.FUNC_DECLARATION:
                    addToList(list, ast.getChild(2));
                    addToList(list, ast.getChild(3));
                    break;

                case Token.TokenType.IF:
                    addToList(list, ast.getChild(0));
                    list.Add(ast);
            #if WRITE_DEBUG_INFO
                    Console.WriteLine(": " + ast.getTokenString() + " of type " + ast.getTokenType());
            #endif
                    break;

                case Token.TokenType.LOOP:
                    list.Add(ast);
            #if WRITE_DEBUG_INFO
                    Console.WriteLine(": " + ast.getTokenString() + " of type " + ast.getTokenType());
            #endif
                    break;

                case Token.TokenType.LOOP_BLOCK:
                    list.Add(ast);
            #if WRITE_DEBUG_INFO
                    Console.WriteLine(": " + ast.getTokenString() + " of type " + ast.getTokenType());
            #endif
                    break;

                default:
                    addChildren(list, ast);
            #if WRITE_DEBUG_INFO
                    Console.WriteLine(": " + ast.getTokenString() + " of type " + ast.getTokenType());
            #endif
                    list.Add(ast);
                    break;
            }
        }
Example #29
0
        private ReturnValue name(AST tree)
        {
            string name = tree.getTokenString();
            ReturnValue val = null;

            val = m_currentMemorySpace.getValue(name);
            if (val == null) {
                val = m_globalMemorySpace.getValue(name);
            }

            Assert.IsNotNull(val);

            #if WRITE_DEBUG_INFO
            Console.WriteLine("The fetched value is of type " + val.getReturnType());
            if(val.getReturnType() == ReturnType.FLOAT) {
                Console.WriteLine("And has value: " + val.FloatValue);
            }
            else if(val.getReturnType() == ReturnType.STRING) {
                Console.WriteLine("And has value: " + val.StringValue);
            }
            #endif
            return val;
        }
Example #30
0
        public AST findParent(AST ofThisChild)
        {
            Console.WriteLine("Going into " + getTokenString());

            if(ofThisChild == null) { return null; }
            if(m_children == null) { return null; }

            int i = m_children.IndexOf(ofThisChild);
            if(i >= 0) {
                Console.WriteLine("Found " + ofThisChild.getTokenString());
                return this;
            }
            else {
                foreach(AST child in m_children) {
                    AST parent = child.findParent(ofThisChild);
                    if(parent != null) {
                        return parent;
                    }
                }
            }
            return null;
        }
Example #31
0
        private void evaluateReferencesForFUNCTION_CALL(AST tree)
        {
            // Function name:
            string functionName = tree.getTokenString();
            FunctionSymbol function = (FunctionSymbol)m_currentScope.resolve(functionName);

            if (function == null)
            {
                m_errorHandler.errorOccured("Can't find function with name " + functionName,
                                            Error.ErrorType.SCOPE,
                                            tree.getToken().LineNr,
                                            tree.getToken().LinePosition
                                            );
            }
            else
            {
                #if WRITE_DEBUG_INFO
                Console.WriteLine("Resolved function call with name " + functionName + " (on line " + tree.getToken().LineNr + ")");
                #endif

                // Parameters
                evaluateReferencesInAllChildren(tree);

                AST node = function.getFunctionDefinitionNode();
                AST_FunctionDefinitionNode functionDefinitionTree = (AST_FunctionDefinitionNode)(node);

                /*if(functionDefinitionTree.getTokenString() != "<EXTERNAL_FUNC_DECLARATION>") {
                    evaluateReferencesForFUNC_DECLARATION(functionDefinitionTree);
                }*/

                // Setup reference to Function Definition AST node
                AST_FunctionCall functionCallAst = tree as AST_FunctionCall;
                Debug.Assert(functionCallAst != null);
                functionCallAst.FunctionDefinitionRef = functionDefinitionTree;

                List<AST> calleeParameterList = functionDefinitionTree.getChild(2).getChildren();

                // Check that the number of arguments is right
                AST callerParameterList = tree.getChild(0);
                List<AST> arguments = callerParameterList.getChildren();

                if (arguments.Count != calleeParameterList.Count)
                {
                    m_errorHandler.errorOccured(
                        "Wrong number of arguments to function"
                        , Error.ErrorType.SYNTAX, tree.getToken().LineNr, tree.getToken().LinePosition);
                }
            }
        }