Phase 1 vollstaendig abgeschlossen; neue Vorgaben verankert

Frontend-Vervollstaendigung (keine offenen Punkte mehr in Phase 1):
- MID$-Anweisung, DEF-FN-Blockform, COMMON/SHARED/STATIC,
  LPRINT, VIEW PRINT, NAME AS, LOCK/UNLOCK, Ereignissteuerung
  (TIMER/KEY(n)/UEVENT ON|OFF|STOP), Metabefehle $INCLUDE/$STATIC/$DYNAMIC
- Komplette Datei-E/A-Grammatik: OPEN (beide Syntaxen, inkl. ISAM- und
  ACCESS/LOCK-Klauseln), CLOSE, FIELD, GET/PUT, LSET/RSET, WRITE, SEEK
- Semantik: UDT-Feldtypen, SHARED-Import von Modulvariablen,
  Konstantenfaltung (Invalid constant), OPTION BASE erfasst
- Non-Features konsistent zur Compile-Zeit abgewiesen: Hardware-Naehe,
  CHAIN, Grafik-Anweisungen, SOUND/PLAY ("Feature unavailable")
- 33 Frontend-Tests, Korpus-Meilenstein weiter gruen

Neue Vorgaben:
- Stufe-2-Ideen: SQLite/Embedded-SQL mit Record-Buffern; Runtime-
  Bibliotheken (z.B. crossterm) als BASIC-Bibliotheken
- Erster Kompatibilitaetstest: github.com/cout/vbdos (extern, wird nicht
  einvendort); binaer-.FRM-Konverter als Phase-4-Aufgabe (tbc convert-frm)
- Doku als Definition of Done: docs/ = Ist-Dokumentation, IDE-Hilfe
  rendert Markdown dynamisch zur Fenstergroesse (Phase-5-Aufgabe)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-02 09:30:44 +02:00
parent 333e794540
commit d77574d9de
6 changed files with 1059 additions and 165 deletions

90
PLAN.md
View File

@@ -55,7 +55,24 @@ Konvention: `[ ]` offen · `[x]` erledigt · `[~]` in Arbeit
Toolchain beim Anwender (vorkompilierter Runner + angehängtes `.tbc`) —
damit bleibt auch der Weg zum verteilbaren Binary im Sekundenbereich.
- **Jede Phase endet mit lauffähigen Tests** gegen eine wachsende
Kompatibilitäts-Testsuite (Verzeichnis `tests/compat`, geplant).
Kompatibilitäts-Testsuite (Verzeichnis `tests/compat`).
- **Erster Kompatibilitätstest — externes Programmkorpus** (2026-09-02):
Die Programme aus https://github.com/cout/vbdos (insb. der Ordner
`microsoft/`) müssen — soweit sie keine deklarierten Non-Features
(PEEK/POKE/CALL INTERRUPT …) nutzen — **erfolgreich kompilieren und
nutzbar sein**. Das Repo wird nicht einvendort (Lizenzlage), sondern vom
Test-Harness bei Bedarf geklont. Aufgaben: Frontend-Check ab Phase 1,
Lauffähigkeit Konsole in Phase 3, Forms in Phase 4 (Meilenstein dort);
binäre `.FRM`-Dateien erfordern ein Konvertierungstool → Phase 4.
- **Dokumentation ist Teil der Definition of Done** (2026-09-02): Im
`docs/`-Ordner entsteht die vollständige Dokumentation der Sprache und
der Bibliothek **so wie implementiert** (Ist-Stand): jede Phase
schreibt docs/sprachreferenz.md fort und pflegt eine
Bibliotheksreferenz (`docs/bibliothek.md`, entsteht mit Phase 3) mit
jeder implementierten Anweisung/Funktion. Diese Markdown-Dokumente sind
zugleich der Inhalt des IDE-Hilfesystems (Phase 5): Anzeige unter
„Help" mit Konsolen-Markdown-Rendering, Umbruch dynamisch nach
aktueller Fenstergröße.
---
@@ -154,31 +171,45 @@ tatsächlichen Größe; `tb-ui::screen` unterstützt `resize()`.
VM-Ticks — ist Eingangsaufgabe von Phase 4.)
## Phase 1 — Sprach-Frontend (`tb-frontend`)
**Status: abgeschlossen (2026-09-02).**
- [x] Lexer inkl. Typ-Suffixe, Zeilennummern/Labels, `REM`/`'`-Kommentare,
case-insensitive Keywords, Zeilenfortsetzung mit `_`, Hex-/Oktal-
Literale, Literal-Typisierung
Literale, Literal-Typisierung, Metabefehle (`$INCLUDE`, `$STATIC`,
`$DYNAMIC`)
- [x] SINGLE/DOUBLE-Schwelle suffixloser Dezimalpunkt-Literale entschieden
(> 7 signifikante Stellen → DOUBLE) und in docs/sprachreferenz.md §1
dokumentiert
- [x] AST für Module, Prozeduren, Anweisungen, Ausdrücke, Deklarationen
- [~] Parser (zeilenorientiert, fehlertolerant — Fehler pro Anweisung
gesammelt, Synchronisation bis Anweisungsende). Kern komplett:
Zuweisung, PRINT (inkl. USING/#), INPUT/LINE INPUT, IF (Block +
einzeilig), SELECT CASE, FOR/DO/WHILE, GOTO/GOSUB/ON-GOTO,
ON [LOCAL] ERROR/RESUME, DIM/REDIM/CONST/DEFtype/OPTION/TYPE/
DECLARE/SUB/FUNCTION/CALL, DATA/READ/RESTORE, DEF FN (einzeilig).
Offen: MID$-Anweisung, DEF FN-Blockform, Datei-E/A-Anweisungen
(werden als Platzhalter geparst → Phase 3), `$INCLUDE`-Metabefehl
- [~] Semantik: Symboltabellen, implizite Deklaration, `DEFtype`-Regeln,
Typprüfung, `OPTION EXPLICIT`, Arrays (implizit/DIM/REDIM),
Builtin-Signaturen, Label-Prüfung, Prozedur-Signaturprüfung.
Offen: `COMMON`/`SHARED` über Prozedurgrenzen, UDT-Feldtypen,
`OPTION BASE`-Auswertung, Konstantenfaltung
- [~] Diagnostik mit exakten Positionen; Meldungstexte am Vorbild
orientiert (Type mismatch, Duplicate definition, Label not defined …)
— vollständiger Abgleich mit den Compile-Meldungen des Vorbilds offen
- [x] Parser (zeilenorientiert, fehlertolerant — Fehler pro Anweisung
gesammelt, Synchronisation bis Anweisungsende): Zuweisung inkl.
MID$-Anweisung, PRINT/LPRINT (inkl. USING/#), INPUT/LINE INPUT,
IF (Block + einzeilig), SELECT CASE, FOR/DO/WHILE,
GOTO/GOSUB/ON-GOTO, ON [LOCAL] ERROR/RESUME, DIM/REDIM/CONST/
DEFtype/OPTION/TYPE/DECLARE/SUB/FUNCTION/CALL, COMMON/SHARED/STATIC,
DATA/READ/RESTORE, DEF FN (einzeilig + Blockform), VIEW PRINT,
NAME…AS, Ereignissteuerung (`TIMER/KEY(n)/… ON|OFF|STOP`), komplette
Datei-E/A-Grammatik (OPEN in beiden Syntaxen inkl. ISAM-Klausel,
CLOSE, FIELD, GET/PUT, LSET/RSET, WRITE, SEEK, LOCK/UNLOCK)
- [x] Semantik: Symboltabellen, implizite Deklaration, `DEFtype`-Regeln,
Typprüfung, `OPTION EXPLICIT`/`BASE`, Arrays (implizit/DIM/REDIM),
UDT-Feldtypen (`kunde.name`), `SHARED`-Import von Modulvariablen,
`COMMON`, Konstantenfaltung (`CONST`, „Invalid constant"),
Builtin-Signaturen, Label-Prüfung, Prozedur-Signaturprüfung;
deklarierte Non-Features (Hardware-Nähe, CHAIN, Grafik, SOUND/PLAY)
werden zur Compile-Zeit mit „Feature unavailable" abgewiesen
- [x] Diagnostik mit exakten Positionen; Meldungstexte folgen dem Katalog
des Vorbilds (Type mismatch, Duplicate definition, Label not
defined, Feature unavailable, Invalid constant …). Neue Meldungen
entstehen mit dem jeweiligen Feature (Teil der Definition of Done)
- [x] Meilenstein: kompletter Testkorpus parst und wird typgeprüft
(`crates/tb-frontend/tests/corpus.rs`)
(`crates/tb-frontend/tests/corpus.rs`; 33 Frontend-Tests)
Vollständigkeits-Hinweis: Die Sprachabdeckung wird in Phase 3 per
Inventar systematisch gegen die Original-Hilfe abgeglichen; dort
gefundene Frontend-Lücken sind Bugs im Sinne des Guiding Principle und
werden sofort geschlossen (kein Wiedereröffnen der Phase nötig).
## Phase 2 — Bytecode und VM (`tb-vm`)
- [ ] Eingangsaufgabe (aus Phase 0 übernommen): Bytecode-**Feindesign** —
@@ -247,6 +278,13 @@ Leitplanke Vollständigkeit); die Aufzählungen unten sind Beispiele.
- [ ] `.FRM`-Textformat: Serialisierung **definieren** (kein Original-
Beispiel verfügbar — Windows-1.0-Schema, siehe dateiformate.md),
dokumentieren, dann lesen/schreiben implementieren
- [ ] Konvertierungstool binäre `.FRM` → unsere Text-Serialisierung
(Gegenstück zu FT.EXE des Vorbilds; Magic `FC 08 01 00`): als
`tbc convert-frm`. Format per Reverse Engineering aus den
Beispieldateien des Originalpakets und des cout/vbdos-Repos
- [ ] Meilenstein (erster Kompatibilitätstest): die Programme aus
https://github.com/cout/vbdos ohne Non-Features kompilieren und
sind nutzbar (Konsolenprogramme bereits ab Phase 3)
- [ ] Ereignisdispatch: Event-Queue ↔ VM (Ereignisprozeduren `Name_Ereignis`)
- [ ] Meilenstein: Beispiel-Formularprogramme aus dem Testkorpus laufen
@@ -261,6 +299,11 @@ Leitplanke Vollständigkeit); die Aufzählungen unten sind Beispiele.
- [ ] Ausführen aus der IDE: Start/Unterbrechen/Fortsetzen/Neustart
- [ ] Debugger: Breakpoints, Einzelschritt/Prozedurschritt, Direktfenster,
Überwachungsausdrücke
- [ ] Hilfe-System: rendert die Markdown-Dokumentation aus `docs/`
(Sprach- und Bibliotheksreferenz) im Help-Fenster — Konsolen-
Markdown-Rendering mit Umbruch nach aktueller Fenstergröße,
Hyperlink-Navigation wie im Vorbild (Tab/Enter/Alt+F1), F1 =
kontextsensitiver Sprung zum Thema unter dem Cursor
- [ ] Meilenstein: Programm komplett in der IDE schreiben, gestalten,
debuggen und ausführen
@@ -291,6 +334,15 @@ bleibt gültig. Noch nichts davon ist beschlossen; Sammlung wächst:
Forms-Engine
- Standardbibliothek: Prozessaufrufe mit Pipes, Umgebungs-/Argument-Handling
für CLI-Tools, JSON/CSV, HTTP-Client, Pfad-/Verzeichnisfunktionen
- **SQLite-Integration mit Embedded SQL** (2026-09-02): Spracherweiterung
für eingebettetes SQL — z. B. `WHILE SELECT … / WEND`-Konstrukte —
mit Record-Buffer-Datentypen, auf denen `SELECT`/`UPDATE`/`INSERT`/
`DELETE` arbeiten (natürliche Weiterentwicklung der ISAM-Idee auf
SQLite als Speicher)
- **Runtime-Bibliotheken als BASIC-Bibliotheken** (2026-09-02): in der
Runtime integrierte Rust-Bibliotheken (z. B. crossterm für direkte
Terminalsteuerung) als eigene, importierbare Bibliotheken für
BASIC-Programme bereitstellen
- Verteilung: `tbc build --exe` als Single-File-Tool-Baukasten
---