code: def visitNumericFacet(self, ctx: ShExDocParser.NumericFacetContext):
          
          if ctx.numericRange():
              numlit = self.context.numeric_literal_to_type(ctx.numericLiteral())
              if ctx.numericRange().KW_MINEXCLUSIVE():
                  self.nodeconstraint.minexclusive = numlit
              elif ctx.numericRange().KW_MAXEXCLUSIVE():
                  self.nodeconstraint.maxexclusive = numlit
              elif ctx.numericRange().KW_MININCLUSIVE():
                  self.nodeconstraint.mininclusive = numlit
              elif ctx.numericRange().KW_MAXINCLUSIVE():
                  self.nodeconstraint.maxinclusive = numlit
          else:
              nlen = jsg.Integer(ctx.INTEGER().getText())
              if ctx.numericLength().KW_TOTALDIGITS():
                  self.nodeconstraint.totaldigits = nlen
              elif ctx.numericLength().KW_FRACTIONDIGITS():
                  self.nodeconstraint.fractiondigits = nlen
docs: numericFacet: numericRange numericLiteral | numericLength INTEGER
              numericRange: KW_MINEXCLUSIVE | KW_MININCLUSIVE | KW_MAXEXCLUSIVE | KW_MAXINCLUSIVE 
              numericLength: KW_TOTALDIGITS | KW_FRACTIONDIGITS