Dokumentation · Version 0.2 · Kapitel 07

Referenz

Alles auf einen Blick: sämtliche Satzmuster, die reservierten Wörter, der Aufruf des Interpreters samt Prüfmodus und Formatierer, die Sicherheitsvorkehrungen und die bekannten Grenzen. Stand: Version 0.2.0.

Alle Satzmuster

Nachschlagewerk

Ausgabe und Eingabe

Zeige Wert.Gibt eine Zeile aus
Zeige a und b.Hängt Teile direkt aneinander
Frage "…" und merke die Antwort als N.Liest eine Eingabe ein

Variablen

Merke Wert als N.Anlegen oder überschreiben
Merke für immer Wert als N.Konstante
Setze N auf Wert.Ändern, Name muss existieren
Erhöhe N um n. · Verringere N um n.Ohne um um 1
Verdopple N. · Halbiere N.Mal zwei, geteilt durch zwei
Verbinde a und b zu N.Zu einem Text zusammenhängen
Kopiere L als N.Echte Kopie einer Liste oder Tabelle

Rechnen

a plus b · a minus b · a mal bGrundrechenarten
a geteilt durch b · a hoch bTeilen, Potenz
der Rest von a geteilt durch bDivisionsrest
-5 · minus xNegative Zahl, Vorzeichen
die Wurzel von x · der Betrag von xWurzel, Betrag
der Sinus von g · Kosinus · TangensWinkel in Grad; Cosinus geht auch
der Arkussinus von x · Arkuskosinus · ArkustangensUmkehrung, liefert Grad
die Länge von xZeichen, Einträge oder Tabellengröße
Kleinbuchstaben von t · Großbuchstaben von tSchreibweise ändern
Abgerundet / Aufgerundet / Gerundet von xGanze Zahlen (kaufmännisch)
Gerundet von x auf n StellenZahl mit n Nachkommastellen
Formatiert von x auf n StellenText mit Komma: "3,14"
Rechtsbündig von x auf n Zeichen · LinksbündigFüllt mit Leerzeichen auf — für Tabellen
Zahlenwert von tText → Zahl, versteht das Komma
Zufallszahl von a bis bGrenzen inklusive
die aktuelle Stunde · Minute · SekundeUhr des Rechners, je Lauf einmal abgelesen
der aktuelle Tag · Monat · das aktuelle JahrDatum

Vergleichen und Verknüpfen

a gleich b · a nicht gleich bGleichheit
a größer als b · a kleiner als bEchter Vergleich
a mindestens b · a höchstens bMit Gleichheit
a durch n teilbar · a nicht durch n teilbarTeilbarkeit
L enthält Wert · Text enthält StückEnthaltensein (auch Tabellenschlüssel)
x eine Zahl · x keine ZahlTypprüfung
x ein Text · x eine Liste · x eine TabelleTypprüfung
und · oder · nichtund bindet vor oder
( … )Klammern, auch in Bedingungen

Ablauf

Wenn … : … Sonst wenn … : … Sonst: … Ende.Bedingung, Blockform
Wenn …, satz. · Sonst satz.Kurzform, genau ein Satz
Wiederhole n Mal: … Ende.Feste Anzahl
Wiederhole solange …: … Ende.Bedingte Schleife
Zähle von a bis b mit i: … Ende.Aufwärts; Start > Ziel läuft nie
Zähle von a bis b rückwärts mit i:Abwärts (auch abwärts)
Zähle von a bis b in Schritten von n mit i:Schrittweite
Für jedes E in L: … Ende.Liste, Text oder Tabellenschlüssel
Höre auf. · Mach weiter.Abbrechen, überspringen

Zeichnen

Gehe n Schritte vor. · zurück.Stift bewegen, dabei malen
Drehe dich um n Grad nach links. · nach rechts.dich und nach sind freiwillig
Hebe den Stift. · Senke den Stift.malen aus, malen an
Gehe zur Mitte.zurück zum Start, wieder nach oben schauend
Nimm die Farbe "gold".rot blau grün gelb gold orange lila rosa türkis braun grau schwarz weiß
Nimm die Strichstärke n.1 bis 50
Lösche die Zeichnung.Leert die Fläche, der Stift bleibt stehen
Warte n Sekunden.Pause, 0 bis 60 s; zählt nicht als Rechenzeit
Wiederhole dieses Programm jede Sekunde.Kurzform: ganzes Programm im Takt neu (auch alle n Sekunden)

Listen

Erstelle eine Liste namens L.Leere Liste
Erstelle eine Liste namens L mit a und b.Gefüllte Liste
Füge Wert zur L hinzu.Hinten anhängen
Entferne Wert aus L.Wert herausnehmen
Entferne Element n aus L.n-ten Eintrag herausnehmen
Entferne das erste / das letzte Element aus L.Vorne bzw. hinten wegnehmen
Sortiere L. · Sortiere L absteigend.Sortieren
das erste / das letzte Element von LRandeinträge
Element n von LGezählt ab 1
Elemente a bis b von LAusschnitt
ein zufälliges Element von LZufälliger Eintrag

Tabellen

Erstelle eine Tabelle namens T.Leere Tabelle
Erstelle eine Tabelle namens T mit "a" als 1.Gefüllte Tabelle
Trage Schlüssel mit Wert in T ein.Eintragen oder überschreiben
Wert für Schlüssel in TWert lesen
Entferne Schlüssel aus T.Eintrag löschen

Texte

Teile t bei "…" zu L.Text zerlegen
Verkettet von L mit ", "Liste zu Text verbinden
Zeichen a bis b von tAusschnitt, ab 1 gezählt
Ersetze "alt" durch "neu" in N.Im Text unter N ersetzen

Dinge

Ein X hat einen A und ein B.Ding beschreiben
Erschaffe einen X mit A … und B … als N.Ding erschaffen
den A von NFeld lesen
Setze den A von N auf Wert.Feld ändern

Aufgaben, Fehler, Dateien

Definiere Aufgabe N mit a und b: … Ende.Definition (von = mit)
Gib Wert zurück.Ergebnis liefern
Führe N mit x aus.Aufruf als Befehl
Versuche: … Bei Fehler: … Ende.Fehlermeldung ist gefüllt
Stelle sicher, dass … .Zusicherung, bricht sonst ab
Lies die Datei "…" als N.Datei lesen
Schreibe "…" in die Datei "…".Datei schreiben
Anmerkung: …Kommentar bis Zeilenende

Reservierte Wörter

Taugen nicht als Namen

als        auf        aus        bei        bis        dass       durch
ende       enthält    falsch     geteilt    gleich     größer     hat
hinzu      hoch       höchstens  in         ist        jede       jeden
jedes      keine      kleiner    mal        mindestens minus      mit
nicht      oder       plus       sind       solange    sonst      teilbar
um         und        von        wahr       wenn       zu         zurück
Umlaute zählen doppelt

Da ä ö ü ß wie ae oe ue ss behandelt werden, ist mit größer auch groesser belegt. Alltagswörter wie Zahl, Text oder Wert sind dagegen bewusst nicht reserviert — sie dürfen Namen sein. Eine Variable darf allerdings nicht heißen wie eine Aufgabe.

Interpreter aufrufen

Reines Python 3, ab Version 3.10, ohne weitere Abhängigkeiten

Kommandozeile
python3 -m klarsatz programme/03_taschenrechner.klar   # Programm ausführen
python3 -m klarsatz                                    # interaktive Konsole
python3 -m klarsatz --pruefe programm.klar             # Fehler finden, ohne auszuführen
python3 -m klarsatz --formatiere --ersetzen programm.klar
python3 -m klarsatz --help
SchalterWirkung
--pruefePrüft ohne auszuführen: Tippfehler mit „Meintest du …?“, Endlosschleifen, unerreichbarer Code, Aufgaben ohne Rückgabe und mehr.
--strengMit --pruefe: auch Hinweise und Warnungen gelten als Fehler.
--formatiere [--ersetzen]Rückt das Programm sauber ein, ohne den Inhalt zu ändern.
--nach-pythonÜbersetzt das Programm in lesbares Python — die Brücke zu einer verbreiteten Sprache.
--tokens · --astZeigt die gelesenen Wörter beziehungsweise den Syntaxbaum.
--limit SCHRITTEAbbruch nach so vielen Schritten. Nicht mit Versuche abfangbar.
--zeit SEKUNDENAbbruch nach so vielen Sekunden.
--streng-grenzenKnappe Grenzen für Zeit, Speicher und Größe — für fremde Programme.
--seed NMacht Zufallszahl reproduzierbar.
--bild DATEI.SVGSpeichert die Zeichnung des Programms als SVG-Bild.
--ohne-dateienSperrt jeden Dateizugriff.
--dateien-ordner ORDNERErlaubt Dateien nur in diesem Ordner.
--dateien-ueberallHebt den Ordnerschutz auf — nur für eigene Programme.

Der Interpreter besteht aus den Stufen Lexer → Satzmuster-Parser → Syntaxbaum → Interpreter, dazu Prüfer, Formatierer, Konsole und die Web-Schnittstelle, über die auch der Spielplatz läuft.

Sicherheitsvorkehrungen

Was der Interpreter absichert — und was nicht

GefahrMaßnahme
Endlosschleife--limit (Schritte) und --zeit (Sekunden); beides nicht mit Versuche abfangbar
SpeicherfresserGrenzen für Text, Liste, Tabelle, Zahlengröße, Ausgabe, Eingabezeile und Programmgröße
Absturz durch VerschachtelungTiefengrenze im Parser, Rekursionsgrenze für Aufgaben — kein Python-Traceback dringt durch
DateienStandard: nur der Arbeitsordner und darunter — kein .., keine absoluten Pfade, kein Ausbruch über Verknüpfungen
Code-EinschleusungKein eval, kein exec, kein Nachladen, kein Zugriff auf Python-Objekte
Netzwerk, ProzesseGibt es in der Sprache nicht

Was nicht abgesichert ist

  • Der Interpreter läuft im selben Python-Prozess: ein Fehler im Interpreter selbst könnte Grenzen umgehen.
  • Die Zeitgrenze wird nur zwischen Schritten geprüft — eine einzelne, sehr teure Rechnung läuft zu Ende, begrenzt durch die Zahlengröße.
  • --dateien-ueberall hebt den Ordnerschutz bewusst auf.
  • Keine Prüfung durch Dritte, kein Fuzzing über die mitgelieferten Tests hinaus.
Ehrlich gesagt

Klarsatz ist ein Lern- und Hobbyprojekt. Der Interpreter ist so gebaut, dass ein Programm möglichst wenig anrichten kann — er ist aber keine geprüfte Sandbox. Fremde, nicht vertrauenswürdige Programme gehören zusätzlich in einen Container oder unter einen Benutzer mit wenigen Rechten. Der Spielplatz dieser Seite geht deshalb den anderen Weg: Er führt gar nichts auf dem Server aus, sondern alles im Browser des Besuchers.

Bekannte Grenzen

Stand Version 0.2.0

  • Kein Dezimalkomma in Zahleneingaben — das Komma trennt Satzteile. Die Ausgabe ist deutsch, und Zahlenwert von "3,5" versteht das Komma.
  • Die Kurzform von Wenn …, … führt genau einen Satz aus; für mehrere Befehle die Blockform nehmen. In Sonst-Ketten bindet ein Sonst an das nächstliegende passende Wenn.
  • Argumente von Aufgaben sind einfache Werte: Quadrat von x plus 1 bedeutet (Quadrat von x) plus 1. --pruefe weist darauf hin.
  • Beim Anzeigen eines Dings steht der Feldname so, wie er in der Definition stand (Namen: Rocco).
  • Zähle von 5 bis 1 läuft nie — abwärts zählt man mit rückwärts. In Version 0.1 war das noch anders.
  • Der Prüfer arbeitet ohne Datenfluss: kein Typwissen, „benutzt vor angelegt“ nur nach Zeilenreihenfolge.

Noch offen

Aus dem Entwurf, noch nicht gebaut

Falls vorhanden:Optionalwerte
Diese Aufgabe darf nur lesen.Fähigkeiten je Aufgabe
Warte n Sekunden.Im Browser heikel, deshalb zurückgestellt
Mehrere Sätze in der Kurzform von WennBequemlichkeit
Bytecode-VM oder CompilerStatt reiner Auswertung des Syntaxbaums