Exemplo n.º 1
0
static int bracket_handle(struct calc_info *info)
{
	assert(info != NULL);
	
	char opr = *info->cur;
	switch (opr) {
		case '(':
			OPR_PUSH(opr);
			break;	
		case ')':
			{
				char top_c;
				while (1) {
					if (OPR_TOP(top_c) < 0) {
						fprintf(stderr, "Error:缺少左括号\n");
						goto err_miss_left_bracket;
					}
					if (top_c == '(') {
						OPR_POP(top_c);						       goto out;
					} else {
						do_stack(info);
					}
				}
			}
		default:
			break;
	}

out:
	return 0;

err_miss_left_bracket:
	return -1;
}
Exemplo n.º 2
0
static int opr_handle(struct calc_info *info)
{
	assert(info != NULL);
	
	char c = *info->cur;

	if (info->flag == NUM) {
		info->flag = OPR;
	} else {
		switch (c) {
			case '+':
				goto out;
				break;
			case '-':
				//FIXME 负号的处理
				{
				  num_t zero = 0;
				  NUM_PUSH(zero);
				  OPR_PUSH(c);
				  goto out;	
				}
				break;
			default: 
				fprintf(stderr, "免费版不支持多个运算符\n");
				break;
		}
	}

	//1. 入栈的两种情况: a) 空栈  b)运算符优先级高于栈顶运算符
	
	if (OPR_IS_EMPTY) {
		OPR_PUSH(c);
	} else {
		char top_c;
		while (1) {
			//a 空栈
			if (OPR_TOP(top_c) < 0) {
				OPR_PUSH(c);
				break;
			}
			//b 优先级高于栈顶
			if (opr2level(c) > opr2level(top_c)) {
				OPR_PUSH(c);
				break;
			} else {
				if (do_stack(info) < 0) {
					fprintf(stderr,"do_stack failed\n");
					goto err_do_stack;
				}
			}
		}
	}
out:	
	return 0;
err_do_stack:
	return -1;
}
Exemplo n.º 3
0
Arquivo: md5.c Projeto: kingfree/haut
int main(int argc, char *argv[])
{
    if (argc < 2) argv[argc++] = ".";

    if (argc > 2 && strcmp(argv[2], "-r") == 0) {
        printf("递归处理:  %s\n", argv[1]);
        do_recuerse(argv[1]);
    } else if (argc > 2 && strcmp(argv[2], "-s") == 0) {
        printf("非递归处理: %s\n", argv[1]);
        do_stack(argv[1]);
    } else {
        printf("调用函数: %s\n", argv[1]);
        do_nftw(argv[1]);
    }

    return 0;
}
Exemplo n.º 4
0
static num_t calc_main(struct calc_info *info, const char *expr)
{
	assert(info != NULL);
	assert(expr != NULL);

	info->cur = expr;
	int iret = 0;

	for (; *info->cur != '\0'; info->cur++) {
		switch (*info->cur) {
			case '0' ... '9':
				if ((iret = num_handle(info)) < 0) {
					fprintf(stderr, "num_handle failed\n");
					return iret;
				}
				break;
			case '+':
			case '-':
			case '*':
			case '/':
			case '%':
				if ((iret = opr_handle(info)) < 0) {
			fprintf(stderr, "opr_handle failed\n");
			return iret;
	}	
				break;
			case ' ':
			case '\n':
			case '\t':
				break;
			case '(':
			case ')':
				if ((iret = bracket_handle(info)) < 0) {
			fprintf(stderr, "bracket_handle failed\n");
			return iret;
}
				break;
			default:
				fprintf(stderr, "unkown char '%c'\n", *info->cur);
				goto err_unkown_char;	
		}
	}

	num_t ret = 0;
	while (!OPR_IS_EMPTY) {
		char top_c = 0;
		OPR_TOP(top_c);
		if (top_c == '(') {
			fprintf(stderr, "Error: 缺少对应的右括号\n");
			goto err_miss_right_bracket;
		}
		if (do_stack(info) < 0) {
			fprintf(stderr, "do_stack failed\n");
			goto  err_do_stack;
		}
	}

	NUM_POP(ret);

	return ret;
err_unkown_char:
	return -1;
err_do_stack:
	return -2;
err_miss_right_bracket:
	return -3;
}