mirror of
https://github.com/zekexiao/pocketlang.git
synced 2025-02-11 07:00:58 +08:00
Merge pull request #71 from alexcpatel/op-oreq-xoreq
Operators |= and ^= implemented
This commit is contained in:
commit
da5d5d6993
@ -94,7 +94,8 @@ typedef enum {
|
|||||||
TK_DIVEQ, // /=
|
TK_DIVEQ, // /=
|
||||||
|
|
||||||
TK_ANDEQ, // &=
|
TK_ANDEQ, // &=
|
||||||
// TODO: TK_OREQ, TK_XOREQ
|
TK_OREQ, // |=
|
||||||
|
TK_XOREQ, // ^=
|
||||||
|
|
||||||
TK_SRIGHT, // >>
|
TK_SRIGHT, // >>
|
||||||
TK_SLEFT, // <<
|
TK_SLEFT, // <<
|
||||||
@ -666,10 +667,12 @@ static void lexToken(Compiler* compiler) {
|
|||||||
case '&':
|
case '&':
|
||||||
setNextTwoCharToken(compiler, '=', TK_AMP, TK_ANDEQ);
|
setNextTwoCharToken(compiler, '=', TK_AMP, TK_ANDEQ);
|
||||||
return;
|
return;
|
||||||
|
case '|':
|
||||||
// TODO: TK_OREQ, TK_XOREQ
|
setNextTwoCharToken(compiler, '=', TK_PIPE, TK_OREQ);
|
||||||
case '|': setNextToken(compiler, TK_PIPE); return;
|
return;
|
||||||
case '^': setNextToken(compiler, TK_CARET); return;
|
case '^':
|
||||||
|
setNextTwoCharToken(compiler, '=', TK_CARET, TK_XOREQ);
|
||||||
|
return;
|
||||||
|
|
||||||
case '\n': setNextToken(compiler, TK_LINE); return;
|
case '\n': setNextToken(compiler, TK_LINE); return;
|
||||||
|
|
||||||
@ -875,7 +878,8 @@ static bool matchAssignment(Compiler* compiler) {
|
|||||||
if (match(compiler, TK_STAREQ)) return true;
|
if (match(compiler, TK_STAREQ)) return true;
|
||||||
if (match(compiler, TK_DIVEQ)) return true;
|
if (match(compiler, TK_DIVEQ)) return true;
|
||||||
if (match(compiler, TK_ANDEQ)) return true;
|
if (match(compiler, TK_ANDEQ)) return true;
|
||||||
// TODO: match TK_OREQ, TK_XOREQ
|
if (match(compiler, TK_OREQ)) return true;
|
||||||
|
if (match(compiler, TK_XOREQ)) return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1050,7 +1054,8 @@ GrammarRule rules[] = { // Prefix Infix Infix Precedence
|
|||||||
/* TK_STAREQ */ NO_RULE,
|
/* TK_STAREQ */ NO_RULE,
|
||||||
/* TK_DIVEQ */ NO_RULE,
|
/* TK_DIVEQ */ NO_RULE,
|
||||||
/* TK_ANDEQ */ NO_RULE,
|
/* TK_ANDEQ */ NO_RULE,
|
||||||
// TODO: add TK_OREQ, TK_XOREQ
|
/* TK_OREQ */ NO_RULE,
|
||||||
|
/* TK_XOREQ */ NO_RULE,
|
||||||
/* TK_SRIGHT */ { NULL, exprBinaryOp, PREC_BITWISE_SHIFT },
|
/* TK_SRIGHT */ { NULL, exprBinaryOp, PREC_BITWISE_SHIFT },
|
||||||
/* TK_SLEFT */ { NULL, exprBinaryOp, PREC_BITWISE_SHIFT },
|
/* TK_SLEFT */ { NULL, exprBinaryOp, PREC_BITWISE_SHIFT },
|
||||||
/* TK_MODULE */ NO_RULE,
|
/* TK_MODULE */ NO_RULE,
|
||||||
@ -1730,7 +1735,8 @@ static void emitAssignment(Compiler* compiler, TokenType assignment) {
|
|||||||
case TK_STAREQ: emitOpcode(compiler, OP_MULTIPLY); break;
|
case TK_STAREQ: emitOpcode(compiler, OP_MULTIPLY); break;
|
||||||
case TK_DIVEQ: emitOpcode(compiler, OP_DIVIDE); break;
|
case TK_DIVEQ: emitOpcode(compiler, OP_DIVIDE); break;
|
||||||
case TK_ANDEQ: emitOpcode(compiler, OP_BIT_AND); break;
|
case TK_ANDEQ: emitOpcode(compiler, OP_BIT_AND); break;
|
||||||
// TODO: TK_OREQ, TK_XOREQ
|
case TK_OREQ: emitOpcode(compiler, OP_BIT_OR); break;
|
||||||
|
case TK_XOREQ: emitOpcode(compiler, OP_BIT_XOR); break;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
break;
|
break;
|
||||||
|
@ -65,6 +65,22 @@ for i in 0..1000
|
|||||||
x = i; assert((x&=-1) == i)
|
x = i; assert((x&=-1) == i)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
x = 43690 ; assert((x|=21845) == 65535)
|
||||||
|
x = 204 ; assert((x|=119) == 255)
|
||||||
|
for i in 0..1000
|
||||||
|
x = i; assert((x|=0) == i)
|
||||||
|
x = i; assert((x|=-1) == -1)
|
||||||
|
x = i; assert((x|=i) == i)
|
||||||
|
end
|
||||||
|
|
||||||
|
x = 4321 ; assert((x^=1234) == 5171)
|
||||||
|
x = 77 ; assert((x^=88) == 21)
|
||||||
|
for i in 0..1000
|
||||||
|
x = i; assert((x^=i) == 0)
|
||||||
|
x = i; assert((x^=0) == i)
|
||||||
|
x = i; assert((x^=-1) == -i-1)
|
||||||
|
end
|
||||||
|
|
||||||
# If we got here with no errors, then all test passed
|
# If we got here with no errors, then all test passed
|
||||||
print('All tests PASSED (100%)')
|
print('All tests PASSED (100%)')
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user