xref: /dokuwiki/_test/tests/Parsing/Markdown/gfm-spec/skip.php (revision 74031e463764923581b9204cebc0fc3f34ce881f)
1<?php
2
3/**
4 * GFM spec examples that GfmSpecTest should skip, keyed by example number
5 * (as numbered in spec.txt / the rendered spec).
6 *
7 * Add entries here ONLY for behavior DokuWiki has explicitly decided not to
8 * implement — not for features that are merely pending. Unimplemented
9 * features should show as real failures so they remain visible TODOs on
10 * the branch.
11 *
12 * Each value is a short human-readable reason that will appear in phpunit's
13 * skip output.
14 */
15
16return [
17    // --------------------------------------------------------------------
18    // Fenced code blocks (GfmCode / GfmFile) — deliberate simplifications
19    // versus strict GFM. All of these are consequences of lexer constraints
20    // (no regex backreferences) or the deliberate column-0-only policy.
21    // --------------------------------------------------------------------
22    94  => 'fenced code: closing fence must be ≥ opening length — DokuWiki'
23         . ' accepts any 3+ run as a closer (no regex backreferences for'
24         . ' length pairing). Deliberate relaxation.',
25    95  => 'fenced code (tilde variant): closing fence must be ≥ opening'
26         . ' length — see example 94.',
27    96  => 'fenced code: unclosed fence — DokuWiki convention requires a'
28         . ' closer (matches DW <code> tag), so unclosed fences stay'
29         . ' literal rather than consuming to EOF. GFM spec rule depends'
30         . ' on CommonMark\'s two-pass block parser, which our single-pass'
31         . ' lexer cannot implement fully anyway (see example 98).',
32    97  => 'fenced code: unclosed fence with intervening short run — stays'
33         . ' literal, see example 96.',
34    101 => 'fenced code: opener indented 1 space — DokuWiki requires'
35         . ' column-0 fences. Indent tolerance + per-line body dedent out'
36         . ' of scope.',
37    102 => 'fenced code: opener indented 2 spaces — see example 101.',
38    103 => 'fenced code: opener indented 3 spaces — see example 101.',
39    105 => 'fenced code: closer indented 2 spaces — column-0-only policy,'
40         . ' see example 101.',
41    106 => 'fenced code: indented opener with less-indented closer —'
42         . ' column-0-only policy, see example 101.',
43    107 => 'fenced code: 4-space-indented closer — with column-0-only'
44         . ' policy there is no valid closer, so the fence stays literal'
45         . ' (see example 96).',
46    109 => 'fenced code: malformed closer `~~~ ~~` (space-broken run) —'
47         . ' with no valid closer the fence stays literal (see example 96).',
48    108 => 'fenced code: `` `` is not a valid fence; GFM falls back to an'
49         . ' inline code span of length 3. Inline spans with n≥3 not'
50         . ' implemented (GfmBacktickSingle/Double cover only n=1, n=2).',
51    111 => 'fenced code interrupting Setext heading (`foo\n---`): Setext'
52         . ' headings are deliberately not supported — the `---` underline'
53         . ' collides with DokuWiki\'s horizontal rule and `===` would'
54         . ' collide with DokuWiki heading syntax.',
55    115 => 'fenced code: `` `` backtick-fence-with-backticks-in-info-string'
56         . ' is invalid; GFM falls back to n=3 inline span — inline spans'
57         . ' with n≥3 not implemented. See example 108.',
58
59    // --------------------------------------------------------------------
60    // Code-span edge cases that collide with project-wide decisions
61    // (no raw HTML, no GFM angle-bracket autolinks, typography on by
62    // default) or with the single-pass lexer's limits.
63    // --------------------------------------------------------------------
64    351 => 'code span vs. emphasis: cross-positional precedence would require'
65         . ' a pre-scan pass — the single-pass lexer matches leftmost-first'
66         . ' and cannot reject an earlier emphasis opener because a later'
67         . ' backtick span would consume its closer',
68    353 => 'code span: the trailing `"` outside the span is converted to a'
69         . ' curly quote by DokuWiki typography, diverging from the spec HTML',
70    354 => 'raw HTML tag pass-through: DokuWiki does not render raw HTML by'
71         . ' default; `<html>` blocks are the opt-in',
72    356 => 'GFM angle-bracket autolink `<http://…>`: not implemented — we'
73         . ' rely on DokuWiki\'s existing bare-URL detection, which does not'
74         . ' parse `<URL>` form',
75
76    // --------------------------------------------------------------------
77    // CommonMark §6.2 flanking-delimiter analysis — deliberately not
78    // implemented. DokuWiki's regex lexer uses leftmost-match and cannot
79    // apply CommonMark's left/right-flanking rules that distinguish
80    // word-chars, whitespace, and punctuation for `*`/`_` delimiters, or
81    // the "multiple-of-3" rule for overlapping runs. These examples all
82    // rely on that machinery.
83    // --------------------------------------------------------------------
84
85    // Unicode whitespace in flanking context. Our `\s` is ASCII-only
86    // because the lexer doesn't set the PCRE `u` flag.
87    363 => 'Unicode whitespace (U+00A0) flanking — requires u-flag-aware regex',
88
89    // Punctuation-adjacent flanking for `*` / `_` / `**` / `__`
90    362 => 'flanking: punctuation-adjacent `*` (left-flanking vs. right-flanking)',
91    368 => 'flanking: punctuation-adjacent `_`',
92    372 => 'flanking: intraword `_` with punctuation inside',
93    377 => 'flanking: `*` followed by `(` requires punctuation-aware flanking',
94    378 => 'flanking: nested `*(*foo*)*` requires flanking + balanced-pair analysis',
95    382 => 'flanking: nested `_(_foo_)_` requires flanking + balanced-pair analysis',
96    389 => 'flanking: punctuation-adjacent `**`',
97    394 => 'flanking: punctuation-adjacent `__`',
98    401 => 'flanking: `**` followed by `(`',
99    404 => 'flanking: nested `*bar*` inside `**foo ... foo**` with punctuation',
100    407 => 'flanking: `__` followed by `(`',
101    470 => 'flanking: nested `*_foo_*` requires balanced-pair analysis',
102    472 => 'flanking: nested `_*foo*_` requires balanced-pair analysis',
103
104    // Intraword `__` strong (even multibyte) — flanking rule for `_` requires
105    // examining whether the delimiter run is word-boundary-flanking, which our
106    // simple lookbehind/lookahead approximation doesn't fully match.
107    395 => 'flanking: intraword `__` (`foo__bar__`) — left-flanking vs right-flanking',
108    396 => 'flanking: intraword `__` across digits (`5__6__78`)',
109    397 => 'flanking: intraword `__` with Cyrillic',
110    398 => 'flanking: `__foo, __bar__, baz__` — flanking + balanced pairing',
111    409 => 'flanking: `__foo__bar` — intraword close',
112    410 => 'flanking: intraword `__` with Cyrillic (leading)',
113    411 => 'flanking: `__foo__bar__baz__` — multiple `__` pairs with flanking',
114    412 => 'flanking: `__(bar)__.` — punctuation-adjacent',
115
116    // Overlapping / multiple-of-3 rule for runs
117    416 => 'CommonMark rule 9 (overlapping same-delimiter `_foo _bar_ baz_`)',
118    417 => 'CommonMark overlapping `_` / `__` with flanking',
119    418 => 'CommonMark overlapping `*foo *bar**` — multiple-of-3 rule',
120    419 => 'CommonMark nested `*foo **bar** baz*` — balanced-pair analysis',
121    421 => 'CommonMark overlapping `*foo**bar*` — multiple-of-3',
122    422 => 'CommonMark nested `***foo** bar*` — triple-delimiter analysis',
123    423 => 'CommonMark nested `*foo **bar***` — triple-delimiter analysis',
124    424 => 'CommonMark nested `*foo**bar***` — triple-delimiter analysis',
125    425 => 'CommonMark triple `foo***bar***baz` — triple-delimiter analysis',
126    426 => 'CommonMark long delimiter runs `foo******bar*********baz`',
127    427 => 'CommonMark deeply nested `*foo **bar *baz* bim** bop*`',
128    434 => 'CommonMark overlapping `__foo __bar__ baz__` — multiple-of-3',
129    435 => 'CommonMark `____foo__ bar__` — leading long delimiter run',
130    436 => 'CommonMark `**foo **bar****` — trailing long delimiter run',
131    439 => 'CommonMark nested `***foo* bar**` — triple-delimiter',
132    440 => 'CommonMark nested `**foo *bar***` — triple-delimiter',
133    441 => 'CommonMark deeply nested `**foo *bar **baz** bim* bop**`',
134
135    // `__foo_` / `_foo__` — mixing `_` and `__` requires flanking to decide
136    // which delimiter pairs open/close.
137    463 => 'flanking: `__foo_` — mixed `_`/`__` pairing',
138    464 => 'flanking: `_foo__` — mixed `_`/`__` pairing',
139    465 => 'flanking: `___foo__` — delimiter-run length analysis',
140    466 => 'flanking: `____foo_` — delimiter-run length analysis',
141    467 => 'flanking: `__foo___` — delimiter-run length analysis',
142    468 => 'flanking: `_foo____` — delimiter-run length analysis',
143
144    // Long delimiter runs require excess-drop logic (2 outer chars dropped
145    // from each side). Stack-based pairing needed — out of scope.
146    473 => 'CommonMark `****foo****` — excess-drop (4+4 → strong only)',
147    474 => 'CommonMark `____foo____` — excess-drop (4+4 → strong only)',
148    475 => 'CommonMark `******foo******` — excess-drop (6+6 → strong only)',
149    477 => 'CommonMark `_____foo_____` — excess-drop (5+5 → em+strong, 2 dropped each side)',
150
151    // Overlapping / crossing delimiters
152    478 => 'CommonMark `*foo _bar* baz_` — overlapping different delimiters',
153    479 => 'CommonMark `*foo __bar *baz bim__ bam*` — crossing delimiters',
154    480 => 'CommonMark `**foo **bar baz**` — overlapping same delimiter',
155
156    // --------------------------------------------------------------------
157    // Inline link `[text](url)` — features GfmLink deliberately does not
158    // implement. Either rarely-used syntax paid for with disproportionate
159    // regex complexity, or single-pass-lexer limits that can't be worked
160    // around inside one mode.
161    // --------------------------------------------------------------------
162
163    // GFM link title attribute (`"title"` / `'title'` / `(title)` after
164    // the URL). Parses cleanly but is discarded: DokuWiki's link handler
165    // instructions have no title-attribute slot, and plumbing one through
166    // every renderer is out of scope for GfmLink.
167    493 => 'link title attribute: GfmLink parses but discards — DokuWiki link instructions have no title slot',
168    513 => 'link title attribute (three quoting styles): discarded by GfmLink',
169    515 => 'link title separated by non-breaking space: title slot not supported',
170    516 => 'link title with nested balanced quotes: Markdown.pl quirk, not supported',
171    517 => 'link title with different quote type for inner quotes: title slot not supported',
172    518 => 'multi-line link title: title slot not supported',
173
174    // Pointy-bracket link destinations `<...>`. Rarely used; regex cost
175    // and interaction with raw-HTML detection outweigh the benefit.
176    496 => 'pointy-bracket link destination `<>`: not supported',
177    498 => 'pointy-bracket destination with spaces `<...>`: not supported',
178    500 => 'pointy-bracket destination with newline: not supported',
179    501 => 'pointy-bracket destination containing `)`: not supported',
180    502 => 'pointy-bracket destination with trailing backslash: not supported',
181    503 => 'malformed pointy-bracket destinations: renderer output differs',
182    507 => 'pointy-bracket destination wrapping unbalanced parens: not supported',
183
184    // Balanced-parens inside URL destinations.
185    505 => 'balanced-parens in URL destination: not supported (regex single-level)',
186
187    // Other URL-level edges.
188    495 => 'empty URL destination `[link]()`: pattern requires non-empty URL',
189    510 => 'backslash in URL destination: URL-encoding differs from spec',
190    511 => 'HTML entity / percent-encoding in URL: renderer normalization differs',
191    512 => 'link destination that parses as a title: edge case not supported',
192
193    // Inherent single-pass-lexer limits for link text containing nested
194    // structures. These cannot be resolved inside one mode.
195    522 => 'nested bracket forms inner link, outer falls back to literal',
196    526 => 'nested links: inner is a link, outer falls back to literal',
197    527 => 'nested links inside emphasis: not supported',
198    529 => 'link text grouping vs. emphasis: leftmost-match cannot override',
199    530 => 'emphasis/bracket crossing: leftmost-match cannot override',
200    532 => 'raw HTML inside link text: project-wide "no raw HTML" limit',
201    533 => 'code span inside link text: requires pre-scan pass (see #351)',
202    534 => 'autolink inside link text: raw `<URL>` autolinks not supported (see #356)',
203
204    // Reference links (`[text][id]`, `[text][]`, `[foo]` with matching
205    // `[foo]: url` definition). Not implemented: resolving forward
206    // references would require a two-pass parse, but DokuWiki's lexer is
207    // single-pass. Inline links `[text](url)` are the only supported
208    // form.
209    535 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
210    536 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
211    537 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
212    538 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
213    539 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
214    540 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
215    541 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
216    542 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
217    543 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
218    544 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
219    545 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
220    546 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
221    547 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
222    548 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
223    549 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
224    550 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
225    551 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
226    552 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
227    553 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
228    557 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
229    558 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
230    560 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
231    561 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)',
232    562 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)',
233    563 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)',
234    564 => 'collapsed reference link: forward-reference definitions not supported (single-pass lexer)',
235    565 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)',
236    566 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)',
237    567 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)',
238    568 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)',
239    569 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)',
240    570 => 'shortcut reference link: forward-reference definitions not supported (single-pass lexer)',
241    571 => 'shortcut reference link with escape: forward-reference definitions not supported (single-pass lexer)',
242    572 => 'shortcut reference link with emphasis: forward-reference definitions not supported (single-pass lexer)',
243    573 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
244    574 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
245    575 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
246    576 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
247    577 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
248    578 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
249    579 => 'reference link: forward-reference definitions not supported (single-pass lexer)',
250
251    // --------------------------------------------------------------------
252    // Inline image `![alt](url)`. The XHTML renderer's default media
253    // rendering diverges from GFM's bare <img> (it wraps in a details <a>
254    // with fetch.php/detail.php proxy URLs) — GfmSpecTest uses
255    // SpecCompatRenderer to emit spec-shape bare <img>, so only the
256    // parser-level or feature-level gaps remain as skips: title attribute
257    // (no DW slot), reference images, pointy-bracket destinations, nested
258    // brackets, and escape-dependent cases.
259    // --------------------------------------------------------------------
260
261    580 => 'image with title attribute: GfmMedia discards titles (no DW slot)',
262    581 => 'reference-style image: forward-reference definitions not supported (single-pass lexer)',
263    582 => 'nested image-in-image `![foo ![bar](x)](y)`: alt class forbids brackets;'
264         . ' leftmost-match cannot reorder — outer falls back to literal (see #526)',
265    583 => 'link-in-image alt `![foo [bar](x)](y)`: alt class forbids brackets;'
266         . ' leftmost-match cannot reorder — outer falls back to literal (see #526)',
267    584 => 'collapsed reference-style image: forward-reference definitions not supported',
268    585 => 'full reference-style image: forward-reference definitions not supported',
269    587 => 'image with title attribute: title discarded (no DW slot)',
270    588 => 'pointy-bracket image destination `![alt](<url>)`: not supported (see GfmLink #496)',
271    590 => 'reference-style image: forward-reference definitions not supported',
272    591 => 'reference-style image (case-insensitive label): forward-reference definitions not supported',
273    592 => 'collapsed reference-style image `![foo][]`: forward-reference definitions not supported',
274    593 => 'collapsed reference-style image with emphasis in label: forward-reference definitions not supported',
275    594 => 'collapsed reference-style image (case-insensitive): forward-reference definitions not supported',
276    595 => 'reference-style image with intervening whitespace: forward-reference definitions not supported',
277    596 => 'shortcut reference-style image `![foo]`: forward-reference definitions not supported',
278    597 => 'shortcut reference-style image with emphasis: forward-reference definitions not supported',
279    598 => 'image with unescaped nested brackets `![[foo]]`: literal-fallback behavior not supported',
280    599 => 'shortcut reference-style image (case-insensitive): forward-reference definitions not supported',
281
282    // --------------------------------------------------------------------
283    // ATX heading collisions with DokuWiki-specific behavior.
284    // --------------------------------------------------------------------
285    38 => 'ATX heading with leading spaces: GFM tolerates 0-3 spaces of'
286        . ' indent before the opener; we require the `#` at column 0.'
287        . ' Indent tolerance collides with DokuWiki\'s 2-space-indent'
288        . ' preformatted block and isn\'t worth untangling',
289    39 => 'indented code block: DokuWiki uses 2-space indent for'
290        . ' preformatted; GFM 4-space indented code blocks are not'
291        . ' implemented',
292    40 => 'indented code block: 4-space indent after a paragraph is a'
293        . ' continuation in GFM but preformatted in DokuWiki — not'
294        . ' implemented',
295    41 => 'ATX heading with leading spaces: second heading is indented'
296        . ' by 2 spaces; we require the `#` at column 0',
297    49 => 'empty ATX heading: DokuWiki\'s XHTML renderer deliberately'
298        . ' skips blank headings (blank() guard in Doku_Renderer_xhtml::header)',
299
300    // --------------------------------------------------------------------
301    // List items / Lists — list features GfmListblock deliberately does
302    // not implement. The simplifications are by design: indentation uses
303    // a fixed 2-space-multiple step starting at 0, lazy continuation is
304    // not supported, and the rewriter groups items by 'u'/'o' type only.
305    // The buckets are:
306    //
307    //  A. Extra spaces after the marker. CommonMark rolls them (up to
308    //     4) into the content column; we dedent at `marker_width + 1`,
309    //     collapsing the extras.
310    //  B. 1- or 3-space indent for nesting (we round down to nearest 2).
311    //  C. Lazy continuation (column-0 paragraph wrap inside an item).
312    //  D. Strict CommonMark loose/tight classification (every blank line
313    //     between items / inside items reclassifies; we use a simpler
314    //     single-paragraph-tight, multi-paragraph-loose rule).
315    //  E. Marker-character-change splits ordered lists ('.' vs ')') or
316    //     unordered ('-' vs '+' vs '*'). Our rewriter groups by 'u' / 'o'
317    //     type only, not by marker character.
318    //  F. List interrupting a paragraph without a blank line — requires a
319    //     multi-pass block parser to revisit prior text.
320    //
321    // Examples that depend on a pending mode (GfmQuote, GfmEscape, …) are
322    // intentionally NOT skipped — they remain visible failing tests until
323    // the mode lands.
324    // --------------------------------------------------------------------
325    232 => 'list items: marker-width content-column alignment (A)',
326    235 => 'list items: marker-width content-column alignment (A)',
327    249 => 'list items: marker-width-driven content-column alignment for `10. foo` (A)',
328    254 => 'list items: marker-width content-column alignment edge case (A)',
329    258 => 'list items: marker-width content-column for `1.  foo` (A)',
330    263 => 'list items: indent ambiguity at column 0/1/2 (B)',
331    264 => 'list items: 1-space-indent variation (B)',
332    265 => 'list items: marker-width with multi-line continuation (A)',
333    266 => 'list items: marker-width with multi-line continuation (A)',
334    267 => 'list items: lazy continuation (C)',
335    268 => 'list items: lazy continuation (C)',
336    270 => 'list items: lazy continuation across blank line (C+D)',
337    273 => 'list items: list interrupting a paragraph without blank line (F)',
338    275 => 'list items: 3-space indent rounds to 2 — sub-list under previous item (B)',
339    276 => 'list items: marker-width content-column with mixed types (A+E)',
340    277 => 'list items: nested markers on a single line (A)',
341    278 => 'list items: marker-character switch splits the list (E)',
342    281 => 'lists: marker-character change splits unordered list `-` -> `+` (E)',
343    282 => 'lists: ordered delimiter switch splits list `.` -> `)` (E)',
344    284 => 'lists: list interrupting paragraph without blank line (F)',
345    286 => 'lists: marker-width content-column alignment for ordered list (A)',
346    287 => 'lists: triple blank line + indented continuation in deeply nested item (D)',
347    288 => 'lists: marker-character change at deeper level (E)',
348    289 => 'lists: marker-character change with type switch (E)',
349    290 => 'lists: 1-space-indent variations of items, all stay top-level (B)',
350    291 => 'lists: 1-space-indent variations on ordered list (B)',
351    292 => 'lists: marker-character change splits inside nested list (E)',
352    293 => 'lists: marker-character change with mixed indent (E+B)',
353    294 => 'lists: lazy continuation across types (C+E)',
354    295 => 'lists: lazy continuation in nested list (C)',
355    296 => 'lists: lazy continuation across blank line (C+D)',
356    297 => 'lists: blank-line classification for loose/tight in nested list (D)',
357    298 => 'lists: blank-line classification (D)',
358    300 => 'lists: blank-line classification with marker change (D+E)',
359    301 => 'lists: blank-line classification + marker-width alignment (D+A)',
360    304 => 'lists: blank line between sub-list items affects loose/tight (D)',
361    305 => 'lists: blank line between deeply nested items (D)',
362    306 => 'lists: blank line at the end of a loose list affects classification (D)',
363
364    // --------------------------------------------------------------------
365    // Backslash-escape examples (§6.1) that fail for reasons unrelated to
366    // GfmEscape itself: renderer divergences, typography conversion, and
367    // already-skipped GFM features (autolinks, raw HTML, reference links,
368    // discarded link titles). The escape mechanic itself works.
369    // --------------------------------------------------------------------
370    308 => 'backslash escapes: apostrophe is rendered as `&#039;` by DW while'
371         . ' the spec expects a literal `\'` — renderer policy difference,'
372         . ' not an escape bug',
373    310 => 'backslash escapes: DW typography converts straight `"..."` to curly'
374         . ' quotes when $conf[typography] is on, diverging from spec output',
375    316 => 'backslash escapes inside angle-bracket autolinks: GFM autolink'
376         . ' `<URL>` form not implemented (see example 356)',
377    317 => 'backslash escapes inside raw HTML: raw HTML pass-through is not'
378         . ' supported by default (see example 354)',
379    318 => 'backslash escapes in link title: title attribute is discarded — DW'
380         . ' link instructions have no title slot (see SPEC.md GfmLink)',
381    319 => 'backslash escapes in reference-link definition: link reference'
382         . ' definitions not supported (single-pass lexer cannot resolve'
383         . ' forward references)',
384];
385