diff --git a/src/parser/syntaxes/expressions.ts b/src/parser/syntaxes/expressions.ts index 5d6e2641..ca86cd95 100644 --- a/src/parser/syntaxes/expressions.ts +++ b/src/parser/syntaxes/expressions.ts @@ -565,7 +565,10 @@ function parseObject(s: ITokenStream, isStatic: boolean): Ast.Obj { const map = new Map(); while (!s.is(TokenKind.CloseBrace)) { - s.expect(TokenKind.Identifier); + const keyTokenKind = s.getTokenKind(); + if (keyTokenKind !== TokenKind.Identifier && keyTokenKind !== TokenKind.StringLiteral) { + throw unexpectedTokenError(keyTokenKind, s.getPos()); + } const k = s.getTokenValue(); s.next(); diff --git a/test/index.ts b/test/index.ts index af97bf11..e66b855b 100644 --- a/test/index.ts +++ b/test/index.ts @@ -198,6 +198,8 @@ describe('Object', () => { }); /* 未実装 + * see also: test/literals.ts > literal > obj (string key) + * issue: https://github.com/aiscript-dev/aiscript/issues/62 test.concurrent('string key', async () => { const res = await exe(` let obj = { diff --git a/test/literals.ts b/test/literals.ts index 772ba990..462cb5b7 100644 --- a/test/literals.ts +++ b/test/literals.ts @@ -130,6 +130,15 @@ describe('literal', () => { eq(res, OBJ(new Map([['a', NUM(1)], ['b', NUM(2)], ['c', NUM(3)]]))); }); + test.concurrent('obj (string key)', async () => { + const res = await exe(` + <: { + "藍": 42, + } + `); + eq(res, OBJ(new Map([['藍', NUM(42)]]))); + }); + test.concurrent('obj and arr (separated by line break)', async () => { const res = await exe(` <: { diff --git a/unreleased/object-key-string.md b/unreleased/object-key-string.md new file mode 100644 index 00000000..b04b8f29 --- /dev/null +++ b/unreleased/object-key-string.md @@ -0,0 +1 @@ +- オブジェクトリテラルのキーに文字列リテラルを記述できるようになりました。