* ```abnf * Attr = "#[" IDENT [StaticExpr] "]" * ```
(s: ITokenStream)
| 407 | * ``` |
| 408 | */ |
| 409 | function parseAttr(s: ITokenStream): Ast.Attribute { |
| 410 | const startPos = s.getPos(); |
| 411 | |
| 412 | s.expect(TokenKind.OpenSharpBracket); |
| 413 | s.next(); |
| 414 | |
| 415 | s.expect(TokenKind.Identifier); |
| 416 | const name = s.getTokenValue(); |
| 417 | s.next(); |
| 418 | |
| 419 | let value: Ast.Expression; |
| 420 | if (!s.is(TokenKind.CloseBracket)) { |
| 421 | value = parseExpr(s, true); |
| 422 | } else { |
| 423 | const closePos = s.getPos(); |
| 424 | value = NODE('bool', { value: true }, closePos, closePos); |
| 425 | } |
| 426 | |
| 427 | s.expect(TokenKind.CloseBracket); |
| 428 | s.next(); |
| 429 | |
| 430 | return NODE('attr', { name, value }, startPos, s.getPos()); |
| 431 | } |
| 432 | |
| 433 | /** |
| 434 | * ```abnf |
no test coverage detected