add modeq implementation (#108)

* add modeq implementation

* code review feedback
This commit is contained in:
Takashi Idobe 2021-06-22 08:19:52 -04:00 committed by GitHub
parent e177f80410
commit c0f00f6cae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 2 deletions

View File

@ -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;

View File

@ -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