def METHOD_NAME(self, nodes, repeat=None):
    # Compile STRING | NAME [Details] | (...) | [...]
    assert len(nodes) >= 1
    node = nodes[0]
    if node.type == token.STRING:
        value = unicode(literals.evalString(node.value))
        return pytree.LeafPattern(_type_of_literal(value), value)
    elif node.type == token.NAME:
        value = node.value
        if value.isupper():
            if value not in TOKEN_MAP:
                raise PatternSyntaxError("Invalid token: %r" % value)
            if nodes[1:]:
                raise PatternSyntaxError("Can't have details for token")
            return pytree.LeafPattern(TOKEN_MAP[value])
        else:
            if value == "any":
                type = None
            elif not value.startswith("_"):
                type = getattr(self.pysyms, value, None)
                if type is None:
                    raise PatternSyntaxError("Invalid symbol: %r" % value)
            if nodes[1:]: # Details present
                content = [self.compile_node(nodes[1].children[1])]
            else:
                content = None
            return pytree.NodePattern(type, content)
    elif node.value == "(":
        return self.compile_node(nodes[1])
    elif node.value == "[":
        assert repeat is None
        subpattern = self.compile_node(nodes[1])
        return pytree.WildcardPattern([[subpattern]], min=0, max=1)
    assert False, node