37. Mehr zur Wort-Klasse

Zurück zur Wortklasse: Wie bei einer Sequenz soll len die Anzahl der Elemente zurückgeben:

  def __len__(self):
    return len(self.symList)

Wir wollen, dass Word weiß, ob es nur aus Terminalen besteht:

  def isAllTerminal(self):
    for s in self.symList:
      if isinstance(s, symbol.NonTerminal):
        return 0
    return 1

Wir bauchen das am weitesten links stehende Nichtterminalsymbol:

  def getLeftmostNonTerm(self):
    for s in self.symList:
      if isinstance(s, symbol.NonTerminal):
        return s

Wir wollen ein neues Wort, in dem ein Nichtterminalsymbol durch ein anderes Wort ersetzt ist, erzeugen:

  def replaceLeftmost(self, nonTerm, repl):
    applyPos = self.symList.index(nonTerm)
    newWord = Word(word=self)
    newWord.symList[applyPos:applyPos+1
      ] = repl.symList
    return newWord

Weist man einem Listenelement einen Wert zu, hat das Element den neuen Wert. Wir wollen in replaceLeftmost aber ein Element durch mehrere neue Elemente ersetzen:

>>> l=range(8)
>>> l[4]=[-4,-5,-6]
>>> l
[0, 1, 2, 3, [-4, -5, -6], 5, 6, 7]
>>> l=range(8)
>>> l[4:5]
[4]
>>> l[4:5]=[-4,-5,-6]
>>> l
[0, 1, 2, 3, -4, -5, -6, 5, 6, 7]

Beachte: l[4] ist eine Zahl, l[4:5] ist eine Liste.

Das vollständige word-Modul ist im Anhang der Seite zu finden.

Übungen zu diesem Abschnitt

Ihr solltet euch wenigstens an den rötlich unterlegten Aufgaben versuchen

(1)

Geht das Beispiel mit der Zuweisung zu slices und Elementen noch einmal genau durch. Könnt ihr auf dieser Basis eine Funktion prepend(targetList, srcList) -> None schreiben, die srcList vor das erste Element von targetList schiebt, also etwa so:

>>> l = range(5)
>>> prepend(l, range(2))
>>> l
[0, 1, 0, 1, 2, 3, 4]


Markus Demleitner

Copyright Notice