Parse a reserved statement. Supports: - reserved 2, 15, 9 to 11, 40 to max; (numbers and ranges) - reserved "FOO", "BAR"; (field/value names)
(self)
| 408 | ) |
| 409 | |
| 410 | def parse_reserved(self): |
| 411 | """Parse a reserved statement. |
| 412 | |
| 413 | Supports: |
| 414 | - reserved 2, 15, 9 to 11, 40 to max; (numbers and ranges) |
| 415 | - reserved "FOO", "BAR"; (field/value names) |
| 416 | """ |
| 417 | self.consume(TokenType.RESERVED) |
| 418 | |
| 419 | # Parse comma-separated list of reserved items |
| 420 | while True: |
| 421 | if self.check(TokenType.STRING): |
| 422 | # Reserved name: "FOO" |
| 423 | self.advance() |
| 424 | elif self.check(TokenType.INT): |
| 425 | # Reserved number or range start: 2 or 9 to 11 |
| 426 | self.advance() |
| 427 | # Check for range: N to M or N to max |
| 428 | if self.check(TokenType.TO): |
| 429 | self.advance() |
| 430 | if self.check(TokenType.MAX): |
| 431 | self.advance() |
| 432 | elif self.check(TokenType.INT): |
| 433 | self.advance() |
| 434 | else: |
| 435 | raise self.error("Expected integer or 'max' after 'to'") |
| 436 | else: |
| 437 | raise self.error( |
| 438 | f"Expected reserved number or string, got {self.current().type.name}" |
| 439 | ) |
| 440 | |
| 441 | # Check for comma (more items) or semicolon (end) |
| 442 | if self.check(TokenType.COMMA): |
| 443 | self.advance() |
| 444 | elif self.check(TokenType.SEMI): |
| 445 | break |
| 446 | else: |
| 447 | raise self.error("Expected ',' or ';' in reserved statement") |
| 448 | |
| 449 | self.consume(TokenType.SEMI, "Expected ';' after reserved statement") |
| 450 | |
| 451 | def parse_enum_value(self) -> EnumValue: |
| 452 | """Parse an enum value: NAME = 0;""" |