def _parse_template_introduction(self) -> ASTTemplateIntroduction:
    pos = self.pos
    try:
        concept = self._parse_nested_name()
    except Exception:
        self.pos = pos
        return None
    self.skip_ws()
    if (not self.skip_string('{')):
        self.pos = pos
        return None
    params = []
    while 1:
        self.skip_ws()
        parameterPack = self.skip_string('...')
        self.skip_ws()
        if (not self.match(identifier_re)):
            self.fail('Expected identifier in template introduction list.')
        txt_identifier = self.matched_text
        if (txt_identifier in _keywords):
            self.fail(('Expected identifier in template introduction list, got keyword: %s' % txt_identifier))
        identifier = ASTIdentifier(txt_identifier)
        params.append(ASTTemplateIntroductionParameter(identifier, parameterPack))
        self.skip_ws()
        if self.skip_string('}'):
            break
        elif self.skip_string(','):
            continue
        else:
            self.fail('Error in template introduction list. Expected ",", or "}".')
    return ASTTemplateIntroduction(concept, params)
def _parse_template_introduction(self) -> ASTTemplateIntroduction:
    pos = self.pos
    try:
        concept = self._parse_nested_name()
    except Exception:
        self.pos = pos
        return None
    self.skip_ws()
    if (not self.skip_string('{')):
        self.pos = pos
        return None
    params = []
    while 1:
        self.skip_ws()
        parameterPack = self.skip_string('...')
        self.skip_ws()
        if (not self.match(identifier_re)):
            self.fail('Expected identifier in template introduction list.')
        txt_identifier = self.matched_text
        if (txt_identifier in _keywords):
            self.fail(('Expected identifier in template introduction list, got keyword: %s' % txt_identifier))
        identifier = ASTIdentifier(txt_identifier)
        params.append(ASTTemplateIntroductionParameter(identifier, parameterPack))
        self.skip_ws()
        if self.skip_string('}'):
            break
        elif self.skip_string(','):
            continue
        else:
            self.fail('Error in template introduction list. Expected ",", or "}".')
    return ASTTemplateIntroduction(concept, params)