示例#1
0
Lexeme * evaluate(Lexeme * tree, Lexeme * env) {
    char * type = getType(tree);
    //fprintf(stdout, " >> ");  printOut(tree);
    if (is_a_primary(type)) {
        return tree;
    }
    else if (type == CLOSURE) {
        // If this is a new closure, link it to its defining scope (this one).
        if (get_closure_environment(tree) == NULL) {
            tree = set_closure_environment(tree, env);
        }
        return tree;
    }
    else if (type == IDENTIFIER) {
        return look_up(env, tree);
    }
    else if (type == CALL) {
        // Function calls are evaluated by the function evaluator module.
        return evaluate_function_call(tree, env);
    }
    else if (type == BUILT_IN) {
        // Built-ins are executed directly by the built-ins module.
        return execute(tree, env);
    }
    else if (type == BINDING) {
        return evaluate_binding(tree, env);
    }
    else if (type == REBINDING) {
        return evaluate_rebinding(tree, env);
    }
    else if (type == IF_CLAUSE) {
        return evaluate_if_control(tree, env);
    }
    else if (type == WHILE_LOOP) {
        return evaluate_while_control(tree, env);
    }
    //else if (type == FOR_LOOP) {
    //    return evaluate_for_control(tree, env);
    //}
    else if (type == EXPRESSION_LIST) {
        return evaluate_expression_list(tree, env);
    }
    else {
        fprintf(stderr, "Evaluation error: I don't know what to do with type <%s>.\n", type);
        exit(-1);
    }
}
示例#2
0
		void 
		_interpreter::step(
			__in_opt bool expect_next
			)
		{
			node_factory_ptr node_fact;
			token_factory_ptr tok_fact;

			TRACE_ENTRY();
			SERIALIZE_CALL_RECUR(m_lock);

			if(!parser::has_next_statement()) {
				THROW_LUNA_INTERPRETER_EXCEPTION(LUNA_INTERPRETER_EXCEPTION_NO_NEXT_STATEMENT);
			}

			if(parser::get_statement().front().get_id() == parser::get_begin_statement().front().get_id()) {
				parser::move_next_statement();
			}

			if(parser::has_next_statement()) {
				
				node_fact = parser::get_node_factory();
				if(!node_fact) {
					THROW_LUNA_INTERPRETER_EXCEPTION(LUNA_INTERPRETER_EXCEPTION_FACTORY_ALLOC_FAILED);
				}

				tok_fact = lexer::get_token_factory();
				if(!tok_fact) {
					THROW_LUNA_INTERPRETER_EXCEPTION(LUNA_INTERPRETER_EXCEPTION_FACTORY_ALLOC_FAILED);
				}

				node &stmt_nd = node_fact->get_node(parser::get_statement().front());
				token &stmt_tok = tok_fact->get_token(stmt_nd.get_token_id());

				if(!stmt_nd.get_child_count()
						|| (stmt_tok.get_type() != TOKEN_STATEMENT)) {
					THROW_LUNA_INTERPRETER_EXCEPTION_MESSAGE(LUNA_INTERPRETER_EXCEPTION_EXPECTING_STATEMENT,
						"%s", stmt_tok.to_string().c_str());
				}

				node &left_child_nd = node_fact->get_node(parser::get_statement().at(stmt_nd.get_child(0)));
				token &left_child_tok = tok_fact->get_token(left_child_nd.get_token_id());

				switch(left_child_tok.get_type()) {
					case TOKEN_CONTROL:
						evaluate_control(node_fact, tok_fact, stmt_nd, stmt_tok);
						break;
					case TOKEN_IDENTIFIER: {
							node &right_child_nd = node_fact->get_node(parser::get_statement().at(stmt_nd.get_child(1)));
							token &right_child_tok = tok_fact->get_token(right_child_nd.get_token_id());

							switch(right_child_tok.get_type()) {
								case TOKEN_ASSIGNMENT:
									evaluate_assignment(node_fact, tok_fact, stmt_nd, stmt_tok);
									break;
								case TOKEN_FUNCTION_CALL:
									evaluate_function_call(node_fact, tok_fact, stmt_nd, stmt_tok);
									break;
								default:
									THROW_LUNA_INTERPRETER_EXCEPTION_MESSAGE(LUNA_INTERPRETER_EXCEPTION_EXPECTING_ASSIGNMENT,
										"%s", right_child_tok.to_string().c_str());
							}
						} break;
					case TOKEN_KEYWORD:

						switch(left_child_tok.get_subtype()) {
						case KEYWORD_IF:
							evaluate_conditional_if(node_fact, tok_fact, stmt_nd, stmt_tok);
							break;
						case KEYWORD_WHILE:
							evaluate_conditional_while(node_fact, tok_fact, stmt_nd, stmt_tok);
							break;
						case KEYWORD_PRINT:
							evaluate_print(node_fact, tok_fact, stmt_nd, stmt_tok);
							break;
						default:
							THROW_LUNA_INTERPRETER_EXCEPTION_MESSAGE(LUNA_INTERPRETER_EXCEPTION_EXPECTING_CONDITIONAL,
								"%s", left_child_tok.to_string().c_str());
						}
						break;
					default:
						THROW_LUNA_INTERPRETER_EXCEPTION_MESSAGE(LUNA_INTERPRETER_EXCEPTION_EXPECTING_STATEMENT,
							"%s", left_child_tok.to_string().c_str());
				}

				if(parser::has_next_statement()) {
					parser::move_next_statement();
				} else if(expect_next) {
					THROW_LUNA_INTERPRETER_EXCEPTION(LUNA_INTERPRETER_EXCEPTION_EXPECTING_NEXT_STATEMENT);
				}
			}

			TRACE_EXIT("Return Value: 0x%x", NULL);
		}