Parse `{ key: value, ... }`
()
| 309 | |
| 310 | /** Parse `{ key: value, ... }` */ |
| 311 | function parseObj(): ASTNode { |
| 312 | adv(); // skip { |
| 313 | const entries: [string, ASTNode][] = []; |
| 314 | while (cur().t !== T.RBrace && cur().t !== T.EOF) { |
| 315 | const kt = cur(); |
| 316 | const key = |
| 317 | kt.t === T.Ident || kt.t === T.Str || kt.t === T.Type || kt.t === T.Num |
| 318 | ? (adv(), String(kt.v)) |
| 319 | : kt.t === T.StateVar |
| 320 | ? (adv(), (kt.v as string).replace(/^\$/, "")) |
| 321 | : (adv(), "?"); |
| 322 | eat(T.Colon); |
| 323 | entries.push([key, parseExpr(0)]); |
| 324 | if (cur().t === T.Comma) adv(); |
| 325 | } |
| 326 | eat(T.RBrace); |
| 327 | return { k: "Obj", entries }; |
| 328 | } |
| 329 | |
| 330 | return parseExpr(0); |
| 331 | } |