code: def visitTripleConstraint(self, ctx: ShExDocParser.TripleConstraintContext):
          
          # This exists because of the predicate within annotation - if we default to visitchildren, we intercept both
          # predicates
          if ctx.senseFlags():
              self.visit(ctx.senseFlags())
          self.visit(ctx.predicate())
          self.visit(ctx.inlineShapeExpression())
          self._card_annotations_and_semacts(ctx)
docs: tripleConstraint: senseFlags? predicate inlineShapeExpression cardinality? annotation* semanticActions