Phase 1: Sprach-Frontend (Lexer, AST, Parser, Semantik) + Entscheidungen

Frontend:
- Lexer komplett: Typ-Suffixe, Literal-Typisierung (Entscheidung: > 7
  signifikante Stellen -> DOUBLE), Hex/Oktal, Zeilenfortsetzung mit _,
  Strings mit ""-Escape, case-insensitive Keywords (Bibliotheksnamen
  bleiben Bezeichner)
- AST fuer Module/Prozeduren/Anweisungen/Ausdruecke
- Parser: fehlertolerant, zeilenorientiert; Kern-Anweisungssatz inkl.
  Bloecke, ON [LOCAL] ERROR, DEF FN (einzeilig); Datei-E/A als
  Phase-3-Platzhalter
- Semantik: Symboltabellen, implizite Deklaration, DEFtype, OPTION
  EXPLICIT, Arrays, Builtin-Signaturen, Labelpruefung; Hardware-Features
  (PEEK/POKE/...) werden zur Compile-Zeit abgewiesen
- Meilenstein: Testkorpus parst und wird typgeprueft (corpus.rs); 27 Tests

Entscheidungen eingearbeitet:
- Binaries heissen tb (IDE) und tbc (Compiler)
- Dynamische Terminalgroesse statt 80x25 (Minimum 80x25, btop-artiger
  Hinweis darunter); tb-ui::screen mit resize(), Spike angepasst
- Vollstaendigkeits-Leitplanke: 100% Sprache/Stdlib minus deklarierte
  Non-Features; Original-Doku als Guiding Principle; Inventar-Aufgabe
- CURRENCY als i64-Festkomma; ISAM wird implementiert; breite Zeichen
  belegen 2 Zellen; GET/PUT-Strings als UTF-32; Blink als hell simuliert
- LICENSE: MIT

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-02 09:16:01 +02:00
parent 8002ac2388
commit 333e794540
21 changed files with 3799 additions and 138 deletions

View File

@@ -61,8 +61,16 @@ Reine Textdatei ohne Kopfzeile, **eine Projektdatei pro Zeile**
(`.BAS`/`.FRM`; belegt durch die Originalbeispiele). Terminal Basic
akzeptiert zusätzlich Kommentarzeilen mit `'`.
## Record-Dateien (`GET`/`PUT`, `OPEN … FOR RANDOM`)
Feste Strings (`STRING * n`) in Records werden als **UTF-32LE** gespeichert
(4 Bytes pro Zeichen → feste Record-Länge bleibt erhalten). Entscheidung
2026-09-02: Die Binärdateien sind damit bewusst inkompatibel zu Dateien
des Vorbilds; numerische Felder behalten ihr klassisches Layout
(INTEGER i16, LONG i32, SINGLE f32, DOUBLE f64, CURRENCY i64, little-endian).
## Kompilat: `.tbc` (neu, eigenes Format)
Container für TBVM-Bytecode, Entwurf in [tbvm-design.md](tbvm-design.md).
`tbdosc build` erzeugt wahlweise `.tbc` oder ein eigenständiges Executable
`tbc build` erzeugt wahlweise `.tbc` oder ein eigenständiges Executable
(Runner + eingebettetes `.tbc`).

View File

@@ -139,8 +139,9 @@ DragOver-State 0 Enter · 1 Leave · 2 Over. Bei Steuerelement-Arrays steht
## SCREEN-Objekt
Eigenschaften: ActiveControl, ActiveForm, AutoRedraw, ControlPanel,
Height, Width (Zeichen, read-only), MousePointer. Methoden: HIDE, SHOW
(alle sichtbaren Formulare ein-/ausblenden). `SCREEN.ControlPanel(017)`
Height, Width (Zeichen, read-only — bei uns die **aktuelle Terminalgröße**,
Abweichung: das Vorbild lieferte fest 25/43/50 × 80), MousePointer.
Methoden: HIDE, SHOW (alle sichtbaren Formulare ein-/ausblenden). `SCREEN.ControlPanel(017)`
konfiguriert Systemfarben/-effekte (AccessKey-/Desktop-/Menü-/Titel-
Farben, Schatten, 3D-Effekte, Desktop-Füllzeichen) — Konstanten in der
Konstanten-Include-Datei.

View File

@@ -149,7 +149,7 @@ Die Umgebung führt P-Code-übersetzte Zeilen sofort aus; der separate
Compiler erzeugt native EXEs (wahlweise standalone oder mit Runtime-Modul).
Nur die Umgebung hat: Immediate Window, Watches/Watchpoints, Breakpoints,
Stepping, History-Trace, Set Next Statement, automatische Bereichs-/
Überlaufprüfungen. → Terminal Basic: `tbdos` (IDE) und `tbdosc`
Überlaufprüfungen. → Terminal Basic: `tb` (IDE) und `tbc`
(Standalone-Compiler) teilen sich dieselbe TBVM, damit es — anders als im
Vorbild — **keine** Verhaltensunterschiede zwischen IDE-Lauf und
kompiliertem Programm gibt (dokumentierte Abweichung, gewollt).
@@ -162,6 +162,9 @@ kompiliertem Programm gibt (dokumentierte Abweichung, gewollt).
F12/Shift+F12-Wechsel bleibt erhalten.
3. Zeilenweises Syntax-Checking mit Formatierung/Normalisierung ist
Editor-Standard (abschaltbar wie im Vorbild).
4. IDE-Lauf und `tbdosc`-Kompilat verhalten sich identisch (gleiche TBVM).
4. IDE-Lauf und `tbc`-Kompilat verhalten sich identisch (gleiche TBVM).
5. MS-DOS-spezifische Toolbox-Controls (Dir/Drive/File List) werden als
plattformneutrale Datei-Browser-Controls nachgebildet.
6. **Dynamische Terminalgröße** (2026-09-02): die IDE nutzt das gesamte
Terminal — Desktop, Fensterverwaltung und Formulare passen sich an;
Mindestgröße 80×25, darunter nur ein Hinweis (btop-artig).

View File

@@ -11,7 +11,11 @@ Details, `ener.hlp` Fehlermeldungen; Vergleich PDS 7.1: `bas7qck.hlp`)
sowie das Original-README der Professional Edition. Aussagen ohne
TODO-Markierung sind daraus belegt.
**Bewusste Abweichungen vom Vorbild** stehen am Ende des Dokuments.
**Guiding Principle:** Die Original-Dokumentation führt. Jedes dort
dokumentierte Sprachelement wird unterstützt oder — nur nach expliziter
Non-Feature-Entscheidung des Projektinhabers — mit einer klaren
Fehlermeldung abgewiesen. **Bewusste Abweichungen und Non-Features**
stehen am Ende dieses Dokuments; nur diese Liste rechtfertigt Abweisungen.
---
@@ -40,10 +44,12 @@ TODO-Markierung sind daraus belegt.
hexadezimal `&HFF`, oktal `&O777`; Suffixe erzwingen den Typ (`10%`, `10&`,
`1.5!`, `1.5#`, `2.5@`). Ohne Suffix gilt: Ganzzahl im INTEGER-Bereich →
INTEGER; Hex/Oktal ohne `&`-Suffix → 16 Bit (INTEGER), mit `&` → LONG;
`E`-Exponent → SINGLE, `D`-Exponent → DOUBLE; Dezimalpunkt-Wert
SINGLE, bei mehr als 15 Stellen DOUBLE (TODO: exakte Schwelle — Quelle
an der Stelle widersprüchlich); Ganzzahl außerhalb des LONG-Bereichs
wird Gleitkommawert (kein Fehler).
`E`-Exponent → SINGLE, `D`-Exponent → DOUBLE; Dezimalpunkt-Wert:
**Entscheidung (2026-09-02):** bis 7 signifikante Stellen → SINGLE,
darüber → DOUBLE. (Die Original-Hilfe nennt widersprüchlich eine
15-Stellen-Schwelle, die SINGLE-Präzision verlöre; wir legen die Schwelle
auf die SINGLE-Genauigkeit — präzisionserhaltende Auslegung.)
Ganzzahl außerhalb des LONG-Bereichs wird Gleitkommawert (kein Fehler).
- **String-Literale:** `"…"`; doppeltes `""` ergibt ein Anführungszeichen.
## 2. Typsystem
@@ -188,9 +194,12 @@ solange ein Menü-Control den Fokus hat. Für Terminal Basic relevant:
- `INKEY$` (nicht blockierend; "" wenn leer; erweiterte Tasten:
2-Zeichen-Sequenz `CHR$(0)+code` im Vorbild — Abweichung s. u.),
`INPUT$(n [,#f])`.
- `LOCATE [zeile][,spalte][,cursor an/aus][,start,ende]`, `CSRLIN`, `POS(0)`.
- `COLOR [vg][,hg]` (vg 031: 1631 = blinkend; hg 07), `CLS`,
`WIDTH` (80/40 — wir: nur 80), `VIEW PRINT oben TO unten` (Scrollbereich).
- `LOCATE [zeile][,spalte][,cursor an/aus][,start,ende]`, `CSRLIN`, `POS(0)`
— arbeiten auf der tatsächlichen Bildschirmgröße (dynamisch, s. Abweichungen).
- `COLOR [vg][,hg]` (vg 031: 1631 = blinkend — bei uns als „hell"
simuliert, Entscheidung 2026-09-02; hg 07), `CLS`,
`WIDTH` (im Vorbild 80/40 — bei uns wirkungslos, s. Abweichungen),
`VIEW PRINT oben TO unten` (Scrollbereich).
- `TAB(n)`, `SPC(n)` in PRINT-Listen.
- `BEEP`, `SOUND freq, dauer` (Terminal-Bell / Nicht-Ziel, s. Abweichungen),
`PLAY` (Nicht-Ziel).
@@ -211,6 +220,9 @@ solange ein Menü-Control den Fokus hat. Für Terminal Basic relevant:
`LOC(n)`, `LOF(n)`.
- Verwaltung: `NAME alt$ AS neu$`, `KILL datei$`, `FILES [muster$]`,
`CHDIR`, `MKDIR`, `RMDIR`, `FILEATTR`, `FREEFILE`.
- **ISAM** (Professional-Edition des Vorbilds): wird unterstützt
(Entscheidung 2026-09-02) — `OPEN … FOR ISAM`, Tabellen/Indizes,
`SEEKGT`-Familie usw.; Umfang wird mit dem Inventar (Phase 3) erfasst.
- Pfade: plattformneutral; `/` und `\` werden akzeptiert.
## 11. Eingebaute Funktionen (Katalog)
@@ -267,9 +279,15 @@ Dialoge:
- String-Vergleich codepoint-weise (keine CP437-Sortierung).
- Der Bildschirmpuffer speichert Unicode-Zeichen; Rahmen werden mit
Unicode-Box-Drawing gezeichnet.
- Zeichen mit Darstellungsbreite ≠ 1: offen (siehe PLAN.md).
2. **Keine Hardware-Nähe:** `PEEK`/`POKE`/`INP`/`OUT`/`CALL ABSOLUTE`/
Interrupts lösen Fehler 73 (Feature unavailable) aus.
- Zeichen mit Darstellungsbreite 2 (Emoji, CJK) **belegen zwei Zellen**
(Entscheidung 2026-09-02; Umsetzung Phase 3).
- `GET`/`PUT`-Records: feste Strings (`STRING * n`) werden als **UTF-32**
gespeichert (4 Bytes/Zeichen, feste Record-Länge) — Binärdateien sind
dadurch bewusst inkompatibel zum Vorbild (Entscheidung 2026-09-02).
2. **Keine Hardware-Nähe** (bestätigt 2026-09-02): `PEEK`/`POKE`/`INP`/
`OUT`/`WAIT`/`BLOAD`/`BSAVE`/`VARPTR`/`VARSEG`/`SADD`/`CALL ABSOLUTE`/
`CALL INTERRUPT`/`IOCTL` werden bereits **zur Compile-Zeit** mit der
Meldung „Feature unavailable" abgewiesen (kein Laufzeitfehler).
3. **`INKEY$` für erweiterte Tasten** liefert weiterhin
`CHR$(0) + code`-Sequenzen mit den klassischen Scancodes (F1 = `CHR$(0)+";"`
usw.), damit bestehender Code funktioniert. Zusätzliche moderne Tasten:
@@ -282,4 +300,8 @@ Dialoge:
„Invalid when forms are showing") — wir übernehmen nur den
Forms-/Textmodus-Zweig.
6. **`PLAY`/`SOUND`**: `BEEP` = Terminal-Bell; Rest Nicht-Ziel (Fehler 73).
7. **`WIDTH 40`** wird nicht unterstützt (nur 80×25).
7. **Dynamische Bildschirmgröße** (2026-09-02): kein festes 80×25 — der
Bildschirm folgt der Terminalgröße (Mindestgröße 80×25, darunter nur
ein Hinweis). `CSRLIN`/`POS`/`LOCATE`/`VIEW PRINT` und das
`SCREEN`-Objekt arbeiten auf der tatsächlichen Größe. `WIDTH 40/80`
wird akzeptiert, ändert aber nichts (die Größe bestimmt das Terminal).

View File

@@ -1,7 +1,7 @@
# TBVM — Designentwurf
Eigene Stack-basierte Bytecode-VM (Entscheidung siehe PLAN.md, 0.2).
Die VM ist in `tbdos` (IDE) und in von `tbdosc` erzeugte Executables
Die VM ist in `tb` (IDE) und in von `tbc` erzeugte Executables
eingebettet — identischer Code, identisches Verhalten, schneller Turnaround.
## Werte-Modell
@@ -72,7 +72,7 @@ Format bleibt stabil und dokumentiert).
## Eigenständige Executables
`tbdosc build --exe` kopiert den vorkompilierten Runner (dieselbe
`tbc build --exe` kopiert den vorkompilierten Runner (dieselbe
tb-vm/tb-runtime/tb-ui-Bibliothek wie die IDE) und hängt das `.tbc` als
Ressource an (Anhängen ans Binary + Fußzeile mit Offset/Magic; portabel für
alle drei Plattformen). Alternative — `include_bytes!` + Cargo-Build beim