mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2025-01-18 14:21:36 +00:00
operator &~=
This commit is contained in:
parent
122e80cc4d
commit
0d33939b1b
5 changed files with 37 additions and 1 deletions
12
lexer.c
12
lexer.c
|
@ -834,7 +834,7 @@ static int GMQCC_WARN lex_finish_digit(lex_file *lex, int lastch)
|
|||
|
||||
int lex_do(lex_file *lex)
|
||||
{
|
||||
int ch, nextch;
|
||||
int ch, nextch, thirdch;
|
||||
|
||||
lex_token_new(lex);
|
||||
#if 0
|
||||
|
@ -1114,6 +1114,16 @@ int lex_do(lex_file *lex)
|
|||
lex_tokench(lex, nextch);
|
||||
} else if (ch == '-' && nextch == '>') {
|
||||
lex_tokench(lex, nextch);
|
||||
} else if (ch == '&' && nextch == '~') {
|
||||
thirdch = lex_getch(lex);
|
||||
if (thirdch != '=') {
|
||||
lex_ungetch(lex, thirdch);
|
||||
lex_ungetch(lex, nextch);
|
||||
}
|
||||
else {
|
||||
lex_tokench(lex, nextch);
|
||||
lex_tokench(lex, thirdch);
|
||||
}
|
||||
} else
|
||||
lex_ungetch(lex, nextch);
|
||||
|
||||
|
|
1
lexer.h
1
lexer.h
|
@ -238,6 +238,7 @@ static const oper_info fte_operators[] = {
|
|||
{ "%=", 2, opid2('%','='), ASSOC_RIGHT, 8, 0 },
|
||||
{ "&=", 2, opid2('&','='), ASSOC_RIGHT, 8, 0 },
|
||||
{ "|=", 2, opid2('|','='), ASSOC_RIGHT, 8, 0 },
|
||||
{ "&~=", 2, opid3('&','~','='), ASSOC_RIGHT, 8, 0 },
|
||||
|
||||
{ "&&", 2, opid2('&','&'), ASSOC_LEFT, 5, 0 },
|
||||
{ "||", 2, opid2('|','|'), ASSOC_LEFT, 5, 0 },
|
||||
|
|
21
parser.c
21
parser.c
|
@ -1032,6 +1032,27 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy)
|
|||
(op->id == opid2('&','=') ? INSTR_BITAND : INSTR_BITOR),
|
||||
exprs[0], exprs[1]);
|
||||
break;
|
||||
case opid3('&','~','='):
|
||||
/* This is like: a &= ~(b);
|
||||
* But QC has no bitwise-not, so we implement it as
|
||||
* a -= a & (b);
|
||||
*/
|
||||
if (NotSameType(TYPE_FLOAT)) {
|
||||
ast_type_to_string(exprs[0], ty1, sizeof(ty1));
|
||||
ast_type_to_string(exprs[1], ty2, sizeof(ty2));
|
||||
parseerror(parser, "invalid types used in expression: %s and %s",
|
||||
ty1, ty2);
|
||||
return false;
|
||||
}
|
||||
if (ast_istype(exprs[0], ast_entfield))
|
||||
assignop = type_storep_instr[exprs[0]->expression.vtype];
|
||||
else
|
||||
assignop = type_store_instr[exprs[0]->expression.vtype];
|
||||
out = (ast_expression*)ast_binary_new(ctx, INSTR_BITAND, exprs[0], exprs[1]);
|
||||
if (!out)
|
||||
return false;
|
||||
out = (ast_expression*)ast_binstore_new(ctx, assignop, INSTR_SUB_F, exprs[0], out);
|
||||
break;
|
||||
}
|
||||
#undef NotSameType
|
||||
|
||||
|
|
|
@ -56,4 +56,7 @@ void main() {
|
|||
a = 1;
|
||||
print(ftos(a |= 2), " = 3\n");
|
||||
print(ftos(a &= 6), " = 2\n");
|
||||
a = 7;
|
||||
|
||||
print(ftos(a &~= 3), " = 4\n");
|
||||
}
|
||||
|
|
|
@ -18,3 +18,4 @@ M: '6 8 10' = '6 8 10'
|
|||
M: '3 4 5' = '3 4 5'
|
||||
M: 3 = 3
|
||||
M: 2 = 2
|
||||
M: 4 = 4
|
||||
|
|
Loading…
Reference in a new issue