From: Wolfgang (Blub) Bumiller Date: Mon, 13 Aug 2012 13:33:32 +0000 (+0200) Subject: Even more operators X-Git-Tag: 0.1-rc1~330 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=5ca3fed36ae5a0186e20e967858632f8a5b29d4d;p=xonotic%2Fgmqcc.git Even more operators --- diff --git a/parser.c b/parser.c index 46c7ff4..0025f65 100644 --- a/parser.c +++ b/parser.c @@ -502,6 +502,9 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy) } out = (ast_expression*)ast_binary_new(ctx, INSTR_DIV_F, exprs[0], exprs[1]); break; + case opid1('%'): + parseerror(parser, "qc does not have a modulo operator"); + return false; case opid1('|'): case opid1('&'): if (NotSameType(TYPE_FLOAT)) { @@ -514,6 +517,31 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy) (op->id == opid1('|') ? INSTR_BITOR : INSTR_BITAND), exprs[0], exprs[1]); break; + case opid1('^'): + parseerror(parser, "TODO: bitxor"); + return false; + + case opid2('<','<'): + case opid2('>','>'): + parseerror(parser, "TODO: shifts"); + return false; + + case opid2('|','|'): + generated_op += 1; /* INSTR_OR */ + case opid2('&','&'): + generated_op += INSTR_AND; + if (NotSameType(TYPE_FLOAT)) { + parseerror(parser, "type error: cannot apply logical operation on types %s and %s", + type_name[exprs[0]->expression.vtype], + type_name[exprs[1]->expression.vtype]); + parseerror(parser, "TODO: logical ops for arbitrary types using INSTR_NOT"); + parseerror(parser, "TODO: optional early out"); + return false; + } + if (opts_standard == COMPILER_GMQCC) + printf("TODO: early out logic\n"); + out = (ast_expression*)ast_binary_new(ctx, generated_op, exprs[0], exprs[1]); + break; case opid1('>'): generated_op += 1; /* INSTR_GT */ @@ -538,7 +566,7 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy) type_name[exprs[1]->expression.vtype]); return false; } - out = (ast_expression*)ast_binary_new(ctx, type_ne_op[exprs[0]->expression.vtype], exprs[0], exprs[1]); + out = (ast_expression*)ast_binary_new(ctx, type_ne_instr[exprs[0]->expression.vtype], exprs[0], exprs[1]); break; case opid2('=', '='): if (exprs[0]->expression.vtype != exprs[1]->expression.vtype) { @@ -547,10 +575,9 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy) type_name[exprs[1]->expression.vtype]); return false; } - out = (ast_expression*)ast_binary_new(ctx, type_eq_op[exprs[0]->expression.vtype], exprs[0], exprs[1]); + out = (ast_expression*)ast_binary_new(ctx, type_eq_instr[exprs[0]->expression.vtype], exprs[0], exprs[1]); break; - case opid1('='): if (ast_istype(exprs[0], ast_entfield)) assignop = type_storep_instr[exprs[0]->expression.vtype];