diff --git a/info4/kapitel-8/GOTO-Programme.ipynb b/info4/kapitel-8/GOTO-Programme.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..6aa8827b23c3542d9953fde1038339a255767c7b --- /dev/null +++ b/info4/kapitel-8/GOTO-Programme.ipynb @@ -0,0 +1,141 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# GOTO-Programme\n", + "\n", + "Die letzte Programmiersprache, die wir betrachten ist GOTO.\n", + "Die Syntax eines GOTO-Programms ist wie folgt definiert:\n", + "* Ein GOTO-Programm besteht aus Markierten Anweisungen $M_1: A_1; M_2: A_2; ... M_m: A_m;$\n", + "* Die Markierungen beginnen bei 1 und steigen immer um 1 an.\n", + "* Jede Anweisung wird durch 1 Semicolon abgeschlossen (ein GOTO-Programm endet immer mit einem Semicolon)\n", + "* Anweisungen $A_i$ dürfen dabei sein:\n", + " * Zuweisung $x_i:=x_j+c$, $x_i:=x_j-c$ und $x_i:=c$ für $c\\in\\mathbb{N}$\n", + " * Unbedingter Sprung $GOTO\\ M_i$\n", + " * Bedingter Sprung $IF\\ x_i=c\\ THEN\\ GOTO\\ M_j$\n", + " * Abbruchanweisung $HALT$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Die Semantik eines GOTO-Programms lässt sich wie folgt verstehen:\n", + "Das Programm startet an der mit $M_1$ markierten Anweisung und führt diese aus.\n", + "Ist diese eine Zuweisung oder ein bedingter Sprung, dessen Bedingung nicht erfüllt ist, so wird mit der nächsten Anweisung weiter gemacht.\n", + "Wenn ein unbedingter Sprung oder ein bedingter Sprung miterfüllter Bedingung ausgeführt wird, wird an der entsprechenden Markierung fortgefahren.\n", + "Bei einer Abbruchanweisung hält das Programm sofort an und der Wert von $x_0$ wird zurück gegeben.\n", + "\n", + "Da ein GOTO-Programm stets von einem $HALT$ beendet wird, ist die letze Anweisung in einem GOTO-Programm immer $HALT$ oder $GOTO$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Eine Funktion heißt GOTO-berechenbar, falls es ein GOTO-Programm gibt, das mit $n_1,...,n_k$ in den Variablen $x_1,...,x_k$ gestartet wird und mit $f(n_1,n_2,...,n_k)$ in der Variablen $x_0$ endet, falls $f(n_1,n_2,...,n_k)$ definiert ist. Andernfalls stoppt das GOTO-Programm nicht.\n", + "Ein Beispiel dafür ist die 2er-Potenz $f(n) = n^2$:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on function interpret in module __main__:\n", + "\n", + "interpret(program, timeout=60)\n", + " Funktion zum Ausführen eines GOTO-Programms.\n", + " :param program: GOTO-Programm als String 'M1: A1; M2: A2; ... Mn: An;'\n", + " :param timeout: Zeit nach der die Ausführung eines Programms pausiert wird.\n", + " Gibt eine Möglichkeit zum Abbrechen bei einer Endlosschleife.\n", + " Ein Wert von 0 deaktiviert den Timeout.\n", + " :returns integer: Gibt bei Abbruch -1 und sonst den Wert von x0 nach dem GOTO-Programm zurück.\n", + " :usage interpret('M1: x0 := x0 + 1; M2: IF x0 = 10 THEN GOTO M4; M3: GOTO M1; M4: HALT;')\n", + "\n" + ] + } + ], + "source": [ + "%run ./Interpreter/gotointerpreter.py" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "14" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "interpret('''\n", + "M1:x1:=6;\n", + "M2:x2:=8;\n", + "M3:x0:=x1+0;\n", + "M4:IF x2=0 THEN GOTO M8;\n", + "M5:x0:=x0 + 1;\n", + "M6:x2:=x2 − 1;\n", + "M7:GOTO M4;\n", + "M8:HALT;''')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "10" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "interpret('M1: x0 := x0 + 1; M2: IF x0 = 10 THEN GOTO M4; M3: GOTO M1; M4: HALT;')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/info4/kapitel-8/Interpreter/gotointerpreter.py b/info4/kapitel-8/Interpreter/gotointerpreter.py index 040b4d36fa4f44b6f92738e6e805d7cb227563b8..1fbeaf031db79fe600c309a56b19c65b47540987 100644 --- a/info4/kapitel-8/Interpreter/gotointerpreter.py +++ b/info4/kapitel-8/Interpreter/gotointerpreter.py @@ -283,5 +283,16 @@ class GOTOInterpreter: def interpret(program, timeout=60): + """Funktion zum Ausführen eines GOTO-Programms. + :param program: GOTO-Programm als String 'M1: A1; M2: A2; ... Mn: An;' + :param timeout: Zeit nach der die Ausführung eines Programms pausiert wird. + Gibt eine Möglichkeit zum Abbrechen bei einer Endlosschleife. + Ein Wert von 0 deaktiviert den Timeout. + :returns integer: Gibt bei Abbruch -1 und sonst den Wert von x0 nach dem GOTO-Programm zurück. + :usage interpret('M1: x0 := x0 + 1; M2: IF x0 = 10 THEN GOTO M4; M3: GOTO M1; M4: HALT;')""" interpreter = GOTOInterpreter(timeout) return interpreter.interpret(program) + + +if __name__ == '__main__': + help(interpret) diff --git a/info4/kapitel-8/Interpreter/loopinterpreter.py b/info4/kapitel-8/Interpreter/loopinterpreter.py index d04ad9337460c227933d7462da97065d30d229fd..36c7c2c68d4c56e942c280a50bca8828b5e8ec5b 100644 --- a/info4/kapitel-8/Interpreter/loopinterpreter.py +++ b/info4/kapitel-8/Interpreter/loopinterpreter.py @@ -2,6 +2,7 @@ import lexer import sys import operator import re +from IPython.display import clear_output class ErrorHandler: @@ -21,6 +22,7 @@ class ErrorHandler: self.line_number += value def handle_break(self): + clear_output(wait=True) print('BREAK in Zeile ' + str(self.line_number)) print('Aktueller Zustand:') for k, v in self.interpreter.values.items(): @@ -249,5 +251,13 @@ class LOOPInterpreter: def interpret(program): + """Funktion zum Ausführen eines LOOP-Programms. + :param program: LOOP-Programm als String 'x1 := 4; LOOP x1 DO x0:=x0+1 END' + :returns integer: Gibt bei Abbruch -1 und sonst den Wert von x0 nach dem LOOP-Programm zurück. + :usage interpret('x1:=10; x2:=8; x0:=x2+0; LOOP x1 DO x0:=x0+1 END')""" interpreter = LOOPInterpreter() return interpreter.interpret(program) + + +if __name__ == '__main__': + help(interpret) diff --git a/info4/kapitel-8/Interpreter/whileinterpreter.py b/info4/kapitel-8/Interpreter/whileinterpreter.py index ad491e35efca2426ff81df81894766c1a9034a10..d5193eeaf35ddc29a44cfb094ee858a32f68ed03 100644 --- a/info4/kapitel-8/Interpreter/whileinterpreter.py +++ b/info4/kapitel-8/Interpreter/whileinterpreter.py @@ -2,6 +2,7 @@ import lexer from loopinterpreter import LOOPInterpreter, ErrorHandler import re import signal +from IPython.display import clear_output class Timeout: @@ -18,6 +19,7 @@ class Timeout: def interrupt(self, sig_num, stack_frame): try: + clear_output(wait=True) abort = input('''Die Funktion rechnet relativ lange. Vielleicht liegt eine Endlosschleife vor. Möchten sie abbrechen? [J,n]:''') @@ -184,5 +186,16 @@ class WHILEInterpreter(LOOPInterpreter): def interpret(program, timeout=60): + """Funktion zum Ausführen eines WHILE-Programms. + :param program: WHILE-Programm als String 'x1:=10; x2:=8; x0:=x2+0; WHILE x1 /=0 DO x0:=x0+1; x1:=x1-1 END' + :param timeout: Zeit nach der die Ausführung eines Programms pausiert wird. + Gibt eine Möglichkeit zum Abbrechen bei einer Endlosschleife. + Ein Wert von 0 deaktiviert den Timeout. + :returns integer: Gibt bei Abbruch -1 und sonst den Wert von x0 nach dem WHILE-Programm zurück. + :usage interpret('x1:=10; x2:=8; x0:=x2+0; WHILE x1 /=0 DO x0:=x0+1; x1:=x1-1 END')""" interpreter = WHILEInterpreter(timeout) return interpreter.interpret(program) + + +if __name__ == '__main__': + help(interpret) diff --git a/info4/kapitel-8/LOOP-Programme.ipynb b/info4/kapitel-8/LOOP-Programme.ipynb index 2f7295e6c282d082e4b9db9d2b4cd904c4886fcd..884e03c7887d155d2be5d4aa4a71300b0be8e64a 100644 --- a/info4/kapitel-8/LOOP-Programme.ipynb +++ b/info4/kapitel-8/LOOP-Programme.ipynb @@ -40,7 +40,22 @@ "metadata": { "scrolled": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on function interpret in module __main__:\n", + "\n", + "interpret(program)\n", + " Funktion zum Ausführen eines LOOP-Programms.\n", + " :param program: LOOP-Programm als String 'x1 := 4; LOOP x1 DO x0:=x0+1 END'\n", + " :returns integer: Gibt bei Abbruch -1 und sonst den Wert von x0 nach dem LOOP-Programm zurück.\n", + " :usage interpret('x1:=10; x2:=8; x0:=x2+0; LOOP x1 DO x0:=x0+1 END')\n", + "\n" + ] + } + ], "source": [ "%run Interpreter/loopinterpreter.py" ] diff --git a/info4/kapitel-8/WHILE-Programme.ipynb b/info4/kapitel-8/WHILE-Programme.ipynb index 11c0634656a76e8a81c899132a2316ea1c2c35d7..4dcdb7d2137168ab04d9a623103c651a73301d5c 100644 --- a/info4/kapitel-8/WHILE-Programme.ipynb +++ b/info4/kapitel-8/WHILE-Programme.ipynb @@ -36,7 +36,25 @@ "cell_type": "code", "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on function interpret in module __main__:\n", + "\n", + "interpret(program, timeout=60)\n", + " Funktion zum Ausführen eines WHILE-Programms.\n", + " :param program: WHILE-Programm als String 'x1:=10; x2:=8; x0:=x2+0; WHILE x1 /=0 DO x0:=x0+1; x1:=x1-1 END'\n", + " :param timeout: Zeit nach der die Ausführung eines Programms pausiert wird.\n", + " Gibt eine Möglichkeit zum Abbrechen bei einer Endlosschleife.\n", + " Ein Wert von 0 deaktiviert den Timeout.\n", + " :returns integer: Gibt bei Abbruch -1 und sonst den Wert von x0 nach dem WHILE-Programm zurück.\n", + " :usage interpret('x1:=10; x2:=8; x0:=x2+0; WHILE x1 /=0 DO x0:=x0+1; x1:=x1-1 END')\n", + "\n" + ] + } + ], "source": [ "%run Interpreter/whileinterpreter.py" ]