def __call__(self, arguments): if not arguments: raise SyntaxError('{} :: Nothing to parse', self) if re.fullmatch(self.pattern, arguments[0]): return self.__class__(arguments[0]), tail(arguments) else: raise SyntaxError('{} :: Cannot match {}', self, arguments)