#include #include // Parse conditional operations fzl_node_t *pa_cond(fzl_parser_t *parser) { if (!parser) return NULL; fzl_node_t *left = pa_term(parser); fzl_node_t *right = NULL; if (!left) return NULL; while (is(parser, FZL_TOKTYPE_EQEQ) || is(parser, FZL_TOKTYPE_NEQ) || is(parser, FZL_TOKTYPE_LANGLE) || is(parser, FZL_TOKTYPE_LEQ) || is(parser, FZL_TOKTYPE_RANGLE) || is(parser, FZL_TOKTYPE_REQ)) { fzl_token_t *op = consume(parser); right = pa_term(parser); if (!right) { fzl_freeast(left); return NULL; } fzl_node_t *result; switch (op->type) { case FZL_TOKTYPE_EQEQ: result = fzl_mknode(FZL_NODETYPE_EQUAL, op); break; case FZL_TOKTYPE_NEQ: result = fzl_mknode(FZL_NODETYPE_NEQUAL, op); break; case FZL_TOKTYPE_LANGLE: result = fzl_mknode(FZL_NODETYPE_LESS, op); break; case FZL_TOKTYPE_LEQ: result = fzl_mknode(FZL_NODETYPE_LESS_EQUAL, op); break; case FZL_TOKTYPE_RANGLE: result = fzl_mknode(FZL_NODETYPE_GREATER, op); break; case FZL_TOKTYPE_REQ: result = fzl_mknode(FZL_NODETYPE_GREATER_EQUAL, op); break; default: return NULL; } result->binary_op.left = left; result->binary_op.right = right; left = result; } return left; }