@@ -465,7 +465,7 @@ def __init__(self, savelist: bool = False) -> None:
465
465
self .whiteChars = set (ParserElement .DEFAULT_WHITE_CHARS )
466
466
self .copyDefaultWhiteChars = True
467
467
# used when checking for left-recursion
468
- self .mayReturnEmpty = False
468
+ self ._may_return_empty = False
469
469
self .keepTabs = False
470
470
self .ignoreExprs : list [ParserElement ] = list ()
471
471
self .debug = False
@@ -483,6 +483,14 @@ def __init__(self, savelist: bool = False) -> None:
483
483
self .suppress_warnings_ : list [Diagnostics ] = []
484
484
self .show_in_diagram = True
485
485
486
+ @property
487
+ def mayReturnEmpty (self ):
488
+ return self ._may_return_empty
489
+
490
+ @mayReturnEmpty .setter
491
+ def mayReturnEmpty (self , value ):
492
+ self ._may_return_empty = value
493
+
486
494
def suppress_warning (self , warning_type : Diagnostics ) -> ParserElement :
487
495
"""
488
496
Suppress warnings emitted for a particular diagnostic on this expression.
@@ -2412,7 +2420,7 @@ class NoMatch(Token):
2412
2420
2413
2421
def __init__ (self ) -> None :
2414
2422
super ().__init__ ()
2415
- self .mayReturnEmpty = True
2423
+ self ._may_return_empty = True
2416
2424
self .mayIndexError = False
2417
2425
self .errmsg = "Unmatchable token"
2418
2426
@@ -2459,7 +2467,7 @@ def __init__(self, match_string: str = "", *, matchString: str = "") -> None:
2459
2467
self .matchLen = len (match_string )
2460
2468
self .firstMatchChar = match_string [:1 ]
2461
2469
self .errmsg = f"Expected { self .name } "
2462
- self .mayReturnEmpty = False
2470
+ self ._may_return_empty = False
2463
2471
self .mayIndexError = False
2464
2472
2465
2473
def _generateDefaultName (self ) -> str :
@@ -2480,7 +2488,7 @@ class Empty(Literal):
2480
2488
2481
2489
def __init__ (self , match_string = "" , * , matchString = "" ) -> None :
2482
2490
super ().__init__ ("" )
2483
- self .mayReturnEmpty = True
2491
+ self ._may_return_empty = True
2484
2492
self .mayIndexError = False
2485
2493
2486
2494
def _generateDefaultName (self ) -> str :
@@ -2549,7 +2557,7 @@ def __init__(
2549
2557
if not self .firstMatchChar :
2550
2558
raise ValueError ("null string passed to Keyword; use Empty() instead" )
2551
2559
self .errmsg = f"Expected { type (self ).__name__ } { self .name } "
2552
- self .mayReturnEmpty = False
2560
+ self ._may_return_empty = False
2553
2561
self .mayIndexError = False
2554
2562
self .caseless = caseless
2555
2563
if caseless :
@@ -2719,7 +2727,7 @@ def __init__(
2719
2727
self .errmsg = f"Expected { self .match_string !r} (with up to { self .maxMismatches } mismatches)"
2720
2728
self .caseless = caseless
2721
2729
self .mayIndexError = False
2722
- self .mayReturnEmpty = False
2730
+ self ._may_return_empty = False
2723
2731
2724
2732
def _generateDefaultName (self ) -> str :
2725
2733
return f"{ type (self ).__name__ } :{ self .match_string !r} "
@@ -3078,15 +3086,18 @@ def __init__(
3078
3086
raise ValueError ("null string passed to Regex; use Empty() instead" )
3079
3087
3080
3088
self ._re = None
3089
+ self ._may_return_empty = None # type: ignore [assignment]
3081
3090
self .reString = self .pattern = pattern
3082
3091
3083
3092
elif hasattr (pattern , "pattern" ) and hasattr (pattern , "match" ):
3084
3093
self ._re = pattern
3094
+ self ._may_return_empty = None # type: ignore [assignment]
3085
3095
self .pattern = self .reString = pattern .pattern
3086
3096
3087
3097
elif callable (pattern ):
3088
3098
# defer creating this pattern until we really need it
3089
3099
self .pattern = pattern
3100
+ self ._may_return_empty = None # type: ignore [assignment]
3090
3101
self ._re = None
3091
3102
3092
3103
else :
@@ -3126,13 +3137,24 @@ def re(self) -> re.Pattern:
3126
3137
except re .error :
3127
3138
raise ValueError (f"invalid pattern ({ self .pattern !r} ) passed to Regex" )
3128
3139
else :
3129
- self .mayReturnEmpty = self .re .match ("" , pos = 0 ) is not None
3140
+ self ._may_return_empty = self .re .match ("" , pos = 0 ) is not None
3130
3141
return self ._re
3131
3142
3132
3143
@cached_property
3133
3144
def re_match (self ) -> Callable [[str , int ], Any ]:
3134
3145
return self .re .match
3135
3146
3147
+ @property
3148
+ def mayReturnEmpty (self ):
3149
+ if self ._may_return_empty is None :
3150
+ # force compile of regex pattern, to set may_return_empty flag
3151
+ self .re # noqa
3152
+ return self ._may_return_empty
3153
+
3154
+ @mayReturnEmpty .setter
3155
+ def mayReturnEmpty (self , value ):
3156
+ self ._may_return_empty = value
3157
+
3136
3158
def _generateDefaultName (self ) -> str :
3137
3159
unescaped = repr (self .pattern ).replace ("\\ \\ " , "\\ " )
3138
3160
return f"Re:({ unescaped } )"
@@ -3375,7 +3397,7 @@ def __init__(
3375
3397
3376
3398
self .errmsg = f"Expected { self .name } "
3377
3399
self .mayIndexError = False
3378
- self .mayReturnEmpty = True
3400
+ self ._may_return_empty = True
3379
3401
3380
3402
def _generateDefaultName (self ) -> str :
3381
3403
if self .quote_char == self .end_quote_char and isinstance (
@@ -3502,7 +3524,7 @@ def __init__(
3502
3524
self .minLen = exact
3503
3525
3504
3526
self .errmsg = f"Expected { self .name } "
3505
- self .mayReturnEmpty = self .minLen == 0
3527
+ self ._may_return_empty = self .minLen == 0
3506
3528
self .mayIndexError = False
3507
3529
3508
3530
def _generateDefaultName (self ) -> str :
@@ -3575,7 +3597,7 @@ def __init__(
3575
3597
copy_defaults = True ,
3576
3598
)
3577
3599
# self.leave_whitespace()
3578
- self .mayReturnEmpty = True
3600
+ self ._may_return_empty = True
3579
3601
self .errmsg = f"Expected { self .name } "
3580
3602
3581
3603
self .minLen = min
@@ -3611,7 +3633,7 @@ def parseImpl(self, instring, loc, do_actions=True) -> ParseImplReturnType:
3611
3633
class PositionToken (Token ):
3612
3634
def __init__ (self ) -> None :
3613
3635
supe
F42D
r ().__init__ ()
3614
- self .mayReturnEmpty = True
3636
+ self ._may_return_empty = True
3615
3637
self .mayIndexError = False
3616
3638
3617
3639
@@ -3843,7 +3865,7 @@ class Tag(Token):
3843
3865
3844
3866
def __init__ (self , tag_name : str , value : Any = True ) -> None :
3845
3867
super ().__init__ ()
3846
- self .mayReturnEmpty = True
3868
+ self ._may_return_empty = True
3847
3869
self .mayIndexError = False
3848
3870
self .leave_whitespace ()
3849
3871
self .tag_name = tag_name
@@ -3961,7 +3983,7 @@ def streamline(self) -> ParserElement:
3961
3983
):
3962
3984
self .exprs = other .exprs [:] + [self .exprs [1 ]]
3963
3985
self ._defaultName = None
3964
- self .mayReturnEmpty |= other .mayReturnEmpty
3986
+ self ._may_return_empty |= other .mayReturnEmpty
3965
3987
self .mayIndexError |= other .mayIndexError
3966
3988
3967
3989
other = self .exprs [- 1 ]
@@ -3973,7 +3995,7 @@ def streamline(self) -> ParserElement:
3973
3995
):
3974
3996
self .exprs = self .exprs [:- 1 ] + other .exprs [:]
3975
3997
self ._defaultName = None
3976
- self .mayReturnEmpty |= other .mayReturnEmpty
3998
+ self ._may_return_empty |= other .mayReturnEmpty
3977
3999
self .mayIndexError |= other .mayIndexError
3978
4000
3979
4001
self .errmsg = f"Expected { self } "
@@ -4085,7 +4107,7 @@ def __init__(
4085
4107
4086
4108
super ().__init__ (exprs , savelist )
4087
4109
if self .exprs :
4088
- self .mayReturnEmpty = all (e .mayReturnEmpty for e in self .exprs )
4110
+ self ._may_return_empty = all (e .mayReturnEmpty for e in self .exprs )
4089
4111
if not isinstance (self .exprs [0 ], White ):
4090
4112
self .set_whitespace_chars (
4091
4113
self .exprs [0 ].whiteChars ,
@@ -4095,7 +4117,7 @@ def __init__(
4095
4117
else :
4096
4118
self .skipWhitespace = False
4097
4119
else :
4098
- self .mayReturnEmpty = True
4120
+ self ._may_return_empty = True
4099
4121
self .callPreparse = True
4100
4122
4101
4123
def streamline (self ) -> ParserElement :
@@ -4145,7 +4167,7 @@ def streamline(self) -> ParserElement:
4145
4167
break
4146
4168
cur = typing .cast (ParserElement , next_first )
4147
4169
4148
- self .mayReturnEmpty = all (e .mayReturnEmpty for e in self .exprs )
4170
+ self ._may_return_empty = all (e .mayReturnEmpty for e in self .exprs )
4149
4171
return self
4150
4172
4151
4173
def parseImpl (self , instring , loc , do_actions = True ):
@@ -4222,15 +4244,15 @@ def __init__(
4222
4244
) -> None :
4223
4245
super ().__init__ (exprs , savelist )
4224
4246
if self .exprs :
4225
- self .mayReturnEmpty = any (e .mayReturnEmpty for e in self .exprs )
4247
+ self ._may_return_empty = any (e .mayReturnEmpty for e in self .exprs )
4226
4248
self .skipWhitespace = all (e .skipWhitespace for e in self .exprs )
4227
4249
else :
4228
- self .mayReturnEmpty = True
4250
+ self ._may_return_empty = True
4229
4251
4230
4252
def streamline (self ) -> ParserElement :
4231
4253
super ().streamline ()
4232
4254
if self .exprs :
4233
- self .mayReturnEmpty = any (e .mayReturnEmpty for e in self .exprs )
4255
+ self ._may_return_empty = any (e .mayReturnEmpty for e in self .exprs )
4234
4256
self .saveAsList = any (e .saveAsList for e in self .exprs )
4235
4257
self .skipWhitespace = all (
4236
4258
e .skipWhitespace and not isinstance (e , White ) for e in self .exprs
@@ -4380,10 +4402,10 @@ def __init__(
4380
4402
) -> None :
4381
4403
super ().__init__ (exprs , savelist )
4382
4404
if self .exprs :
4383
- self .mayReturnEmpty = any (e .mayReturnEmpty for e in self .exprs )
4405
+ self ._may_return_empty = any (e .mayReturnEmpty for e in self .exprs )
4384
4406
self .skipWhitespace = all (e .skipWhitespace for e in self .exprs )
4385
4407
else :
4386
- self .mayReturnEmpty = True
4408
+ self ._may_return_empty = True
4387
4409
4388
4410
def streamline (self ) -> ParserElement :
4389
4411
if self .streamlined :
@@ -4392,13 +4414,13 @@ def streamline(self) -> ParserElement:
4392
4414
super ().streamline ()
4393
4415
if self .exprs :
4394
4416
self .saveAsList = any (e .saveAsList for e in self .exprs )
4395
- self .mayReturnEmpty = any (e .mayReturnEmpty for e in self .exprs )
4417
+ self ._may_return_empty = any (e .mayReturnEmpty for e in self .exprs )
4396
4418
self .skipWhitespace = all (
4397
4419
e .skipWhitespace and not isinstance (e , White ) for e in self .exprs
4398
4420
)
4399
4421
else :
4400
4422
self .saveAsList = False
4401
- self .mayReturnEmpty = True
4423
+ self ._may_return_empty = True
4402
4424
return self
4403
4425
4404
4426
def parseImpl (self , instring , loc , do_actions = True ) -> ParseImplReturnType :
@@ -4530,9 +4552,9 @@ def __init__(
4530
4552
) -> None :
4531
4553
super ().__init__ (exprs , savelist )
4532
4554
if self .exprs :
4533
- self .mayReturnEmpty = all (e .mayReturnEmpty for e in self .exprs )
4555
+ self ._may_return_empty = all (e .mayReturnEmpty for e in self .exprs )
4534
4556
else :
4535
- self .mayReturnEmpty = True
4557
+ self ._may_return_empty = True
4536
4558
self .skipWhitespace = True
4537
4559
self .initExprGroups = True
4538
4560
self .saveAsList = True
@@ -4547,9 +4569,9 @@ def __iand__(self, other):
4547
4569
def streamline (self ) -> ParserElement :
4548
4570
super ().streamline ()
4549
4571
if self .exprs :
4550
- self .mayReturnEmpty = all (e .mayReturnEmpty for e in self .exprs )
4572
+ self ._may_return_empty = all (e .mayReturnEmpty for e in self .exprs )
4551
4573
else :
4552
- self .mayReturnEmpty = True
4574
+ self ._may_return_empty = True
<
10000
/code>
4553
4575
return self
4554
4576
4555
4577
def parseImpl (self , instring , loc , do_actions = True ) -> ParseImplReturnType :
@@ -4662,7 +4684,7 @@ def __init__(self, expr: Union[ParserElement, str], savelist: bool = False) -> N
4662
4684
self .expr = expr
4663
4685
if expr is not None :
4664
4686
self .mayIndexError = expr .mayIndexError
4665
- self .mayReturnEmpty = expr .mayReturnEmpty
4687
+ self ._may_return_empty = expr .mayReturnEmpty
4666
4688
self .set_whitespace_chars (
4667
4689
expr .whiteChars , copy_defaults = expr .copyDefaultWhiteChars
4668
4690
)
@@ -4896,7 +4918,7 @@ class FollowedBy(ParseElementEnhance):
4896
4918
4897
4919
def __init__ (self , expr : Union [ParserElement , str ]) -> None :
4898
4920
super ().__init__ (expr )
4899
- self .mayReturnEmpty = True
4921
+ self ._may_return_empty = True
4900
4922
4901
4923
def parseImpl (self , instring , loc , do_actions = True ) -> ParseImplReturnType :
4902
4924
# by using self._expr.parse and deleting the contents of the returned ParseResults list
@@ -4940,7 +4962,7 @@ class PrecededBy(ParseElementEnhance):
4940
4962
def __init__ (self , expr : Union [ParserElement , str ], retreat : int = 0 ) -> None :
4941
4963
super ().__init__ (expr )
4942
4964
self .expr = self .expr ().leave_whitespace ()
4943
- self .mayReturnEmpty = True
4965
+ self ._may_return_empty = True
4944
4966
self .mayIndexError = False
4945
4967
self .exact = False
4946
4968
if isinstance (expr , str_type ):
@@ -5061,7 +5083,7 @@ def __init__(self, expr: Union[ParserElement, str]) -> None:
5061
5083
# self.leave_whitespace()
5062
5084
self .skipWhitespace = False
5063
5085
5064
- self .mayReturnEmpty = True
5086
+ self ._may_return_empty = True
5065
5087
self .errmsg = f"Found unwanted token, { self .expr } "
5066
5088
5067
5089
def parseImpl (self , instring , loc , do_actions = True ) -> ParseImplReturnType :
@@ -5204,7 +5226,7 @@ def __init__(
5204
5226
stopOn : typing .Optional [Union [ParserElement , str ]] = None ,
5205
5227
) -> None :
5206
5228
super ().__init__ (expr , stopOn = stopOn or stop_on )
5207
- self .mayReturnEmpty = True
5229
+ self ._may_return_empty = True
5208
5230
5209
5231
def parseImpl (self , instring , loc , do_actions = True ) -> ParseImplReturnType :
5210
5232
try :
@@ -5337,7 +5359,7 @@ def __init__(
5337
5359
super ().__init__ (expr , savelist = False )
5338
5360
self .saveAsList = self .expr .saveAsList
5339
5361
self .defaultValue = default
5340
- self .mayReturnEmpty = True
5362
+ self ._may_return_empty = True
5341
5363
5342
5364
def parseImpl (self , instring , loc , do_actions = True ) -> ParseImplReturnType :
5343
5365
self_expr = self .expr
@@ -5442,7 +5464,7 @@ def __init__(
5442
5464
super ().__init__ (other )
5443
5465
failOn = failOn or fail_on
5444
5466
self .ignoreExpr = ignore
5445
- self .mayReturnEmpty = True
5467
+ self ._may_return_empty = True
5446
5468
self .mayIndexError = False
5447
5469
self .includeMatch = include
5448
5470
self .saveAsList = False
@@ -5568,7 +5590,7 @@ def __lshift__(self, other) -> Forward:
5568
5590
self .expr = other
5569
5591
self .streamlined = other .streamlined
5570
5592
self .mayIndexError = self .expr .mayIndexError
5571
- self .mayReturnEmpty = self .expr .mayReturnEmpty
5593
+ self ._may_return_empty = self .expr .mayReturnEmpty
5572
5594
self .set_whitespace_chars (
5573
5595
self .expr .whiteChars , copy_defaults = self .expr .copyDefaultWhiteChars
5574
5596
)
0 commit comments