@@ -1881,9 +1881,14 @@ def _generateDefaultName(self) -> str:
1881
1881
Child classes must define this method, which defines how the ``default_name`` is set.
1882
1882
"""
1883
1883
1884
- def set_name (self , name : str ) -> "ParserElement" :
1884
+ def set_name (self , name : typing . Optional [ str ] ) -> "ParserElement" :
1885
1885
"""
1886
- Define name for this expression, makes debugging and exception messages clearer.
1886
+ Define name for this expression, makes debugging and exception messages clearer. If
1887
+ `__diag__.enable_debug_on_named_expressions` is set to True, setting a name will also
1888
+ enable debug for this expression.
1889
+
1890
+ If `name` is None, clears any custom name for this expression, and clears the
1891
+ debug flag is it was enabled via `__diag__.enable_debug_on_named_expressions`.
1887
1892
1888
1893
Example::
1889
1894
@@ -1894,16 +1899,22 @@ def set_name(self, name: str) -> "ParserElement":
1894
1899
integer.parse_string("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1)
1895
1900
"""
1896
1901
self .customName = name
1897
- self .errmsg = f"Expected { self .name } "
1902
+ self .errmsg = f"Expected { str (self )} "
1903
+
1898
1904
if __diag__ .enable_debug_on_named_expressions :
1899
- self .set_debug ()
1905
+ self .set_debug (name is not None )
1906
+
1900
1907
return self
1901
1908
1902
1909
@property
1903
1910
def name (self ) -> str :
1904
1911
# This will use a user-defined name if available, but otherwise defaults back to the auto-generated name
1905
1912
return self .customName if self .customName is not None else self .default_name
1906
1913
1914
+ @name .setter
1915
+ def name (self , new_name ) -> None :
1916
+ self .set_name (new_name )
1917
+
1907
1918
def __str__ (self ) -> str :
1908
1919
return self .name
1909
1920
@@ -3580,7 +3591,7 @@ def __init__(self):
3580
3591
self .orig_whiteChars = set () | self .whiteChars
3581
3592
self .whiteChars .discard ("\n " )
3582
3593
self .skipper = Empty ().set_whitespace_chars (self .whiteChars )
3583
- self .errmsg = "Expected start of line"
3594
+ self .set_name ( " start of line")
3584
3595
3585
3596
def preParse (self , instring : str , loc : int ) -> int :
3586
3597
if loc == 0 :
@@ -3609,7 +3620,7 @@ def __init__(self):
3609
3620
super ().__init__ ()
3610
3621
self .whiteChars .discard ("\n " )
3611
3622
self .set_whitespace_chars (self .whiteChars , copy_defaults = False )
3612
- self .errmsg = "Expected end of line"
3623
+ self .set_name ( " end of line")
3613
3624
3614
3625
def parseImpl (self , instring , loc , do_actions = True ) -> ParseImplReturnType :
3615
3626
if loc < len (instring ):
@@ -3630,7 +3641,7 @@ class StringStart(PositionToken):
3630
3641
3631
3642
def __init__ (self ):
3632
3643
super ().__init__ ()
3633
- self .errmsg = "Expected start of text"
3644
+ self .set_name ( " start of text")
3634
3645
3635
3646
def parseImpl (self , instring , loc , do_actions = True ) -> ParseImplReturnType :
3636
3647
# see if entire string up to here is just whitespace and ignoreables
@@ -3647,7 +3658,7 @@ class StringEnd(PositionToken):
3647
3658
3648
3659
def __init__ (self ):
3649
3660
super ().__init__ ()
3650
- self .errmsg = "Expected end of text"
3661
+ self .set_name ( " end of text")
3651
3662
3652
3663
def parseImpl (self , instring , loc , do_actions = True ) -> ParseImplReturnType :
3653
3664
if loc < len (instring ):
@@ -3674,7 +3685,7 @@ def __init__(self, word_chars: str = printables, *, wordChars: str = printables)
3674
3685
wordChars = word_chars if wordChars == printables else wordChars
3675
3686
super ().__init__ ()
3676
3687
self .wordChars = set (wordChars )
3677
- self .errmsg = "Not at the start of a word"
3688
+ self .set_name ( " start of a word")
3678
3689
3679
3690
def parseImpl (self , instring , loc , do_actions = True ) -> ParseImplReturnType :
3680
3691
if loc != 0 :
@@ -3700,7 +3711,7 @@ def __init__(self, word_chars: str = printables, *, wordChars: str = printables)
3700
3711
super ().__init__ ()
3701
3712
self .wordChars = set (wordChars )
3702
3713
self .skipWhitespace = False
3703
- self .errmsg = "Not at the end of a word"
3714
+ self .set_name ( " end of a word")
3704
3715
3705
3716
def parseImpl (self , instring , loc , do_actions = True ) -> ParseImplReturnType :
3706
3717
instrlen = len (instring )
@@ -4519,6 +4530,8 @@ def parseImpl(self, instring, loc, do_actions=True):
4519
4530
4520
4531
try :
4521
4532
return self .expr ._parse (instring , loc , do_actions , callPreParse = False )
4533
+ except ParseSyntaxException :
4534
+ raise
4522
4535
except ParseBaseException as pbe :
4523
4536
if not isinstance (self , Forward ) or self .customName is not None :
4524
4537
if self .errmsg :
0 commit comments