Esempio n. 1
0
static void visit(int k, int level, int siz, int *a)
{
    level = level+1; a[k] = level;

    if (level == siz) {
        evaluate_assignment(a);
    } else {
        int i;
        for ( i = 0; i < siz; i++)
            if (a[i] == 0)
                visit(i, level, siz, a);
    }

    level = level-1; a[k] = 0;
}
Esempio n. 2
0
static void visit(mca_btl_tcp_proc_data_t *proc_data, int k, int level, int siz, int *a)
{
    level = level+1; a[k] = level;

    if (level == siz) {
        evaluate_assignment(proc_data, a);
    } else {
        int i;
        for ( i = 0; i < siz; i++)
            if (a[i] == 0)
                visit(proc_data, i, level, siz, a);
    }

    level = level-1; a[k] = 0;
}
Esempio n. 3
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);
		}
Esempio n. 4
0
bool evaluate_top()
{
    if(!optic_stack.size())
    {
        out() << "Instruction stack is empty, cannot evaluate expression." << std::endl;
        clear_stack();
        return false;
    }

//    std::cout << "evaluate_top()" << std::endl;
    object obj = optic_stack.back();
    optic_stack.pop_back();
    bool result = true;
    bool free_obj = true;

    switch(obj.type)
    {
    case OPERATION:
        result = evaluate_binary_operator(obj);
        break;

    case NO_EXPANSION_OPERATION:
        result = evaluate_binary_operator(obj, false);
        break;

    case UNARY_OPERATION:
        result = evaluate_unary_operator(obj);
        break;

    case UNARY_NO_EXPANSION_OPERATION:
        result = evaluate_unary_operator(obj, false);
        break;

//    case FUNCTION_BODY:
    case OPERATION_TREE:
        result = resolve_stack_from_parser(obj, false);
        break;

    case VARIABLE:
    case UNDECLARED_VARIABLE:
        result = evaluate_variable(obj);
        break;

    case ASSIGNMENT:
        result = evaluate_assignment();
        break;

    case VOID: // don't return
        break;

    default:
        optic_stack.push_back(obj);
        free_obj = false;
        break;
    }

    if(free_obj)
        mem_free(obj);

    return result;
}