membersDef: COMMA | member+ (BAR altMemberDef)* (BAR lastComma)? ;
            altMemberDef: member* ;
            member: pairDef COMMA?
            lastComma: COMMA ;

def visitMembersDef(self, ctx: jsgParser.MembersDefContext):
        """ membersDef: COMMA | member+ (BAR altMemberDef)* (BAR lastComma)? ;
            altMemberDef: member* ;
            member: pairDef COMMA?
            lastComma: COMMA ;
        """
        if not self._name:
            self._name = self._context.anon_id()
        if ctx.COMMA():                             # lone comma - wild card
            self._strict = False
        if not ctx.BAR():                           # member+
            self.visitChildren(ctx)
        else:
            entry = 1
            self._add_choice(entry, ctx.member())       # add first brance (member+)
            for alt in ctx.altMemberDef():
                entry += 1
                self._add_choice(entry, alt.member())
            if ctx.lastComma():
                entry += 1
                self._add_choice(entry, [])