s n h m r u
i

Station - Ein Code-Erzeuger für strukturierte MyKa-Programme

Aufgabe des Code-Erzeugers

Der Code-Erzeuger hat die Aufgabe, (strukturierte) MyKa-Programme in (strukturierte) MyKaGoto-Programme zu übersetzen. Die Arbeitsweise des Code-Erzeugers soll am folgenden Beispiel-Programm verdeutlicht werden.

Aus einer strukturierten Darstellung des MyKa-Programms

links
while nichtVorWand:
  ziegelHinlegen
  schritt
#while

soll eine strukturierte Darstellung des folgenden MyKaGoto-Programms erzeugt werden:

links
label .L0
if nichtVorWand: goto .L1
else: goto .L2
label .L1
ziegelHinlegen
schritt
goto .L0
label .L2

Der Code-Erzeuger verarbeitet als Quellcode also eine Listen-Darstellung des MyKa-Programms.

[
    ['links'], 
    ['while', 
        ['nichtVorWand'], 
        [
            ['ziegelHinlegen'], 
            ['schritt']
        ]
    ]
]

Diesen Quellcode transformiert der Code-Erzeuger in ein strukturiertes MyKaGoto-Programm.

[
(None, ['links']),
('.L0', ['noop']),
(None, ['if', ['nichtVorWand'], ['goto', '.L1'], ['goto', '.L2']]),
('.L1', ['noop']),
(None, ['ziegelHinlegen']),
(None, ['schritt']),
(None, ['goto', '.L0']),
('.L2', ['noop'])
]

Implementierung des Code-Erzeugers

Der Code-Erzeuger wird durch ein Objekt der Klasse UebersetzerWhileList realisiert. Dieses Objekt verfügt insbesondere über eine Methode uebersetzen, die letztlich für die Erzeugung des Zielcodes zuständig ist.

class UebersetzerMyKaList(object):
    def __init__(self):
        self.quellcode = None
def setQuellcode(self, q):
    self.quellcode = q

def uebersetzen(self):

    def c_programm(p):
        'programm : anweisungsfolge'
        return c_anweisungsfolge(p) 

    def c_anweisungsfolge(p):
        '''anweisungsfolge : anweisung anweisungsfolge
                           | anweisung'''
        if len(p) > 1:
            return c_anweisung(p[0]) + c_anweisungsfolge(p[1:])
        else:
            return c_anweisung(p[0])

    def c_anweisung(p):
        '''anweisung : ELANW
                     | PASS
                     | WHILE bedingung DP anweisungsfolge ENDWH
                     | IF bedingung DP anweisungsfolge ELSE DP anweisungsfolge ENDIF'''
        if p[0] in ["schritt",
                    "links",
                    "rechts",
                    "ziegelHinlegen",
                    "ziegelAufheben",
                    "markeSetzen",
                    "markeLoeschen",
                    "pass"]:
            return [(None, p)]
        elif p[0] == 'while':
            ergebnis_true = c_anweisungsfolge(p[2])
            ergebnis_wh = [('.L' + str(self.zaehler), ['noop']), \
                           (None, ['if', p[1], ['goto', '.L' + str(self.zaehler+1)], \
                                               ['goto', '.L' + str(self.zaehler+2)]]), \
                           ('.L' + str(self.zaehler+1), ['noop'])] + \
                           ergebnis_true + \
                          [(None, ['goto', '.L' + str(self.zaehler)]), \
                           ('.L' + str(self.zaehler+2), ['noop'])]
            self.zaehler = self.zaehler + 3
            return ergebnis_wh
        elif p[0] == 'if':
            ergebnis_true = c_anweisungsfolge(p[2])
            ergebnis_false = c_anweisungsfolge(p[3])
            ergebnis_if = [(None, ['if', p[1], ['goto', '.L' + str(self.zaehler)], \
                                               ['goto', '.L' + str(self.zaehler+1)]]), \
                           ('.L' + str(self.zaehler), ['noop'])] + \
                           ergebnis_true + \
                           [(None, ['goto', '.L' + str(self.zaehler+2)])] + \
                           [('.L' + str(self.zaehler+1), ['noop'])]+ \
                           ergebnis_false + \
                           [('.L' + str(self.zaehler+2), ['noop'])]
            self.zaehler = self.zaehler + 3
            return ergebnis_if

    self.zaehler = 0
    if self.quellcode != []:
        return c_programm(self.quellcode)
    else:
        return [(0, "p")]

Ein Objekt der Klasse UebersetzerMyKaList kann also benutzt werden, um strukturierte While-Programme in strukturierte Goto-Programme zu übersetzen.

from uebersetzerMyKaList import *

Testprogramm

quellcode = [
['links'],
['while',
['nichtVorWand'],
[
['ziegelHinlegen'],
['schritt']
]
]
]

codeerzeuger = UebersetzerMyKaList()

Erzeugung des Zielcodes

codeerzeuger.setQuellcode(quellcode)
zielcode = codeerzeuger.uebersetzen()

Ausführung des Programms und Ausgabe der Zustände

print('Quellcode:')
print()
for zeile in quellcode:
print(zeile)
print()
print('Zielcode:')
print()
for zeile in zielcode:
print(zeile)

Aufgabe 1

Probiere das selbst einmal aus. Teste verschiedene strukturierte MyKa-Programme.

Suche

v
4.3.4.7 Station - Ein Code-Erzeuger für strukturierte MyKa-Programme
Kopieren durch Anklicken

Rückmeldung geben