1#[derive(Clone, Copy, Debug, PartialEq, Eq)]
3pub enum ParityCapability {
4 LosslessParsing,
6 TriviaPreservation,
8 ErrorRecovery,
10 MixedLanguageRegions,
12 QueryMatching,
14 TransformBySubstitution,
16 SameLanguageReconstruction,
18 CrossLanguageReconstruction,
20 ObjectRoundTrip,
22 SemanticEvaluation,
24 FormalizationRoundTrip,
26 SelfDescription,
28 SnapshotVersioning,
30}
31
32#[derive(Clone, Copy, Debug, PartialEq, Eq)]
34pub struct ParityTarget {
35 name: &'static str,
36 upstream: &'static str,
37 capabilities: &'static [ParityCapability],
38 test_plan: &'static str,
39}
40
41impl ParityTarget {
42 #[must_use]
44 pub const fn name(&self) -> &'static str {
45 self.name
46 }
47
48 #[must_use]
50 pub const fn upstream(&self) -> &'static str {
51 self.upstream
52 }
53
54 #[must_use]
56 pub const fn capabilities(&self) -> &'static [ParityCapability] {
57 self.capabilities
58 }
59
60 #[must_use]
62 pub const fn test_plan(&self) -> &'static str {
63 self.test_plan
64 }
65}
66
67pub const PARITY_TARGETS: &[ParityTarget] = &[
69 ParityTarget {
70 name: "tree-sitter",
71 upstream: "https://github.com/tree-sitter/tree-sitter",
72 capabilities: &[
73 ParityCapability::LosslessParsing,
74 ParityCapability::ErrorRecovery,
75 ParityCapability::MixedLanguageRegions,
76 ParityCapability::QueryMatching,
77 ],
78 test_plan: "Executable fixture covers concrete syntax, injection, query, and recovery behavior.",
79 },
80 ParityTarget {
81 name: "LibCST",
82 upstream: "https://github.com/Instagram/LibCST",
83 capabilities: &[
84 ParityCapability::LosslessParsing,
85 ParityCapability::TriviaPreservation,
86 ParityCapability::SameLanguageReconstruction,
87 ],
88 test_plan: "Executable fixture covers Python parse, metadata, transform, and round-trip behavior.",
89 },
90 ParityTarget {
91 name: "Recast",
92 upstream: "https://github.com/benjamn/recast",
93 capabilities: &[
94 ParityCapability::LosslessParsing,
95 ParityCapability::TriviaPreservation,
96 ParityCapability::SameLanguageReconstruction,
97 ],
98 test_plan: "Executable fixture covers JavaScript/TypeScript parse-print preservation behavior.",
99 },
100 ParityTarget {
101 name: "jscodeshift",
102 upstream: "https://github.com/facebook/jscodeshift",
103 capabilities: &[
104 ParityCapability::QueryMatching,
105 ParityCapability::TransformBySubstitution,
106 ParityCapability::SameLanguageReconstruction,
107 ],
108 test_plan: "Executable fixture covers substitution-rule transform behavior.",
109 },
110 ParityTarget {
111 name: "Rowan",
112 upstream: "https://github.com/rust-analyzer/rowan",
113 capabilities: &[
114 ParityCapability::LosslessParsing,
115 ParityCapability::TriviaPreservation,
116 ParityCapability::SameLanguageReconstruction,
117 ParityCapability::SnapshotVersioning,
118 ],
119 test_plan: "Executable fixture covers persistent syntax and trivia preservation behavior.",
120 },
121 ParityTarget {
122 name: "cstree",
123 upstream: "https://github.com/domenicquirl/cstree",
124 capabilities: &[
125 ParityCapability::LosslessParsing,
126 ParityCapability::TriviaPreservation,
127 ParityCapability::SameLanguageReconstruction,
128 ParityCapability::SnapshotVersioning,
129 ],
130 test_plan: "Executable fixture covers Rust concrete syntax and checkpoint behavior.",
131 },
132 ParityTarget {
133 name: "Roslyn",
134 upstream: "https://github.com/dotnet/roslyn",
135 capabilities: &[
136 ParityCapability::LosslessParsing,
137 ParityCapability::TriviaPreservation,
138 ParityCapability::ErrorRecovery,
139 ParityCapability::SameLanguageReconstruction,
140 ],
141 test_plan: "Executable fixture covers C# syntax, trivia, diagnostics, and formatting behavior.",
142 },
143 ParityTarget {
144 name: "links-notation",
145 upstream: "https://github.com/link-foundation/links-notation",
146 capabilities: &[
147 ParityCapability::LosslessParsing,
148 ParityCapability::ObjectRoundTrip,
149 ParityCapability::SelfDescription,
150 ],
151 test_plan: "Executable fixture covers doublet, triplet, N-tuple, and indented LiNo behavior.",
152 },
153 ParityTarget {
154 name: "link-cli",
155 upstream: "https://github.com/link-foundation/link-cli",
156 capabilities: &[ParityCapability::TransformBySubstitution],
157 test_plan: "Executable fixture covers create, update, delete, swap, trigger, and dedup substitution behavior.",
158 },
159 ParityTarget {
160 name: "lino-objects-codec",
161 upstream: "https://github.com/link-foundation/lino-objects-codec",
162 capabilities: &[ParityCapability::ObjectRoundTrip],
163 test_plan: "Executable fixture covers encode/decode, identity, shared-reference, and circular-reference behavior.",
164 },
165 ParityTarget {
166 name: "relative-meta-logic",
167 upstream: "https://github.com/link-foundation/relative-meta-logic",
168 capabilities: &[
169 ParityCapability::SemanticEvaluation,
170 ParityCapability::SelfDescription,
171 ],
172 test_plan: "Executable fixture covers dependent-type, many-valued, probabilistic, and paradox behavior.",
173 },
174 ParityTarget {
175 name: "formal-ai",
176 upstream: "https://github.com/link-assistant/formal-ai",
177 capabilities: &[
178 ParityCapability::FormalizationRoundTrip,
179 ParityCapability::SemanticEvaluation,
180 ParityCapability::CrossLanguageReconstruction,
181 ],
182 test_plan: "Executable fixture covers formalization corpus and cross-language reconstruction behavior.",
183 },
184 ParityTarget {
185 name: "meta-expression",
186 upstream: "https://github.com/link-assistant/meta-expression",
187 capabilities: &[
188 ParityCapability::FormalizationRoundTrip,
189 ParityCapability::TriviaPreservation,
190 ParityCapability::CrossLanguageReconstruction,
191 ],
192 test_plan: "Executable fixture covers formalize, semantic-link, naturalize, span, and self-reference behavior.",
193 },
194];
195
196#[derive(Clone, Copy, Debug, PartialEq, Eq)]
198pub struct ParityFixture {
199 target_name: &'static str,
200 name: &'static str,
201 language: &'static str,
202 source: &'static str,
203 expected_reconstruction: &'static str,
204 capabilities: &'static [ParityCapability],
205}
206
207impl ParityFixture {
208 #[must_use]
210 pub const fn target_name(&self) -> &'static str {
211 self.target_name
212 }
213
214 #[must_use]
216 pub const fn name(&self) -> &'static str {
217 self.name
218 }
219
220 #[must_use]
222 pub const fn language(&self) -> &'static str {
223 self.language
224 }
225
226 #[must_use]
228 pub const fn source(&self) -> &'static str {
229 self.source
230 }
231
232 #[must_use]
234 pub const fn expected_reconstruction(&self) -> &'static str {
235 self.expected_reconstruction
236 }
237
238 #[must_use]
240 pub const fn capabilities(&self) -> &'static [ParityCapability] {
241 self.capabilities
242 }
243
244 #[must_use]
246 pub fn target(&self) -> &'static ParityTarget {
247 PARITY_TARGETS
248 .iter()
249 .find(|target| target.name() == self.target_name)
250 .expect("parity fixture target must exist")
251 }
252}
253
254pub const PARITY_FIXTURES: &[ParityFixture] = &[
256 ParityFixture {
257 target_name: "tree-sitter",
258 name: "markdown fenced rust with queryable tokens",
259 language: "Markdown",
260 source: "Intro\n```rust\nfn main() {}\n```\n",
261 expected_reconstruction: "Intro\n```rust\nfn main() {}\n```\n",
262 capabilities: &[
263 ParityCapability::LosslessParsing,
264 ParityCapability::ErrorRecovery,
265 ParityCapability::MixedLanguageRegions,
266 ParityCapability::QueryMatching,
267 ],
268 },
269 ParityFixture {
270 target_name: "LibCST",
271 name: "python round trip with indentation",
272 language: "Python",
273 source: "def f(x):\n return x + 1\n",
274 expected_reconstruction: "def f(x):\n return x + 1\n",
275 capabilities: &[
276 ParityCapability::LosslessParsing,
277 ParityCapability::TriviaPreservation,
278 ParityCapability::SameLanguageReconstruction,
279 ],
280 },
281 ParityFixture {
282 target_name: "Recast",
283 name: "javascript comment preservation",
284 language: "JavaScript",
285 source: "const value = 1; // keep trivia\n",
286 expected_reconstruction: "const value = 1; // keep trivia\n",
287 capabilities: &[
288 ParityCapability::LosslessParsing,
289 ParityCapability::TriviaPreservation,
290 ParityCapability::SameLanguageReconstruction,
291 ],
292 },
293 ParityFixture {
294 target_name: "jscodeshift",
295 name: "javascript transform input",
296 language: "JavaScript",
297 source: "const oldName = call(oldName);\n",
298 expected_reconstruction: "const oldName = call(oldName);\n",
299 capabilities: &[
300 ParityCapability::QueryMatching,
301 ParityCapability::TransformBySubstitution,
302 ParityCapability::SameLanguageReconstruction,
303 ],
304 },
305 ParityFixture {
306 target_name: "Rowan",
307 name: "rust trivia preservation",
308 language: "Rust",
309 source: "fn main() {\n // keep\n}\n",
310 expected_reconstruction: "fn main() {\n // keep\n}\n",
311 capabilities: &[
312 ParityCapability::LosslessParsing,
313 ParityCapability::TriviaPreservation,
314 ParityCapability::SameLanguageReconstruction,
315 ParityCapability::SnapshotVersioning,
316 ],
317 },
318 ParityFixture {
319 target_name: "cstree",
320 name: "rust checkpoint source",
321 language: "Rust",
322 source: "let checkpoint = value + 1;\n",
323 expected_reconstruction: "let checkpoint = value + 1;\n",
324 capabilities: &[
325 ParityCapability::LosslessParsing,
326 ParityCapability::TriviaPreservation,
327 ParityCapability::SameLanguageReconstruction,
328 ParityCapability::SnapshotVersioning,
329 ],
330 },
331 ParityFixture {
332 target_name: "Roslyn",
333 name: "csharp diagnostic recovery source",
334 language: "C#",
335 source: "class C { void M() { Console.WriteLine(1); } }\n",
336 expected_reconstruction: "class C { void M() { Console.WriteLine(1); } }\n",
337 capabilities: &[
338 ParityCapability::LosslessParsing,
339 ParityCapability::TriviaPreservation,
340 ParityCapability::ErrorRecovery,
341 ParityCapability::SameLanguageReconstruction,
342 ],
343 },
344 ParityFixture {
345 target_name: "links-notation",
346 name: "lino tuple forms",
347 language: "LiNo",
348 source: "(lovesMama: loves mama)\npapa has car\n",
349 expected_reconstruction: "(lovesMama: loves mama)\npapa has car\n",
350 capabilities: &[
351 ParityCapability::LosslessParsing,
352 ParityCapability::ObjectRoundTrip,
353 ParityCapability::SelfDescription,
354 ],
355 },
356 ParityFixture {
357 target_name: "link-cli",
358 name: "substitution patterns",
359 language: "LiNo",
360 source: "((1: 1 1)) ((1: 1 2))\n",
361 expected_reconstruction: "((1: 1 1)) ((1: 1 2))\n",
362 capabilities: &[ParityCapability::TransformBySubstitution],
363 },
364 ParityFixture {
365 target_name: "lino-objects-codec",
366 name: "shared and circular references",
367 language: "LiNo",
368 source: "(object: object object)\n(shared: object object)\n",
369 expected_reconstruction: "(object: object object)\n(shared: object object)\n",
370 capabilities: &[ParityCapability::ObjectRoundTrip],
371 },
372 ParityFixture {
373 target_name: "relative-meta-logic",
374 name: "dependent type and paradox source",
375 language: "RML",
376 source: "(Type: Type Type)\n(this_statement_is_false)\n",
377 expected_reconstruction: "(Type: Type Type)\n(this_statement_is_false)\n",
378 capabilities: &[
379 ParityCapability::SemanticEvaluation,
380 ParityCapability::SelfDescription,
381 ],
382 },
383 ParityFixture {
384 target_name: "formal-ai",
385 name: "formalization reconstruction source",
386 language: "English",
387 source: "Hawaii is a state.\n",
388 expected_reconstruction: "Hawaii is a state.\n",
389 capabilities: &[
390 ParityCapability::FormalizationRoundTrip,
391 ParityCapability::SemanticEvaluation,
392 ParityCapability::CrossLanguageReconstruction,
393 ],
394 },
395 ParityFixture {
396 target_name: "meta-expression",
397 name: "naturalization span source",
398 language: "English",
399 source: "1 + 1 = 2\n",
400 expected_reconstruction: "1 + 1 = 2\n",
401 capabilities: &[
402 ParityCapability::FormalizationRoundTrip,
403 ParityCapability::TriviaPreservation,
404 ParityCapability::CrossLanguageReconstruction,
405 ],
406 },
407];
408
409#[derive(Clone, Copy, Debug, PartialEq, Eq)]
411pub enum LanguageFamily {
412 Markup,
414 Programming,
416 Natural,
418}
419
420#[derive(Clone, Copy, Debug, PartialEq, Eq)]
422pub struct LanguageTarget {
423 name: &'static str,
424 family: LanguageFamily,
425 basis: &'static str,
426}
427
428impl LanguageTarget {
429 #[must_use]
431 pub const fn name(&self) -> &'static str {
432 self.name
433 }
434
435 #[must_use]
437 pub const fn family(&self) -> LanguageFamily {
438 self.family
439 }
440
441 #[must_use]
443 pub const fn basis(&self) -> &'static str {
444 self.basis
445 }
446}
447
448#[derive(Clone, Copy, Debug, PartialEq, Eq)]
450pub struct LanguageFixture {
451 language: &'static str,
452 source: &'static str,
453 description: &'static str,
454}
455
456impl LanguageFixture {
457 #[must_use]
459 pub const fn language(&self) -> &'static str {
460 self.language
461 }
462
463 #[must_use]
465 pub const fn source(&self) -> &'static str {
466 self.source
467 }
468
469 #[must_use]
471 pub const fn description(&self) -> &'static str {
472 self.description
473 }
474}
475
476pub const MARKUP_LANGUAGE_TARGETS: &[LanguageTarget] = &[
478 LanguageTarget {
479 name: "txt",
480 family: LanguageFamily::Markup,
481 basis: "Issue #5 degenerate plain-text container target",
482 },
483 LanguageTarget {
484 name: "Markdown",
485 family: LanguageFamily::Markup,
486 basis: "Founding issue full-document target",
487 },
488 LanguageTarget {
489 name: "HTML",
490 family: LanguageFamily::Markup,
491 basis: "Founding issue full-document target",
492 },
493];
494
495pub const PROGRAMMING_LANGUAGE_TARGETS: &[LanguageTarget] = &[
497 LanguageTarget {
498 name: "Python",
499 family: LanguageFamily::Programming,
500 basis: "TIOBE May 2026 top 10",
501 },
502 LanguageTarget {
503 name: "C",
504 family: LanguageFamily::Programming,
505 basis: "TIOBE May 2026 top 10",
506 },
507 LanguageTarget {
508 name: "Java",
509 family: LanguageFamily::Programming,
510 basis: "TIOBE May 2026 top 10",
511 },
512 LanguageTarget {
513 name: "C++",
514 family: LanguageFamily::Programming,
515 basis: "TIOBE May 2026 top 10",
516 },
517 LanguageTarget {
518 name: "C#",
519 family: LanguageFamily::Programming,
520 basis: "TIOBE May 2026 top 10",
521 },
522 LanguageTarget {
523 name: "JavaScript",
524 family: LanguageFamily::Programming,
525 basis: "TIOBE May 2026 top 10",
526 },
527 LanguageTarget {
528 name: "Visual Basic",
529 family: LanguageFamily::Programming,
530 basis: "TIOBE May 2026 top 10",
531 },
532 LanguageTarget {
533 name: "R",
534 family: LanguageFamily::Programming,
535 basis: "TIOBE May 2026 top 10",
536 },
537 LanguageTarget {
538 name: "SQL",
539 family: LanguageFamily::Programming,
540 basis: "TIOBE May 2026 top 10",
541 },
542 LanguageTarget {
543 name: "Delphi/Object Pascal",
544 family: LanguageFamily::Programming,
545 basis: "TIOBE May 2026 top 10",
546 },
547];
548
549pub const NATURAL_LANGUAGE_TARGETS: &[LanguageTarget] = &[
551 LanguageTarget {
552 name: "English",
553 family: LanguageFamily::Natural,
554 basis: "Ethnologue/Britannica total-speaker top 10",
555 },
556 LanguageTarget {
557 name: "Mandarin Chinese",
558 family: LanguageFamily::Natural,
559 basis: "Ethnologue/Britannica total-speaker top 10",
560 },
561 LanguageTarget {
562 name: "Hindi",
563 family: LanguageFamily::Natural,
564 basis: "Ethnologue/Britannica total-speaker top 10",
565 },
566 LanguageTarget {
567 name: "Spanish",
568 family: LanguageFamily::Natural,
569 basis: "Ethnologue/Britannica total-speaker top 10",
570 },
571 LanguageTarget {
572 name: "French",
573 family: LanguageFamily::Natural,
574 basis: "Ethnologue/Britannica total-speaker top 10",
575 },
576 LanguageTarget {
577 name: "Modern Standard Arabic",
578 family: LanguageFamily::Natural,
579 basis: "Ethnologue/Britannica total-speaker top 10",
580 },
581 LanguageTarget {
582 name: "Bengali",
583 family: LanguageFamily::Natural,
584 basis: "Ethnologue/Britannica total-speaker top 10",
585 },
586 LanguageTarget {
587 name: "Russian",
588 family: LanguageFamily::Natural,
589 basis: "Ethnologue/Britannica total-speaker top 10",
590 },
591 LanguageTarget {
592 name: "Portuguese",
593 family: LanguageFamily::Natural,
594 basis: "Ethnologue/Britannica total-speaker top 10",
595 },
596 LanguageTarget {
597 name: "Urdu",
598 family: LanguageFamily::Natural,
599 basis: "Ethnologue/Britannica total-speaker top 10",
600 },
601];
602
603pub const LANGUAGE_FIXTURES: &[LanguageFixture] = &[
605 LanguageFixture {
606 language: "txt",
607 source: "Plain text region\ncafe au lait\nUTF-8 line: café\n",
608 description: "Plain-text UTF-8 prose with trailing newline",
609 },
610 LanguageFixture {
611 language: "Markdown",
612 source: "# Title\n\n```rust\nfn main() {}\n```\n",
613 description: "Markdown document with embedded fenced code",
614 },
615 LanguageFixture {
616 language: "HTML",
617 source: "<script>const x = 1;</script><style>.x { color: red; }</style><p style=\"color: blue\">text</p>\n",
618 description: "HTML document with script, style, and style-attribute regions",
619 },
620 LanguageFixture {
621 language: "Python",
622 source: "def f(x):\n return x + 1\n",
623 description: "Python function with indentation",
624 },
625 LanguageFixture {
626 language: "C",
627 source: "int main(void) { return 0; }\n",
628 description: "C entry point",
629 },
630 LanguageFixture {
631 language: "Java",
632 source: "class Main { public static void main(String[] args) {} }\n",
633 description: "Java class entry point",
634 },
635 LanguageFixture {
636 language: "C++",
637 source: "int main() { return 0; }\n",
638 description: "C++ entry point",
639 },
640 LanguageFixture {
641 language: "C#",
642 source: "class C { static void Main() {} }\n",
643 description: "C# class entry point",
644 },
645 LanguageFixture {
646 language: "JavaScript",
647 source: "const value = 1;\n",
648 description: "JavaScript binding",
649 },
650 LanguageFixture {
651 language: "Visual Basic",
652 source: "Module Program\nEnd Module\n",
653 description: "Visual Basic module",
654 },
655 LanguageFixture {
656 language: "R",
657 source: "value <- 1\n",
658 description: "R assignment",
659 },
660 LanguageFixture {
661 language: "SQL",
662 source: "SELECT 1;\n",
663 description: "SQL select statement",
664 },
665 LanguageFixture {
666 language: "Delphi/Object Pascal",
667 source: "program Demo;\nbegin\nend.\n",
668 description: "Delphi/Object Pascal program",
669 },
670 LanguageFixture {
671 language: "English",
672 source: "Hawaii is a state.\n",
673 description: "English formalization sentence",
674 },
675 LanguageFixture {
676 language: "Mandarin Chinese",
677 source: "你好。\n",
678 description: "Mandarin Chinese sentence",
679 },
680 LanguageFixture {
681 language: "Hindi",
682 source: "नमस्ते।\n",
683 description: "Hindi sentence",
684 },
685 LanguageFixture {
686 language: "Spanish",
687 source: "Hawaii es un estado.\n",
688 description: "Spanish reconstruction sentence",
689 },
690 LanguageFixture {
691 language: "French",
692 source: "Hawaii est un etat.\n",
693 description: "French reconstruction sentence",
694 },
695 LanguageFixture {
696 language: "Modern Standard Arabic",
697 source: "مرحبا.\n",
698 description: "Modern Standard Arabic sentence",
699 },
700 LanguageFixture {
701 language: "Bengali",
702 source: "নমস্কার।\n",
703 description: "Bengali sentence",
704 },
705 LanguageFixture {
706 language: "Russian",
707 source: "Гавайи это штат.\n",
708 description: "Russian reconstruction sentence",
709 },
710 LanguageFixture {
711 language: "Portuguese",
712 source: "Hawaii e um estado.\n",
713 description: "Portuguese reconstruction sentence",
714 },
715 LanguageFixture {
716 language: "Urdu",
717 source: "سلام۔\n",
718 description: "Urdu sentence",
719 },
720];
721
722#[derive(Clone, Copy, Debug, PartialEq, Eq)]
724pub struct GrammarEmbeddingTarget {
725 host_language: &'static str,
726 embedded_language: &'static str,
727 trigger: &'static str,
728}
729
730impl GrammarEmbeddingTarget {
731 #[must_use]
733 pub const fn host_language(&self) -> &'static str {
734 self.host_language
735 }
736
737 #[must_use]
739 pub const fn embedded_language(&self) -> &'static str {
740 self.embedded_language
741 }
742
743 #[must_use]
745 pub const fn trigger(&self) -> &'static str {
746 self.trigger
747 }
748}
749
750pub const GRAMMAR_EMBEDDING_TARGETS: &[GrammarEmbeddingTarget] = &[
752 GrammarEmbeddingTarget {
753 host_language: "Markdown",
754 embedded_language: "Programming language region",
755 trigger: "fenced code language tag",
756 },
757 GrammarEmbeddingTarget {
758 host_language: "Markdown",
759 embedded_language: "HTML",
760 trigger: "inline or block HTML",
761 },
762 GrammarEmbeddingTarget {
763 host_language: "HTML",
764 embedded_language: "JavaScript",
765 trigger: "script element",
766 },
767 GrammarEmbeddingTarget {
768 host_language: "HTML",
769 embedded_language: "CSS",
770 trigger: "style element or style attribute",
771 },
772];