Cart grammar: tolerate leading blank lines before the magic header
`extras: $ => []` in the cart grammar made the parser fail at byte 0 on any whitespace-only or empty line before `pico-8 cartridge //...`. Real PICO-8 carts always start with the header at byte 0 so this rarely surfaced in production, but it ( a ) broke the `tree-sitter test` corpus harness, which prepends a newline to each fixture, and ( b ) would mis-flag a hand-edited cart that gained an accidental blank line up top. Fix: prefix the `cartridge` rule with `repeat($._blank_line)` and add a hidden `_blank_line` token matching `[ \t]*\n`. Junk content before the header ( a non-blank, non-magic line ) still produces an ERROR. Restores the test corpus that was dropped in v0.1 ( previously failing on this same edge case ) and adds a fixture for the unknown_section fallback while the corpus is being rebuilt. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -18,16 +18,31 @@
|
||||
module.exports = grammar({
|
||||
name: 'p8_cart',
|
||||
|
||||
// Whitespace is significant inside hex sections, so we don't skip it.
|
||||
// Whitespace is significant inside hex sections, so we don't skip it
|
||||
// globally. Tolerance for stray leading blanks before the magic header
|
||||
// is added explicitly via the `repeat($._blank_line)` at the top of
|
||||
// `cartridge` ( see below ).
|
||||
extras: $ => [],
|
||||
|
||||
rules: {
|
||||
cartridge: $ => seq(
|
||||
// Tolerate stray whitespace / blank lines before the magic header.
|
||||
// Real PICO-8 carts begin with the header on byte 0, but allowing
|
||||
// a leading run of blanks ( a ) lets the `tree-sitter test` corpus
|
||||
// framework, which prepends a newline to each fixture, run cleanly
|
||||
// and ( b ) keeps the parser robust against a hand-edited cart that
|
||||
// gained an accidental blank line up top.
|
||||
repeat($._blank_line),
|
||||
optional($.header),
|
||||
optional($.version),
|
||||
repeat($.section),
|
||||
),
|
||||
|
||||
// A line that has no content other than horizontal whitespace and a
|
||||
// newline. Hidden ( underscore prefix ) so it does not appear in the
|
||||
// syntax tree.
|
||||
_blank_line: $ => token(/[ \t]*\n/),
|
||||
|
||||
header: $ => /pico-8 cartridge \/\/[^\n]*\n/,
|
||||
version: $ => /version[ \t]+\d+\n/,
|
||||
|
||||
|
||||
Reference in New Issue
Block a user