static struct node_t *comp_expr(struct c_desc *cd) { int tok,opr; struct node_t *p,*q; p = term_expr(cd); /* don't do while, see syntax. */ if(S_LESS <= cd->op && cd->op <= S_MORE) { tok = cd->op; get_sym(cd); q = term_expr(cd); switch(tok) { case S_LESS: opr = O_LESS; break; case S_LESSEQ: opr = O_LESSEQ; break; case S_EQ: opr = O_EQ; break; case S_MOREEQ: opr = O_MOREEQ; break; case S_MORE: opr = O_MORE; break; default: opr = O_ERR; break; /* impossible */ } p = new_node_t(opr,p,q); } return p; }
static struct ast_node* exp_expr(void) { struct ast_node *node; struct ast_node *rest_node; node = term_expr(); if (node == NULL) return NULL; rest_node = rest_exp(node); return rest_node; }
static struct ast_node* rest_exp(struct ast_node *node) { struct ast_node *expr_node; struct ast_node *prev_node; struct ast_node *ret_node; char op; prev_node = node; while(TRUE) { switch(current_token) { case TOKEN_CARET: op = '^'; break; default: goto exit_exp; } consume_token(); expr_node = term_expr(); if (expr_node == NULL) { error_msg("error: syntax error"); expr_node = (struct ast_node *)ast_node_stub(); sync_stream(); goto exit_exp; } prev_node = (struct ast_node *)ast_node_op(op, prev_node, expr_node); } exit_exp: ret_node = prev_node; return ret_node; }