60 lines
1.4 KiB
C
60 lines
1.4 KiB
C
#include <compiler/fzl_parser.h>
|
|
#include <compiler/internals/parser.h>
|
|
|
|
// 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;
|
|
}
|