Example #1
0
int Get_Assign (node* tree)
{
	int err_index;
	ASSERT_TREE_OK (tree);

	node* new_tree = Node_NEW();
	Tree_Add_Left (new_tree, Node_NEW());
	node* tmp_tree = new_tree -> left;
	int ret = Get_V (tmp_tree);
	if (ret != HAPPY) if (ret == 0)  return ret;

	if ((*CUR) -> op != OP_ASSIGN) return ERR_CALL_GET_ASSIGN;
	CUR++;

	ret = Tree_Add_Right (new_tree, Node_NEW());
	if (ret != HAPPY) if (ret == 0)  return ret;
	tmp_tree = new_tree -> right;
	ret = Get_E (tmp_tree);
	if (ret != HAPPY) if (ret == 0)  return ret;

	if ((*CUR) -> op != SEP_SEMICOLON) return ERR_SEMICOLON;
	new_tree -> type = OP_ASSIGN;
	Tree_Add_Left (tree, new_tree);
	CUR++;

	ASSERT_TREE_OK (tree);
return HAPPY;
}
Example #2
0
int Get_P (double* result)
{
	int ret = 0;
	double val = 0;

	switch (*CUR)
	{
		case '+':
			CUR++;
			break;

		case '-':
			CUR++;
			ret = Get_P (&val);
			val *= -1;
			break;

		case '(':
			CUR++;
			ret = Get_E (&val);
			if (*CUR == ')') CUR++;
			else return ERR_CLOSE_BRACKET;
			break;

		default:
			ret = Get_N (&val);
			break;
	}

	*result = val;

return HAPPY;
}
Example #3
0
int Get_E (node* tree)
{
	int err_index = 0;
	ASSERT_TREE_OK (tree);

	Tree_Add_Left (tree, Node_NEW());
	Tree_Add_Right (tree, Node_NEW());	
	int ret = Get_T (tree -> left);
	if (ret != HAPPY) if (ret == 0)  return ret;

	tree -> type = MATH_OP;
	tree -> op	 = (*CUR) -> op;

	if ((*CUR) -> op == MATH_OP_ADD || (*CUR) -> op == MATH_OP_SUB)
	{
		CUR++;
		Get_E (tree -> right);
	}

	node* new_tree = tree -> left;
	if (tree -> right -> type == 0)
	{
		Tree_Replace_Left (tree);
		ASSERT_TREE_OK (new_tree);
		return HAPPY;
	}

	ASSERT_TREE_OK (tree);
return HAPPY;
}
Example #4
0
int Get_F (node* tree)
{
	int err_index = 0;
	ASSERT_TREE_OK (tree);

	char tmp_word[TMPLEN] = {};
	strcpy (tmp_word, (*CUR) -> word);
	strupr (tmp_word);
	int func = 0;

	if (0);
	CHECK_FUNC(tmp_word, SIN)
	CHECK_FUNC(tmp_word, COS)
	CHECK_FUNC(tmp_word, TAN)
	CHECK_FUNC(tmp_word, CTAN)
	CHECK_FUNC(tmp_word, LN)
	CHECK_FUNC(tmp_word, LOG)

	if (func == 0) return ERR_WRONG_FUNC;
	CUR++;
	if ((*CUR) -> op != SEP_OPEN_BRACKET) return ERR_FUNC_OPEN_BRACKET;
	CUR++;

	Tree_Add_Left (tree, Node_NEW());
	int ret = Get_E (tree -> left);
	if (ret != HAPPY) if (ret == 0)  return ret;

	if (func == FUNC_LOG)
	{
		if ((*CUR) -> op != SEP_COMMA) return ERR_FUNC_COMMA;
		CUR++;
		ret = Tree_Add_Right (tree, Node_NEW());
		if (ret != HAPPY) if (ret == 0)  return ret;
		ret = Get_E (tree -> right);
		if (ret != HAPPY) if (ret == 0)  return ret;
	}

	if ((*CUR) -> op != SEP_CLOSE_BRACKET) return ERR_FUNC_CLOSE_BRACKET;
	CUR++;

	tree -> type = FUNC;
	tree -> op	 = func;

	ASSERT_TREE_OK (tree);
return HAPPY;
}
Example #5
0
int Get_G3 (const char* input, double* result)
{
	CUR = input;
	
	int ret = Get_E (result);
	if (!*result) *result = 0;

return HAPPY;
}
Example #6
0
int Get_Cmp (node* tree)
{
	int err_index = 0;
	ASSERT_TREE_OK (tree);

	node* new_tree = Node_NEW();

	Tree_Add_Left (new_tree, Node_NEW());
	Tree_Add_Right (new_tree, Node_NEW());
	int ret = Get_E (new_tree -> left);
	if (ret != HAPPY) if (ret == 0)  return ret;

	switch ((*CUR) -> op)
	{
		case CMP_JB:	case CMP_JBE:	case CMP_JE:
		case CMP_JAE:	case CMP_JA:	case CMP_JNE:
			new_tree -> type = CMP;
			new_tree -> op   = (*CUR) -> op;
			CUR++;
			break;

		case SEP_CLOSE_BRACKET:
			new_tree -> type = CMP;
			new_tree -> op = CMP_JNE;
			new_tree -> right -> type = NUMBER;
			new_tree -> right -> num  = 0;
			Tree_Add_Left (tree, new_tree);
			ASSERT_NODE_OK (tree);
			return HAPPY;
			break;

		default:
			return ERR_GET_CMP_WRONG_CMP;
			break;
	}

	ret = Get_E (new_tree -> right);
	if (ret != HAPPY) if (ret == 0)  return ret;
	Tree_Add_Left (tree, new_tree);

	ASSERT_NODE_OK (tree);
return HAPPY;
}
Example #7
0
double Get_G (const char expr_str [BUF_SIZE])
{
    EXPR_PTR = expr_str;

    double res = Get_E ();

    if (*EXPR_PTR != '\0')
        syntax_error ();

    return res;
}
Example #8
0
double Get_P ()
{
    if (*EXPR_PTR == '(')
    {
        EXPR_PTR++;
        double val1 = Get_E ();

        if (*EXPR_PTR != ')')
            syntax_error ();

        EXPR_PTR++;

        return val1;
    }

    else
        return Get_N ();
}
Example #9
0
int Get_Print (node* tree)
{
	int err_index = 0;
	ASSERT_NODE_OK (tree);

	if ((*CUR) -> op != OP_PRINT) return ERR_CALL_PRINT;

	node* new_tree = Node_NEW();
	Tree_Add_Left  (new_tree, Node_NEW());
	Tree_Add_Right (new_tree, Node_NEW());
	CUR++;

	if ((*CUR) -> op != SEP_OPEN_BRACKET) return ERR_PRINT_OPEN_BRACKET;
	CUR++;

	if ((*CUR) -> type == STR)
	{
		new_tree -> left -> type = STR;
		int ret = Get_Str (new_tree -> right);
		if (ret != HAPPY) if (ret == 0)  return ret;
	}

	else
	{
		new_tree -> left -> type = NUMBER;
		int ret = Get_E (new_tree -> right);
		if (ret != HAPPY) if (ret == 0)  return ret;
	}

	if ((*CUR) -> op != SEP_CLOSE_BRACKET) return ERR_PRINT_CLOSE_BRACKET;
	CUR++;
	if ((*CUR) -> op != SEP_SEMICOLON) return ERR_PRINT_SEMICOLON;
	CUR++;

	new_tree -> type = OP_PRINT;
	Tree_Add_Left (tree, new_tree);

	ASSERT_NODE_OK (tree);
return HAPPY;
}
Example #10
0
int Get_P (node* tree)
{
	int ret = 0;
	int err_index = 0;
	ASSERT_TREE_OK (tree);

	int sign = 1;
	while ((*CUR) -> op == MATH_OP_ADD || (*CUR) -> op == MATH_OP_SUB)
	{
		if ((*CUR) -> op == MATH_OP_SUB) sign *= -1;
		CUR++;
	}

	if (sign == -1)
	{
		tree -> type = MATH_OP;
		tree -> op   = MATH_OP_MUL;
		tree -> left -> type = NUMBER;
		tree -> left -> num  = -1;

		Tree_Add_Right (tree, Node_NEW());
		ret = Get_E (tree -> right);
		if (ret != HAPPY) if (ret == 0)  return ret;

		if (tree -> right -> type == 0) return ERR_GET_P_LONELY_SIGN;
		
		ASSERT_TREE_OK (tree);
		return HAPPY;
	}

	if ((*CUR) -> op == SEP_OPEN_BRACKET)
	{
		CUR++;
		ret = Get_E (tree);
		if (ret != HAPPY) if (ret == 0)  return ret;
		if ((*CUR) -> op != SEP_CLOSE_BRACKET) return ERR_GET_P_CLOSE_BRACKET;
		CUR++;

		ASSERT_TREE_OK (tree);
		return HAPPY;
	}


	if ((*CUR) -> type == ID)
	{
		if ((*(CUR + 1)) -> op == SEP_OPEN_BRACKET) Get_F (tree);
		else Get_V (tree);

		ASSERT_TREE_OK (tree);
		return HAPPY;
	}

	if ((*CUR) -> type == NUMBER)
	{
		ret = Get_N (tree);

		ASSERT_TREE_OK (tree);
		return HAPPY;
	}

	ASSERT_TREE_OK (tree);
return HAPPY;
}