private void evaluateScopeDeclarations(AST tree) { Debug.Assert(tree != null); if (tree.getTokenType() == Token.TokenType.FUNC_DECLARATION) { evaluateFunctionScope(tree); } else if (tree.getTokenType() == Token.TokenType.IF) { evaluateIfScope(tree); } else if (tree.getTokenType() == Token.TokenType.LOOP) { evaluateLoopScope(tree); } else if (tree.getTokenType() == Token.TokenType.LOOP_BLOCK) { evaluateLoopBlockScope(tree); } else if (tree.getChildren() != null) { evaluateScopeDeclarationsInAllChildren(tree); } }
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; }
private void evaluateReferences(AST tree) { Debug.Assert(tree != null); if (tree.getTokenType() == Token.TokenType.VAR_DECLARATION) { evaluateReferencesForVAR_DECLARATION(tree); } else if (tree.getTokenType() == Token.TokenType.ASSIGNMENT) { evaluateReferencesForASSIGNMENT(tree); } else if (tree.getTokenType() == Token.TokenType.ASSIGNMENT_TO_ARRAY) { evaluateReferencesForASSIGNMENT_TO_ARRAY(tree); } else if (tree.getTokenType() == Token.TokenType.ARRAY_LOOKUP) { evaluateReferencesForARRAY_LOOKUP(tree); } else if (tree.getTokenType() == Token.TokenType.FUNC_DECLARATION) { evaluateReferencesForFUNC_DECLARATION(tree); } else if (tree.getTokenType() == Token.TokenType.FUNCTION_CALL) { evaluateReferencesForFUNCTION_CALL(tree); } else if (tree.getTokenType() == Token.TokenType.IF) { evaluateReferencesForIF(tree); } else if (tree.getTokenType() == Token.TokenType.NAME) { evaluateReferencesForNAME(tree); } else if (tree.getTokenType() == Token.TokenType.LOOP_BLOCK) { evaluateReferencesForLOOP_BLOCK(tree); } else if (tree.getTokenType() == Token.TokenType.LOOP) { evaluateReferencesForLOOP(tree); } else { evaluateReferencesInAllChildren(tree); } }
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); }
private string GetNodeString(AST pNode) { string result; result = pNode.getTokenType().ToString() + " : " + pNode.ToString(); if (_printExecutions) { result += " : " + pNode.Executions; } return(result); }
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; } }
void PushValueFromToken() { /*#if DEBUG * if (CurrentNode == null) { * throw new Exception("Current node is null"); * } #endif*/ TokenWithValue t = CurrentNode.getToken() as TokenWithValue; if (t == null) { throw new Exception("Can't convert current node to TokenWithValue: " + CurrentNode + ", it's of type " + CurrentNode.getTokenType()); } PushValue(t.getValue()); }
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; } }
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); }
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; }
private void evaluateReferences(AST tree) { Debug.Assert(tree != null); if (tree.getTokenType() == Token.TokenType.VAR_DECLARATION) { evaluateReferencesForVAR_DECLARATION(tree); } else if (tree.getTokenType() == Token.TokenType.ASSIGNMENT) { evaluateReferencesForASSIGNMENT(tree); } else if (tree.getTokenType() == Token.TokenType.ASSIGNMENT_TO_ARRAY) { evaluateReferencesForASSIGNMENT_TO_ARRAY(tree); } else if (tree.getTokenType() == Token.TokenType.FUNC_DECLARATION) { evaluateReferencesForFUNC_DECLARATION(tree); } else if (tree.getTokenType() == Token.TokenType.FUNCTION_CALL) { evaluateReferencesForFUNCTION_CALL(tree); } else if (tree.getTokenType() == Token.TokenType.IF) { evaluateReferencesForIF(tree); } else if (tree.getTokenType() == Token.TokenType.NAME) { evaluateReferencesForNAME(tree); } else if (tree.getTokenType() == Token.TokenType.LOOP_BLOCK) { evaluateReferencesForLOOP_BLOCK(tree); } else if (tree.getTokenType() == Token.TokenType.LOOP) { evaluateReferencesForLOOP(tree); } else { evaluateReferencesInAllChildren(tree); } }