docs: def append(self, state, symbol, action, destinationstate, production = None):
          """Appends a new rule"""
          if action not in (None, "Accept", "Shift", "Reduce"):
              raise TypeError
          rule = {"action":action, "dest":destinationstate}
          if action == "Reduce":
              if rule is None:
                  raise TypeError("Expected production parameter")
              rule["rule"] = production
          while isinstance(symbol, TerminalSymbol) and isinstance(symbol.gd, Iterable) and len(symbol.gd) == 1 and isinstance(list(symbol.gd)[0], Grammar):
              symbol = TerminalSymbol(list(symbol.gd)[0]) #Reduces symbol if its gd is a Sequence/Choice of 1 element
          if not isinstance(symbol, Symbol):
              raise TypeError("Expected symbol, got %s" % symbol)
          self[state][symbol] = rule