numericFacet: numericRange numericLiteral | numericLength INTEGER
            numericRange: KW_MINEXCLUSIVE | KW_MININCLUSIVE | KW_MAXEXCLUSIVE | KW_MAXINCLUSIVE 
            numericLength: KW_TOTALDIGITS | KW_FRACTIONDIGITS

def visitNumericFacet(self, ctx: ShExDocParser.NumericFacetContext):
        """ numericFacet: numericRange numericLiteral | numericLength INTEGER
            numericRange: KW_MINEXCLUSIVE | KW_MININCLUSIVE | KW_MAXEXCLUSIVE | KW_MAXINCLUSIVE 
            numericLength: KW_TOTALDIGITS | KW_FRACTIONDIGITS """
        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