mirror of
https://github.com/zekexiao/pocketlang.git
synced 2025-02-06 04:37:47 +08:00
add modeq implementation (#108)
* add modeq implementation * code review feedback
This commit is contained in:
parent
e177f80410
commit
c0f00f6cae
@ -96,7 +96,7 @@ typedef enum {
|
|||||||
TK_MINUSEQ, // -=
|
TK_MINUSEQ, // -=
|
||||||
TK_STAREQ, // *=
|
TK_STAREQ, // *=
|
||||||
TK_DIVEQ, // /=
|
TK_DIVEQ, // /=
|
||||||
//TK_MODEQ, // %=
|
TK_MODEQ, // %=
|
||||||
|
|
||||||
TK_ANDEQ, // &=
|
TK_ANDEQ, // &=
|
||||||
TK_OREQ, // |=
|
TK_OREQ, // |=
|
||||||
@ -742,7 +742,9 @@ static void lexToken(Compiler* compiler) {
|
|||||||
case ']': setNextToken(compiler, TK_RBRACKET); return;
|
case ']': setNextToken(compiler, TK_RBRACKET); return;
|
||||||
case '{': setNextToken(compiler, TK_LBRACE); return;
|
case '{': setNextToken(compiler, TK_LBRACE); return;
|
||||||
case '}': setNextToken(compiler, TK_RBRACE); return;
|
case '}': setNextToken(compiler, TK_RBRACE); return;
|
||||||
case '%': setNextToken(compiler, TK_PERCENT); return;
|
case '%':
|
||||||
|
setNextTwoCharToken(compiler, '=', TK_PERCENT, TK_MODEQ);
|
||||||
|
return;
|
||||||
|
|
||||||
case '~': setNextToken(compiler, TK_TILD); return;
|
case '~': setNextToken(compiler, TK_TILD); return;
|
||||||
|
|
||||||
@ -966,6 +968,7 @@ static bool matchAssignment(Compiler* compiler) {
|
|||||||
if (match(compiler, TK_ANDEQ)) return true;
|
if (match(compiler, TK_ANDEQ)) return true;
|
||||||
if (match(compiler, TK_OREQ)) return true;
|
if (match(compiler, TK_OREQ)) return true;
|
||||||
if (match(compiler, TK_XOREQ)) return true;
|
if (match(compiler, TK_XOREQ)) return true;
|
||||||
|
if (match(compiler, TK_MODEQ)) return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1149,6 +1152,7 @@ GrammarRule rules[] = { // Prefix Infix Infix Precedence
|
|||||||
/* TK_MINUSEQ */ NO_RULE,
|
/* TK_MINUSEQ */ NO_RULE,
|
||||||
/* TK_STAREQ */ NO_RULE,
|
/* TK_STAREQ */ NO_RULE,
|
||||||
/* TK_DIVEQ */ NO_RULE,
|
/* TK_DIVEQ */ NO_RULE,
|
||||||
|
/* TK_MODEQ */ NO_RULE,
|
||||||
/* TK_ANDEQ */ NO_RULE,
|
/* TK_ANDEQ */ NO_RULE,
|
||||||
/* TK_OREQ */ NO_RULE,
|
/* TK_OREQ */ NO_RULE,
|
||||||
/* TK_XOREQ */ NO_RULE,
|
/* TK_XOREQ */ NO_RULE,
|
||||||
@ -1853,6 +1857,7 @@ static void emitAssignment(Compiler* compiler, TokenType assignment) {
|
|||||||
case TK_ANDEQ: emitOpcode(compiler, OP_BIT_AND); break;
|
case TK_ANDEQ: emitOpcode(compiler, OP_BIT_AND); break;
|
||||||
case TK_OREQ: emitOpcode(compiler, OP_BIT_OR); break;
|
case TK_OREQ: emitOpcode(compiler, OP_BIT_OR); break;
|
||||||
case TK_XOREQ: emitOpcode(compiler, OP_BIT_XOR); break;
|
case TK_XOREQ: emitOpcode(compiler, OP_BIT_XOR); break;
|
||||||
|
case TK_MODEQ: emitOpcode(compiler, OP_MOD); break;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
break;
|
break;
|
||||||
|
@ -84,6 +84,9 @@ for i in 0..1000
|
|||||||
x = i; assert((x&=-1) == i)
|
x = i; assert((x&=-1) == i)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
x = 42 ; assert((x%=3) == 0)
|
||||||
|
x = 27 ; assert((x%=8) == 3)
|
||||||
|
|
||||||
x = 43690 ; assert((x|=21845) == 65535)
|
x = 43690 ; assert((x|=21845) == 65535)
|
||||||
x = 204 ; assert((x|=119) == 255)
|
x = 204 ; assert((x|=119) == 255)
|
||||||
for i in 0..1000
|
for i in 0..1000
|
||||||
|
Loading…
Reference in New Issue
Block a user