## ADDED Requirements ### Requirement: Objektzugriffe in Grammatik und Semantik Der Parser SHALL Punktpfade auf Formulare und Steuerelemente (`objekt.eigenschaft`), den Container-Operator `form!steuerelement[.eigenschaft]`, `IF TYPEOF ausdruck IS klasse`, den Metabefehl `$FORM` und die Datentypen `FORM` und `CONTROL` als Parametertypen erkennen. Die Semantik SHALL Eigenschaften gegen die Klasse des Objekts prüfen und ihren Typ bestimmen. Ein Punktpfad, dessen Basis weder ein benutzerdefinierter Typ noch ein bekanntes Objekt ist, MUST eine Diagnose erzeugen, die Basis und Eigenschaft namentlich nennt; er MUST NOT zu einer impliziten Variablen mit Punkt im Namen werden. #### Scenario: Unbekanntes Objekt wird benannt - **WHEN** ein Modul `Text9.Text = "a"` ohne Steuerelement `Text9` enthält - **THEN** nennt die Diagnose `Text9` als unbekanntes Objekt statt „Type mismatch" zu melden #### Scenario: Unbekannte Eigenschaft wird benannt - **WHEN** ein Modul `Text1.Farbe = 3` enthält - **THEN** nennt die Diagnose `Farbe` als unbekannte Eigenschaft von `TextBox` #### Scenario: Eigenschaftstyp wird geprüft - **WHEN** ein Modul `Text1.Text = 5` enthält - **THEN** meldet die Semantik einen Typkonflikt mit Nennung der Eigenschaft #### Scenario: TYPEOF - **WHEN** ein Modul `IF TYPEOF Ziel IS CommandButton THEN` enthält - **THEN** wird es übersetzt und die Klasse gegen die bekannten Steuerelementklassen geprüft ### Requirement: Bang-Operator neben dem SINGLE-Suffix Der Lexer SHALL `!` als Container-Operator erkennen, wenn ihm ein Bezeichner folgt, und andernfalls als Typsuffix für SINGLE. Beide Formen MUST im selben Modul nebeneinander verwendbar sein. #### Scenario: Beide Bedeutungen im selben Modul - **WHEN** ein Modul `Wert! = 1.5` und `Form1!Text1.Text = "a"` enthält - **THEN** wird die erste Zeile als SINGLE-Variable und die zweite als Containerzugriff übersetzt ### Requirement: Ereignisprozeduren mit festen Signaturen Die Semantik SHALL eine `SUB`, deren Name der Form `Objekt_Ereignis` entspricht und deren Objekt bekannt ist, als Ereignisprozedur erkennen und ihre Parameterliste gegen die Signatur der Forms-Referenz prüfen. Eine abweichende Parameterliste MUST namentlich gemeldet werden. Eine `SUB` mit Unterstrich im Namen ohne bekanntes Objekt MUST weiterhin eine gewöhnliche Prozedur sein. #### Scenario: Falsche Signatur - **WHEN** ein Modul `SUB Form_MouseDown (X AS SINGLE)` enthält - **THEN** nennt die Diagnose die erwartete Parameterliste der Ereignisprozedur #### Scenario: Gewöhnliche SUB mit Unterstrich - **WHEN** ein Modul `SUB Zins_Berechnen (n AS INTEGER)` ohne Objekt `Zins` enthält - **THEN** wird sie als gewöhnliche Prozedur übersetzt