Es gibt viele Formalismen, so dass Sie vielleicht andere nützliche Quellen finden. Ich hoffe, dass ich dies klar genug formulieren kann, damit sie nicht notwendig sind.
Ein RM besteht aus einer endlichen Zustandsmaschine und einer endlichen Anzahl benannter Register, von denen jedes eine nicht negative ganze Zahl enthält. Um die Texteingabe zu vereinfachen, müssen für diese Aufgabe auch die Status benannt werden.
Es gibt drei Arten von Zuständen: Inkrementieren und Dekrementieren, die beide auf ein bestimmtes Register verweisen. und kündigen. Ein Inkrementierungszustand inkrementiert sein Register und übergibt die Steuerung an seinen einen Nachfolger. Ein Dekrementierungszustand hat zwei Nachfolger: Wenn sein Register nicht Null ist, dekrementiert es es und übergibt die Steuerung an den ersten Nachfolger; Andernfalls (dh das Register ist Null) übergibt es die Steuerung einfach an den zweiten Nachfolger.
Für "Nizza" als Programmiersprache benötigen die Endzustände eine fest codierte Zeichenfolge, um gedruckt zu werden (sodass Sie auf eine außergewöhnliche Beendigung hinweisen können).
Die Eingabe erfolgt von stdin. Das Eingabeformat besteht aus einer Zeile pro Status, gefolgt vom Anfangsregisterinhalt. Die erste Zeile ist der Ausgangszustand. BNF für die Landesgrenzen ist:
line ::= inc_line
| dec_line
inc_line ::= label ' : ' reg_name ' + ' state_name
dec_line ::= label ' : ' reg_name ' - ' state_name ' ' state_name
state_name ::= label
| '"' message '"'
label ::= identifier
reg_name ::= identifier
Die Definition von Bezeichner und Nachricht ist flexibel. Ihr Programm muss eine nicht leere alphanumerische Zeichenfolge als Bezeichner akzeptieren , es kann jedoch auch allgemeinere Zeichenfolgen akzeptieren, wenn Sie dies bevorzugen (z. B. wenn Ihre Sprache Bezeichner mit Unterstrichen unterstützt und dies für Sie einfacher ist). In ähnlicher Weise für die Nachrichten Sie müssen eine nicht leere Zeichenfolge von alphanumerischen Zeichen und Leerzeichen akzeptieren, aber Sie können komplexere Strings akzeptieren , die maskierten Newlines und doppelte Anführungszeichen zulassen , wenn Sie wollen.
Die letzte Eingabezeile, die die Anfangsregisterwerte enthält, ist eine durch Leerzeichen getrennte Liste von Zuweisungen von bezeichner = int, die nicht leer sein dürfen. Es ist nicht erforderlich, dass alle im Programm genannten Register initialisiert werden: Alle nicht initialisierten Register werden als 0 angenommen.
Ihr Programm sollte die Eingabe lesen und den RM simulieren. Wenn es einen Beendigungszustand erreicht, sollte es die Nachricht, eine neue Zeile und dann die Werte aller Register (in jeder geeigneten, für den Menschen lesbaren, formatierten und beliebigen Reihenfolge) ausgeben.
Hinweis: Formal sollten die Register unbegrenzte ganze Zahlen enthalten. Sie können jedoch davon ausgehen, dass der Wert eines Registers niemals 2 ^ 30 überschreitet.
Einige einfache Beispiele
a + = b, a = 0s0 : a - s1 "Ok"
s1 : b + s0
a=3 b=4
Erwartete Ergebnisse:
Ok
a=0 b=7
b + = a, t = 0
init : t - init d0
d0 : a - d1 a0
d1 : b + d2
d2 : t + d0
a0 : t - a1 "Ok"
a1 : a + a0
a=3 b=4
Erwartete Ergebnisse:
Ok
a=3 b=7 t=0
Testfälle für schwieriger zu analysierende Maschinen
s0 : t - s0 s1
s1 : t + "t is 1"
t=17
Erwartete Ergebnisse:
t is 1
t=1
und
s0 : t - "t is nonzero" "t is zero"
t=1
Erwartete Ergebnisse:
t is nonzero
t=0
Ein komplizierteres Beispiel
Entnommen aus der Josephus-Problemcode-Herausforderung des DailyWTF. Die Eingabe ist n (Anzahl der Soldaten) und k (Vorrücken) und die Ausgabe in r ist die (durch Nullen indizierte) Position der Person, die überlebt.
init0 : k - init1 init3
init1 : r + init2
init2 : t + init0
init3 : t - init4 init5
init4 : k + init3
init5 : r - init6 "ERROR k is 0"
init6 : i + init7
init7 : n - loop0 "ERROR n is 0"
loop0 : n - loop1 "Ok"
loop1 : i + loop2
loop2 : k - loop3 loop5
loop3 : r + loop4
loop4 : t + loop2
loop5 : t - loop6 loop7
loop6 : k + loop5
loop7 : i - loop8 loopa
loop8 : r - loop9 loopc
loop9 : t + loop7
loopa : t - loopb loop7
loopb : i + loopa
loopc : t - loopd loopf
loopd : i + loope
loope : r + loopc
loopf : i + loop0
n=40 k=3
Erwartete Ergebnisse:
Ok
i=40 k=3 n=0 r=27 t=0
Das Programm als Bild für diejenigen, die visuell denken und es hilfreich finden, die Syntax zu verstehen:
Wenn Sie dieses Golfspiel mögen, schauen Sie sich die Fortsetzung an .