Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;	
}