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:
@@ -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`).
|
||||
|
||||
@@ -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(0–17)`
|
||||
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(0–17)`
|
||||
konfiguriert Systemfarben/-effekte (AccessKey-/Desktop-/Menü-/Titel-
|
||||
Farben, Schatten, 3D-Effekte, Desktop-Füllzeichen) — Konstanten in der
|
||||
Konstanten-Include-Datei.
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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 0–31: 16–31 = blinkend; hg 0–7), `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 0–31: 16–31 = blinkend — bei uns als „hell"
|
||||
simuliert, Entscheidung 2026-09-02; hg 0–7), `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).
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user