zerodds-lang-cst

Concrete syntax trees for the 21 target languages of Language::ALL. Built, never parsed; typed construction with no string escape hatch.

Concrete syntax trees for the 21 target languages of Language::ALL (src/common.rs), one module per language: Rust, C++, C, Java, C#, Python, TypeScript, Go, OCaml, Ada, D, Elixir, Julia, Lua, Nim, Swift, Zig, Node, Ada 83, F#, Kotlin.

These trees are built, never parsed. A generator produces one and a renderer writes it out; nothing reads target-language text back in.

Two properties the trees exist for:

  • Concrete, not abstract. The tree records what will be written. If the output derives Debug and Clone, that is two derive nodes in a recorded order — not a flag a renderer expands, because a renderer that expands flags is a renderer that makes decisions.
  • Typed construction. There is no constructor that takes a fragment of target-language text. A string escape hatch is how language-specific logic leaks back out of the rules and into the emitter.

There is deliberately no shared target model. Rust has attributes and derives, C++ has namespaces and templates, C has neither and has typedefs, Java has annotations and type parameters. A model that pretended they were the same would push the difference into the renderer, where it stops being reviewable.

Position

Specification

docs/specs/zerodds-lang-cst-1.0.md §1.

zerodds-lang-cst

Konkrete Syntaxbäume für die 21 Zielsprachen von Language::ALL. Gebaut, nie geparst; typisierte Konstruktion ohne Ausweg über Strings.

Konkrete Syntaxbäume für die 21 Zielsprachen von Language::ALL (src/common.rs), ein Modul je Sprache: Rust, C++, C, Java, C#, Python, TypeScript, Go, OCaml, Ada, D, Elixir, Julia, Lua, Nim, Swift, Zig, Node, Ada 83, F#, Kotlin.

Diese Bäume werden gebaut, nie geparst. Ein Generator erzeugt einen, ein Renderer schreibt ihn aus; nichts liest Text der Zielsprache wieder ein.

Zwei Eigenschaften, für die es die Bäume gibt:

  • Konkret, nicht abstrakt. Der Baum hält fest, was geschrieben wird. Wenn die Ausgabe Debug und Clone ableitet, sind das zwei Derive-Knoten in festgehaltener Reihenfolge — kein Flag, das ein Renderer expandiert, denn ein Renderer, der Flags expandiert, trifft Entscheidungen.
  • Typisierte Konstruktion. Es gibt keinen Konstruktor, der ein Stück Text der Zielsprache nimmt. Ein Ausweg über Strings ist der Weg, auf dem sprachspezifische Logik aus den Regeln zurück in den Emitter sickert.

Ein gemeinsames Zielmodell gibt es absichtlich nicht. Rust hat Attribute und Derives, C++ hat Namensräume und Templates, C hat beides nicht und hat Typedefs, Java hat Annotationen und Typparameter. Ein Modell, das so täte, als wären sie gleich, schöbe den Unterschied in den Renderer, wo er sich nicht mehr prüfen lässt.

Stellung

Spezifikation

docs/specs/zerodds-lang-cst-1.0.md §1.