示例#1
0
Expr* term_tail(const char* string, Expr* expr) {
    Expr* new_expr;
    
    switch(string[VAL_STRING]) {
        case '+':
        case '-':
            if(NULL == (new_expr = (Expr*)malloc(sizeof(Expr)))) {
                exit(1);
            }
            if(NULL == (new_expr->data.expr[1] = (Expr*)malloc(sizeof(Expr)))) {
                exit(1);
            }
            new_expr->op = eat_char(string, string[VAL_STRING]);
            new_expr->data.expr[0] = expr;
            
            new_expr->data.expr[1] = term(string, new_expr->data.expr[1]);
            new_expr = term_tail(string, new_expr);
            return new_expr;
        case ')':
        case 0:
            return expr;
        default:
            error_message(string);return NULL;
    }
}
示例#2
0
文件: parser.c 项目: apason/tiralabra
static exp_node *expression(void){
    exp_node *expn = newExpNode();
    
    if(match(TOKEN_LBRA,       NO_CONSUME) ||
       match(TOKEN_IDENTIFIER, NO_CONSUME) ||
       match(TOKEN_LITERAL,    NO_CONSUME))
	if((expn->termn = term()) != NULL)
	    if((expn->termtln = term_tail()) != error)
		return expn;

    freeExp(expn);
    return NULL;
}
示例#3
0
Expr* parse(const char* string) {
    Expr* expr;
    
    if(string[VAL_STRING] == '(' || isdigit(string[VAL_STRING])) {
        if(NULL == (expr = (Expr*)malloc(sizeof(Expr)))) {
            exit(1);
        }
        
        expr = term(string, expr);
        expr = term_tail(string, expr);
        return expr;
    } else {
        error_message(string);return NULL;
    }
}
示例#4
0
文件: parser.c 项目: apason/tiralabra
static term_tail_node *term_tail(void){
    term_tail_node *termtln = newTermTailNode();

    if((termtln->addOp = match(TOKEN_ADDOP, CONSUME)) != NULL){
	if((termtln->termn = term()) != NULL)
	    if((termtln->termtln = term_tail()) != error)
		return termtln;
    }
    else if(match(TOKEN_RBRA,   NO_CONSUME) ||
	    match(TOKEN_SCOL,   NO_CONSUME) ||
	    match(TOKEN_COMPOP, NO_CONSUME)){
	freeTermTail(termtln);
	return NULL;
    }

    freeTermTail(termtln);
    return error;
}