## ADDED Requirements ### Requirement: Ereignis-Traps in Grammatik und Signaturprüfung Der Parser SHALL die Trap-Anweisungen des Vorbilds als eigene Konstrukte erkennen: `ON TIMER(n) GOSUB ziel`, `ON KEY(n) GOSUB ziel`, `ON UEVENT GOSUB ziel` und `ON SIGNAL(n) GOSUB ziel`. Diese Formen MUST NOT als berechnetes `ON ausdruck GOSUB liste` behandelt werden. Die Steueranweisungen `TIMER`, `KEY(n)`, `UEVENT` und `SIGNAL(n)` mit `ON`, `OFF` oder `STOP` SHALL erkannt und nur für diese Quellen zugelassen werden; `EVENT` SHALL nur `ON` und `OFF` zulassen, weil das Vorbild keinen dritten Zustand kennt. `COM`, `PEN`, `PLAY` und `STRIG` MUST als Non-Feature namentlich abgewiesen werden. `SetUEvent` SHALL eine Signatur besitzen. Die Wertebereiche SHALL geprüft werden: `ON KEY(n%)` mit `n%` aus 0, 1–25 oder 30–31, `ON TIMER(n&)` mit `n&` aus 1–86 400 und `ON SIGNAL(n%)` mit `n%` aus 1–2. Eine fehlerhafte Verwendung MUST eine Diagnose erzeugen, die das Element namentlich nennt. #### Scenario: ON TIMER ist kein berechnetes GOSUB - **WHEN** ein Modul `ON TIMER(5) GOSUB Marke` enthält - **THEN** wird die Anweisung als Zeit-Trap erfasst und nicht als `ON ausdruck GOSUB` mit einer einelementigen Zielliste #### Scenario: Ungültige Kennung wird namentlich gemeldet - **WHEN** ein Modul `ON KEY(99) GOSUB Marke` enthält - **THEN** nennt die Diagnose `ON KEY` und den zulässigen Wertebereich #### Scenario: EVENT kennt kein STOP - **WHEN** ein Modul `EVENT STOP` enthält - **THEN** nennt die Diagnose `EVENT` und die zulässigen Formen `ON` und `OFF` #### Scenario: Zeitintervall außerhalb des Bereichs - **WHEN** ein Modul `ON TIMER(90000) GOSUB Marke` enthält - **THEN** nennt die Diagnose `ON TIMER` und den Bereich 1 bis 86400 #### Scenario: Non-Feature-Quelle wird abgewiesen - **WHEN** ein Modul `ON PEN GOSUB Marke` enthält - **THEN** meldet die Übersetzung „Feature unavailable" an der Fundstelle der Anweisung — wie bei jedem anderen Non-Feature — und nicht einen generischen Syntaxfehler #### Scenario: SetUEvent besitzt eine Signatur - **WHEN** ein Modul `CALL SetUEvent` enthält - **THEN** entsteht keine Diagnose „Subprogram not defined" ### Requirement: Trap-Ziele sind Sprungziele des Moduls Das Ziel eines Ereignis-Traps SHALL wie ein `GOSUB`-Ziel aufgelöst werden. Ein unbekanntes Ziel MUST zur Übersetzungszeit gemeldet werden und nennt dabei das Label. #### Scenario: Unbekanntes Trap-Ziel - **WHEN** ein Modul `ON TIMER(1) GOSUB Fehlt` ohne Label `Fehlt` enthält - **THEN** meldet die Übersetzung ein undefiniertes Sprungziel und nennt `Fehlt`