- handle trinary conditional statement.

This commit is contained in:
Christoph Oelckers 2016-10-17 21:43:14 +02:00
parent a6a0c4b93c
commit 1c21dbc44c

View file

@ -2471,7 +2471,7 @@ FxExpression *ZCCCompiler::ConvertNode(ZCC_TreeNode *ast)
case PEX_BitAnd: case PEX_BitAnd:
case PEX_BitOr: case PEX_BitOr:
case PEX_BitXor: case PEX_BitXor:
return new FxBinaryInt(op == PEX_LeftShift ? TK_LShift : op == PEX_RightShift ? TK_RShift : op == PEX_URightShift? TK_URShift : op == PEX_BitAnd ? '&' : op == PEX_BitOr ? '|' : '^', left, right); return new FxBinaryInt(op == PEX_LeftShift ? TK_LShift : op == PEX_RightShift ? TK_RShift : op == PEX_URightShift ? TK_URShift : op == PEX_BitAnd ? '&' : op == PEX_BitOr ? '|' : '^', left, right);
case PEX_BoolOr: case PEX_BoolOr:
case PEX_BoolAnd: case PEX_BoolAnd:
@ -2485,17 +2485,17 @@ FxExpression *ZCCCompiler::ConvertNode(ZCC_TreeNode *ast)
case PEX_EQEQ: case PEX_EQEQ:
case PEX_NEQ: case PEX_NEQ:
return new FxCompareEq(op == PEX_NEQ ? TK_Neq : TK_Eq, left, right); return new FxCompareEq(op == PEX_NEQ ? TK_Neq : TK_Eq, left, right);
// todo: These do not have representations in DECORATE and no implementation exists yet. // todo: These do not have representations in DECORATE and no implementation exists yet.
case PEX_LTGTEQ: case PEX_LTGTEQ:
case PEX_Concat: case PEX_Concat:
case PEX_Is: case PEX_Is:
// more esoteric operators // more esoteric operators
case PEX_APREQ: case PEX_APREQ:
// vector operations will be done later. // vector operations will be done later.
case PEX_CrossProduct: case PEX_CrossProduct:
case PEX_DotProduct: case PEX_DotProduct:
default: default:
@ -2503,6 +2503,16 @@ FxExpression *ZCCCompiler::ConvertNode(ZCC_TreeNode *ast)
} }
break; break;
} }
case AST_ExprTrinary:
{
auto trinary = static_cast<ZCC_ExprTrinary *>(ast);
auto condition = ConvertNode(trinary->Test);
auto left = ConvertNode(trinary->Left);
auto right = ConvertNode(trinary->Right);
return new FxConditional(condition, left, right);
}
} }
// only for development. I_Error is more convenient here than a normal error. // only for development. I_Error is more convenient here than a normal error.