Lyx - Datentypen

Diese Seite gibt einen technischen Überblick über die aktuell unterstützten Datentypen in Lyx sowie deren Implementierungsstatus im Compiler.

Aktuell unterstützte Datentypen

1. Ganzzahl-Typen (signiert)

Typ Bits Wertebereich Status Literale
`int8` 8 -128 bis 127 ✅ Full `42i8`
`int16` 16 -32,768 bis 32,767 ✅ Full `42i16`
`int32` 32 -2,147,483,648 bis 2,147,483,647 ✅ Full `42i32`
`int64` 64 -9,223,372,036,854,775,808 bis … ✅ Full `42`
`int` 64 Alias für `int64` ✅ Full `42`

2. Ganzzahl-Typen (unsigniert)

Typ Bits Wertebereich Status Literale
`uint8` 8 0 bis 255 ✅ Full `42u8`
`uint16` 16 0 bis 65,535 ✅ Full `42u16`
`uint32` 32 0 bis 4,294,967,295 ✅ Full `42u32`
`uint64` 64 0 bis 18,446,744,073,709,551,615 ✅ Full `42u64`

3. Plattform-abhängige Typen

Typ Beschreibung Status Anmerkung
`isize` Pointer-Größe (signiert) ⚠️ Partial Definiert, kaum getestet
`usize` Pointer-Größe (unsigniert) ⚠️ Partial Definiert, kaum getestet

4. Fließkomma-Typen

Typ Bits IEEE 754 Status Literale
`f32` 32 single ✅ REPARIERT `3.14`
`f64` 64 double ✅ REPARIERT `3.14`

Status: Lexer, Parser, AST und Sema implementiert. IR-Lowering derzeit Platzhalter (Dummy-Wert).

5. Zeichen- und String-Typen

Typ Beschreibung Status Literale
`char` Ein ASCII-Zeichen ✅ REPARIERT `'a'`
`pchar` Nullterminierter String ✅ Full `„hello“`
`string` Alias für `pchar` ✅ Full `„hello“`

6. Sonstige Typen

Typ Beschreibung Status Verwendung
`bool` Wahrheitswert ✅ Full `true`, `false`
`void` Kein Rückgabewert ✅ Full Funktionen

7. Interne Typen

Typ Verwendung
`atUnresolved` Temporär während Typprüfung

Status-Legende

  • Full – Parser, Sema, IR und Codegen vorhanden
  • ⚠️ Partial – Teilweise implementiert
  • Missing – Definiert, aber nicht umgesetzt
  • 🔄 WIP – Work in Progress

Implementierungsdetails

Storage-Klassen-Kompatibilität

Storage Beschreibung Status
`var` Veränderbar ✅ Integer + bool
`let` Immutable ✅ Integer + bool
`co` Runtime-readonly ✅ Funktionsfähig
`con` Compile-time constant ✅ Repariert

Getestet:

  • Integer-Typen (8–64 Bit, signed/unsigned)
  • bool
  • Funktionsrückgaben
  • automatische Integer-Konvertierung

Typkonvertierung

  • Automatisch: Integer ↔ Integer (verschiedene Breiten)
  • Explizit: Cast-Operatoren geplant
  • Constant Folding: Literale werden auf Zieltyp angepasst

Code-Generation-Status

Vollständig

  • Integer-Typen
  • `bool`, `char`, `pchar`
  • Load/Store mit korrekter Breite

Teilweise

  • `f32`, `f64` – Frontend OK, Backend fehlt
  • `isize`, `usize` – Tests fehlen

Fehlend

  • Union-Typen
  • Pointer-Arithmetik
  • Dynamische Arrays

Status-Update: HEAD-Version (0d50afd)

Erfolgreich behoben

  • Syntaxfehler (`end;` Statements) repariert
  • `con` Parser-Bug behoben
  • Bracket-Tokens `[ ]` ergänzt
  • HEAD kompiliert wieder sauber

Teststatus

  • Integer-Typen: int8..uint64 ✅
  • Boolean-Literale ✅
  • Char-Literale + Escape-Sequenzen ✅
  • Float-Literale (`3.14`) ✅
  • Array-Literal-Syntax `[1,2,3]` (Frontend) ✅
  • Storage-Klassen var/let/co/con ✅
  • Funktionsrückgaben aller primitiven Typen ✅

Bekannte Einschränkungen

Char-Literale

Vollständig implementiert:

  • Lexer `tkCharLit`
  • AST-Knoten
  • Escape-Sequenzen (`\n`, `\t`, `\\`, `\'`, `\0`)

Fließkomma-Typen

Frontend vollständig, Backend noch Platzhalter.

Array-Literale

Parser und Sema vorhanden, echter Codegen folgt.

Platform-Types

`isize`/`usize` implementiert, aber kaum getestet.

Test-Abdeckung

Vollständig getestet

  • Integer-Typen
  • bool
  • String-Literale (`pchar`)
  • Funktionsrückgaben

Nicht getestet

  • Overflow/Underflow Edge-Cases
  • Sehr große Literale
  • Cross-Architektur Verhalten von `isize`/`usize`

Roadmap

Backend-Implementierungen

  • Float-IR Backend
  • Array-IR Backend
  • Erweiterte Array-Typen

Kurzfristig

  • Float-Codegen vervollständigen
  • Tests für isize/usize
  • Integer-Overflow Tests

Mittelfristig

  • Explizite Casts (`x as int32`)
  • Structs/Records
  • Statische Arrays

Langfristig

  • Generics/Templates
  • Union-Typen
  • Smart-Pointer

Beispiele

var a: int8 := 127;
let b: uint16 := 65535;
con d: int64 := 9223372036854775807;
 
var pi: f32 := 3.14159;
let e: f64 := 2.718281828;
 
var ch: char := 'X';
let msg: pchar := "Hello";
 
var flag: bool := true;
 
fn get_byte(): uint8 { return 255; }
fn get_flag(): bool { return true; }
fn do_nothing(): void { print_str("done"); }