From e7588d06b0aebadab7e5d8a829e686c265112f96 Mon Sep 17 00:00:00 2001
From: Chris <Christopher.Happe@uni-duesseldorf.de>
Date: Sun, 29 Nov 2020 12:26:05 +0100
Subject: [PATCH] =?UTF-8?q?Feature:=20Hilfemeldung=20f=C3=BCr=20interpret?=
 =?UTF-8?q?=20funktionen.=20closes=20#1.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 info4/kapitel-8/GOTO-Programme.ipynb          | 141 ++++++++++++++++++
 .../kapitel-8/Interpreter/gotointerpreter.py  |  11 ++
 .../kapitel-8/Interpreter/loopinterpreter.py  |  10 ++
 .../kapitel-8/Interpreter/whileinterpreter.py |  13 ++
 info4/kapitel-8/LOOP-Programme.ipynb          |  17 ++-
 info4/kapitel-8/WHILE-Programme.ipynb         |  20 ++-
 6 files changed, 210 insertions(+), 2 deletions(-)
 create mode 100644 info4/kapitel-8/GOTO-Programme.ipynb

diff --git a/info4/kapitel-8/GOTO-Programme.ipynb b/info4/kapitel-8/GOTO-Programme.ipynb
new file mode 100644
index 0000000..6aa8827
--- /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 040b4d3..1fbeaf0 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 d04ad93..36c7c2c 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 ad491e3..d5193ee 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 2f7295e..884e03c 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 11c0634..4dcdb7d 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"
    ]
-- 
GitLab