42. Rule revisited

import operator, string, Symbol, Word

class Rule:
  def __init__(self, rawRule):
    self._parse(rawRule)

  def __str__(self):
    return "%s -> %s"%(self.left, self.right)

  def __repr__(self):
    return "Rule('%s')"%str(self)

  def _parse(self, rawRule):
    try:
      rawLeft, rawRight = map(str.strip,
        rawRule.split("->"))
      if not rawLeft:
        raise ValueError("Empty left side")
      self.left = symbol.NonTerminal(rawLeft)
      self.right = word.Word(rawRight)
    except ValueError, msg:
      raise ValueError(
        "Syntaxfehler in %s: %s"%(rawRule, msg))

  def getLeft(self):
    return self.left

  def getRight(self):
    return self.right
  def applyToLeftmost(self, word):
    return word.replaceLeftmost(self.left,
      self.right)
  • Eine Regel besteht jetzt, wie es sich für kontextfreie Grammatiken gehört, aus einem Nichtterminal auf der linken und einem Wort auf der rechten Seite.
  • Eigentlich gehören da noch jede Menge Kommentare rein, vor allem Docstrings zu den Klassen und Methoden. Ich darf die hier weglassen, weil die Folie sonst überlaufen würde, ihr dürft das nicht
  • In der except-Klausel in Rule._parse steht ein , msg. In dem msg steht ein Objekt, das als String die mit der Exception verbundene Meldung enthält. Es ist häufig eine gute Idee, diese Meldungen nicht wegzuwerfen.

Markus Demleitner

Copyright Notice