diff --git a/lib/lexer.wasm b/lib/lexer.wasm index fb17163..b902bf5 100755 Binary files a/lib/lexer.wasm and b/lib/lexer.wasm differ diff --git a/src/lexer.c b/src/lexer.c index e88f5c9..202cc84 100755 --- a/src/lexer.c +++ b/src/lexer.c @@ -189,6 +189,7 @@ bool parse () { !(lastToken == '.' && (*(lastTokenPos - 1) >= '0' && *(lastTokenPos - 1) <= '9')) && !(lastToken == '+' && *(lastTokenPos - 1) == '+') && !(lastToken == '-' && *(lastTokenPos - 1) == '-') || lastToken == ')' && isParenKeyword(openTokenStack[openTokenDepth].pos) || + openTokenDepth > 0 && openTokenStack[openTokenDepth - 1].token == AnyParen && *(lastTokenPos) == 'f' && *(lastTokenPos - 1) == 'o' && isParenKeyword(openTokenStack[openTokenDepth - 1].pos) || lastToken == '}' && (isExpressionTerminator(openTokenStack[openTokenDepth].pos) || openTokenStack[openTokenDepth].token == ClassBrace) || isExpressionKeyword(lastTokenPos) || lastToken == '/' && lastSlashWasDivision || @@ -871,7 +872,7 @@ bool readPrecedingKeywordn (char16_t* pos, const char16_t* compare, size_t n) { } // Detects one of case, debugger, delete, do, else, in, instanceof, new, -// return, throw, typeof, void, yield ,await, of +// return, throw, typeof, void, yield ,await bool isExpressionKeyword (char16_t* pos) { switch (*pos) { case 'd': @@ -908,12 +909,7 @@ bool isExpressionKeyword (char16_t* pos) { return false; } case 'f': - if (*(pos - 1) != 'o') - return false; - // of - if (pos -2 == source || isBrOrWsOrPunctuatorNotDot(*(pos - 2))) - return true; - if (*(pos - 2) != 'e') + if (*(pos - 1) != 'o' || *(pos - 2) != 'e') return false; switch (*(pos - 3)) { case 'c': diff --git a/test/_unit.cjs b/test/_unit.cjs index 00b2d54..727cbd4 100755 --- a/test/_unit.cjs +++ b/test/_unit.cjs @@ -39,6 +39,15 @@ function assertExportIs(source, actual, expected) { suite('Lexer', () => { beforeEach(async () => await init); + test(`Regex case`, () => { + const source = `for(let t of/[0-9]+/g.exec(e)){}` + parse(source); + }); + + test('keyword case', () => { + parse('const of=1;console.log(1+of/1)'); + }); + test('import types', () => { const input = ` // dynamic @@ -61,11 +70,6 @@ suite('Lexer', () => { assert.strictEqual(imports[5].t, 3); }); - test(`Regex case`, () => { - const source = `for(let t of/[0-9]+/g.exec(e)){}` - parse(source); - }); - test(`Source phase imports`, () => { const source = ` import source