Change "baseline-phasen-0-1" (Explore/Retrofit des umgesetzten Stands), per Archiv in die Haupt-Specs uebernommen und validiert: - sprach-frontend (6 Requirements: Lexik, Literal-Typisierung, Anweisungs-Grammatik, Semantik, Non-Feature-Abweisung, Diagnostik) - laufzeitfehler (2: Katalog 1-480, Unprintable error) - textbildschirm (5: dynamische Groesse, PRINT/Scroll, Cursor-API, Farbpalette/Blink, Unicode-Zellenmodell) - kompat-testkorpus (2: byte-genaue Sollausgaben, Frontend-Meilenstein) Workflow ab jetzt je Phase: Explore -> Proposal -> Umsetzung -> Archiv. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
5.3 KiB
sprach-frontend Specification
Purpose
Das Sprach-Frontend übersetzt Terminal-Basic-Quelltext (VBDOS-kompatibler Dialekt) in einen typgeprüften AST: Lexer, fehlertoleranter Parser und semantische Analyse mit Diagnostik nach den Meldungstexten des Vorbilds.
Requirements
Requirement: Lexikalische Analyse nach Sprachreferenz
Der Lexer SHALL Quelltext gemäß docs/sprachreferenz.md §1 zerlegen:
Typ-Suffixe (% & ! # $ @) an Bezeichnern und Literalen, case-insensitive
Keywords (Bibliotheksnamen bleiben Bezeichner), '/REM-Kommentare,
:-Anweisungstrenner, Zeilenfortsetzung mit _, Hex- (&H) und
Oktal-Literale (&O), ""-Escape in Strings sowie die Metabefehle
'$INCLUDE, '$STATIC, '$DYNAMIC.
Scenario: Suffix trennt Bibliotheksfunktion von Keyword
- WHEN der Lexer
STRING$undSTRINGliest - THEN wird
STRING$als Bezeichner (Builtin) undSTRINGals Typ-Keyword erkannt
Scenario: Zeilenfortsetzung
- WHEN eine Zeile nach Leerraum mit
_endet - THEN wird die Folgezeile ohne Zeilenende-Token angeschlossen
Requirement: Literal-Typisierung
Der Lexer SHALL numerische Literale typisieren: Ganzzahlen INTEGER → LONG
→ Gleitkomma nach Wertebereich; E-Exponent → SINGLE, D-Exponent →
DOUBLE; Suffixe erzwingen den Typ (Überlauf → Diagnose „Overflow");
Dezimalpunkt-Literale bis 7 signifikante Stellen → SINGLE, darüber →
DOUBLE (Projektentscheidung 2026-09-02); @-Literale als
Currency-Festkomma ×10 000.
Scenario: Schwelle SINGLE/DOUBLE
- WHEN die Literale
1.5und3.14159265gelext werden - THEN ist
1.5SINGLE und3.14159265DOUBLE
Requirement: Vollständige Anweisungs-Grammatik
Der Parser SHALL den Anweisungssatz des Dialekts in einen AST überführen,
darunter: Zuweisung inkl. MID$-Anweisung, PRINT/LPRINT (mit
USING/#-Datei, ?-Kurzform), INPUT/LINE INPUT, IF (Block und
einzeilig, THEN zeilennummer), SELECT CASE (Werte, TO-Bereiche,
IS-Vergleiche, CASE ELSE), FOR/DO/WHILE-Schleifen mit EXIT,
GOTO/GOSUB/RETURN/ON … GOTO|GOSUB, ON [LOCAL] ERROR/RESUME,
DIM/REDIM/ERASE/CONST/DEFtype/OPTION/TYPE…END TYPE/
DECLARE/SUB/FUNCTION/CALL, COMMON/SHARED/STATIC,
DATA/READ/RESTORE, DEF FN (einzeilig und Blockform),
VIEW PRINT, NAME … AS, Ereignissteuerung (TIMER/KEY(n)/UEVENT ON|OFF|STOP) sowie die komplette Datei-E/A-Grammatik (OPEN in beiden
Syntaxen inkl. ISAM-/ACCESS-/LOCK-Klauseln, CLOSE, FIELD,
GET/PUT, LSET/RSET, WRITE, SEEK, LOCK/UNLOCK).
Zeilennummern und Labels am Zeilenanfang SHALL als Sprungziele erfasst
werden.
Scenario: Blockstrukturen über mehrere Zeilen
- WHEN ein
SELECT CASEmitCASE 1: PRINT "eins"undCASE ELSEgeparst wird - THEN entsteht ein Select-Knoten mit zwei Armen und Inline-Anweisungen im ersten Arm
Scenario: Fehlertoleranz je Anweisung
- WHEN eine Anweisung einen Syntaxfehler enthält
- THEN wird eine Diagnose mit Position gesammelt, bis zum Anweisungsende synchronisiert und die Folgeanweisung normal geparst
Requirement: Semantische Prüfung
Die Semantik SHALL prüfen: Typkompatibilität (numerisch ↔ numerisch,
String ↔ String; sonst „Type mismatch"), implizite Deklaration bei
Erstverwendung (Suffix-getrennte Variablen), DEFtype-Buchstabenbereiche,
OPTION EXPLICIT („Variable not defined"), Arrays (implizit, DIM,
REDIM; doppelte explizite Deklaration → „Duplicate definition"),
UDT-Feldzugriffe (kunde.name mit Feldtyp; unbekanntes Feld → „Element
not defined"), SHARED-Import von Modulvariablen in Prozeduren,
Konstantenfaltung für CONST (nicht konstant → „Invalid constant"),
Sprungziele („Label not defined") sowie Prozedur- und Builtin-Signaturen
(Anzahl → „Argument-count mismatch", Typen).
Scenario: Typkonflikt
- WHEN
a$ = 1geprüft wird - THEN wird „Type mismatch" mit Quelltextposition gemeldet
Scenario: UDT-Feldtyp
- WHEN ein
TYPEmit FeldName AS STRING * 30deklariert ist undk.Name = 5geprüft wird - THEN wird „Type mismatch" gemeldet
Requirement: Compile-Zeit-Abweisung deklarierter Non-Features
Die Semantik MUST jede Verwendung der in docs/sprachreferenz.md
(„Abweichungen") deklarierten Non-Features — Hardware-Nähe (PEEK,
POKE, INP, OUT, WAIT, BLOAD/BSAVE, VARPTR-Familie, CALL ABSOLUTE/INTERRUPT, IOCTL), CHAIN, Grafik-Anweisungen, SOUND/
PLAY und die Event-Geräte COM/PEN/PLAY/STRIG — zur Compile-Zeit
mit der Meldung „Feature unavailable" abweisen. Dokumentierte Features
außerhalb dieser Liste MUST NOT abgewiesen werden (Guiding Principle).
Scenario: Hardware-Zugriff
- WHEN
POKE 100, 1oderx = PEEK(100)kompiliert wird - THEN erscheint die Compile-Diagnose „Feature unavailable"
Requirement: Diagnostik mit Vorbild-Meldungen
Diagnosen SHALL exakte 1-basierte Quelltextpositionen (Zeile, Spalte) tragen; die Meldungstexte SHALL dem Katalog des Vorbilds folgen, wo eine Entsprechung existiert (z. B. „Type mismatch", „Duplicate definition", „Label not defined", „Subprogram not defined", „Overflow").
Scenario: Position in der Diagnose
- WHEN in Zeile 3 ein Typkonflikt auftritt
- THEN nennt die Diagnose Zeile 3 und die Spalte des Ausdrucks