Sie müssen einen Dolmetscher für eine coole Sprache namens Huhn schreiben !
Sie sollten ein Chicken-Programm aus einer Datei, Standardeingaben, Programm- oder Funktionsargumenten oder was auch immer für Ihre Sprache am bequemsten ist, sowie aus Eingaben in das Programm lesen.
Sie sollten das Ergebnis der Interpretation des Programms gemäß der Chicken-Sprachspezifikation ausdrucken oder zurückgeben.
Weitere Beschreibung der Sprache .
Hühnchen-Programmübersicht
Chicken arbeitet mit einem einzigen Stapel, der sein gesamtes Speichermodell zusammensetzt. Während der Ausführung von Anweisungen werden vom Programm Werte aus dem Stapel verschoben und entfernt. Es gibt jedoch auch Anweisungen, mit denen das Programm andere Teile des Stapels nach Belieben ändern kann.
Der Stapel enthält drei Segmente:
- Die Register bei den Indizes 0 und 1. Index 0 ist eine Referenz auf den Stapel selbst, und Index 1 ist eine Referenz auf die Benutzereingabe. Wird meistens für Anweisung 6 verwendet (siehe unten).
- Der geladene Code: Für jede Codezeile befindet sich in diesem Segment eine Zelle, die die Anzahl der "Hühner" in der Zeile enthält. Dies wird am Ende mit einer 0 (Opcode zum Beenden des Programms) aufgefüllt.
- Der eigentliche Programmstapel, in dem Werte während der Programmausführung verschoben / verschoben werden. Beachten Sie, dass die Segmente nicht isoliert sind. Dies bedeutet, dass es möglich ist, selbstmodifizierenden Code zu erstellen oder Code aus diesem Segment des Stapelbereichs auszuführen.
Das Huhn ISA
Der Befehlssatz von Chicken basiert auf der Häufigkeit, mit der das Wort "Huhn" in jeder Programmzeile erscheint. Eine leere Zeile beendet das Programm und gibt den obersten Wert im Stapel aus.
Der Hühnchen-Befehlssatz nach Anzahl der "Hühnchen" pro Zeile:
- Schieben Sie die wörtliche Zeichenfolge "Huhn" auf den Stapel
- Fügen Sie die beiden obersten Stapelwerte als natürliche Zahlen hinzu und geben Sie das Ergebnis an.
- Subtrahieren Sie die beiden obersten Werte als natürliche Zahlen und geben Sie das Ergebnis ein.
- Multiplizieren Sie die beiden obersten Werte als natürliche Zahlen und geben Sie das Ergebnis an.
- Vergleichen Sie zwei Spitzenwerte für Gleichheit, drücken Sie 1, wenn sie gleich sind, und 0, wenn dies nicht der Fall ist.
- Sehen Sie sich die nächste Anweisung an, um festzustellen, von welcher Quelle geladen werden soll: 0 Ladevorgänge vom Stapel, 1 Ladevorgänge von Benutzereingaben. Die Oberseite des Stapels zeigt auf die Adresse / den Index, die bzw. der aus der angegebenen Quelle geladen werden soll. Laden Sie diesen Wert und schieben Sie ihn auf den Stapel. Da dies ein doppelt breiter Befehl ist, überspringt der Befehlszeiger den Befehl, der zum Bestimmen der Quelle verwendet wird.
- Die Oberseite des Stapels zeigt auf die Adresse / den Index, in der / dem gespeichert werden soll. Der darunter liegende Wert wird abgelegt und im angegebenen Index im Stapel gespeichert.
- Die Oberseite des Stapels ist ein relativer Versatz, zu dem gesprungen werden kann. Wenn der Wert darunter wahr ist, springt das Programm um den Offset.
- Interpretiert die Oberseite des Stapels als ASCII und drückt das entsprechende Zeichen.
- (10 + N) Schiebt die Literalzahl n-10 auf den Stapel.
Beispiel
Angenommen, das Programm ist:
chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken chicken
chicken chicken chicken chicken chicken chicken
(an empty line)
(Ein Katzenprogramm. Beachten Sie, dass die leere Zeile erforderlich ist, da die vorhergehende Zeile 6 "Huhn" enthält.)
Eingabe für das Chicken-Programm
Chicken
Ausgabe
Chicken
Die Referenzimplementierung von Chicken.js .
Fehlererkennung
Der Interpreter sollte einen Fehler hinterlassen und beenden, wenn in der Quelle ein Wort vorhanden ist, das nicht "Huhn" ist.
Viel Glück!