1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
Ë
dñúhð:ãóN—dZddlZGd„de«ZGd„d«ZGd„d«Zy)    zÇ
This module contains a tokenizer for Excel formulae.
 
The tokenizer is based on the Javascript tokenizer found at
http://ewbi.blogs.com/develops/2004/12/excel_formula_p.html written by Eric
Bachtal
éNcó—eZdZdZy)ÚTokenizerErrorz$Base class for all Tokenizer errors.N)Ú__name__Ú
__module__Ú __qualname__Ú__doc__©óúMH:\Change_password\venv_build\Lib\site-packages\openpyxl/formula/tokenizer.pyrr s„Ú.r
rcó—eZdZdZej
d«Zej
d«Zej
d«ej
d«dœZdZ    dZ
d    „Z d
„Z d „Z d „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zdd„Zd„Zd„Zy)Ú    Tokenizera^
    A tokenizer for Excel worksheet formulae.
 
    Converts a str string representing an Excel formula (in A1 notation)
    into a sequence of `Token` objects.
 
    `formula`: The str string to tokenize
 
    Tokenizer defines a method `._parse()` to parse the formula into tokens,
    which can then be accessed through the `.items` attribute.
 
    z^[1-9](\.[0-9]+)?[Ee]$z[ \n]+z"(?:[^"]*"")*[^"]*"(?!")z'(?:[^']*'')*[^']*'(?!')©ú"ú')z#NULL!z#DIV/0!z#VALUE!z#REF!z#NAME?z#NUM!z#N/Az #GETTING_DATAz,;}) +-*/^&=><%cój—||_g|_g|_d|_g|_|j «y)Nr)ÚformulaÚitemsÚ token_stackÚoffsetÚtokenÚ_parse)Úselfrs  r Ú__init__zTokenizer.__init__.s/€ØˆŒ ؈Œ
؈ÔàˆŒ ؈Œ
Ø  ‰  r
c
ó2—|jry|jsy|jddk(r|xjdz c_n>|jjt    |jtj
««yd|j fd|jfd|jfd|jfd    |jfd
|jfd |jfd |jfd |jff    }i}|D]*\}}|jtj!||««Œ,|jt#|j«kr½|j%«rŒ3|j|j}||j&vr|j)«||vr|xj||«z c_n0|j*j|«|xjdz c_|jt#|j«krŒ½|j)«y)z5Populate self.items with the tokens from the formula.Nrú=éz"'ú[ú#ú ú
z
+-*/^&=><%z{(ú)}z;,)rrrÚappendÚTokenÚLITERALÚ _parse_stringÚ_parse_bracketsÚ _parse_errorÚ_parse_whitespaceÚ_parse_operatorÚ _parse_openerÚ _parse_closerÚ_parse_separatorÚupdateÚdictÚfromkeysÚlenÚcheck_scientific_notationÚ TOKEN_ENDERSÚ
save_tokenr)rÚ    consumersÚ
dispatcherÚcharsÚconsumerÚ    curr_chars      r rzTokenizer._parse7sÄ€à ;Š;Ø Ø|Š|Ø Ø \‰\˜!‰_ Ò #Ø KŠK˜1Ñ ŽKà J‰J× Ñ œe D§L¡L´%·-±-Ó@Ô AØ à D×&Ñ&Ð 'Ø $×&Ñ&Ð 'Ø $×#Ñ#Ð $Ø $×(Ñ(Ð )Ø 4×)Ñ)Ð *Ø ˜4×/Ñ/Ð 0Ø 4×%Ñ%Ð &Ø 4×%Ñ%Ð &Ø 4×(Ñ(Ð )ð
 
ˆ    ðˆ
Ø(ò    >‰OˆE8Ø × Ñ œdŸm™m¨E°8Ó<Õ =ð    >àk‰kœC § ¡ Ó-Ò-Ø×-Ñ-Ô/ØØŸ ™  T§[¡[Ñ1ˆIؘD×-Ñ-Ñ-Ø—‘Ô!ؘJÑ&Ø— ’ Ð4˜z¨)Ñ4Ó6Ñ6– ð—
‘
×!Ñ! )Ô,Ø— ’ ˜qÑ • ðk‰kœC § ¡ Ó-Ó-ð     ‰Õr
có—|jd¬«|j|j}|dvsJ‚|j|}|j    |j|jd«}|€$|dk(rdnd}t d|›d    |j›«‚|j d
«}|dk(r9|jjtj|««t|«S|jj|«t|«S) a¹
        Parse a "-delimited string or '-delimited link.
 
        The offset must be pointing to either a single quote ("'") or double
        quote ('"') character. The strings are parsed according to Excel
        rules where to escape the delimiter you just double it up. E.g.,
        "abc""def" in Excel is parsed as 'abc"def' in Python.
 
        Returns the number of characters matched. (Does not update
        self.offset)
 
        ú:©Ú
can_followrNrÚstringÚlinkz%Reached end of formula while parsing z in r) Úassert_empty_tokenrrÚSTRING_REGEXESÚmatchrÚgrouprr"r#Ú make_operandrr0)rÚdelimÚregexrAÚsubtypes     r r%zTokenizer._parse_string_sñ€ð     ×Ѩ3ÐÔ/Ø— ‘ ˜TŸ[™[Ñ)ˆØ˜
Ñ"Ð"Ð"Ø×#Ñ# EÑ*ˆØ— ‘ ˜DŸL™L¨¯©¨Ð6Ó7ˆØ ˆ=Ø"'¨3¢,‘h°FˆGÜ Ð#HÈÈ    ÐQUÐVZ×VbÑVbÐUcÐ!dÓeÐ eØ— ‘ ˜A“ˆØ CŠ<Ø J‰J× Ñ œe×0Ñ0°Ó7Ô 8ô5‹zÐð J‰J× Ñ ˜eÔ $ܐ5‹zÐr
có~—|j|jdk(sJ‚tjd|j|jd«Dcgc]}|j    «df‘Œ}}tjd|j|jd«Dcgc]}|j    «df‘Œ}}d}t ||z«D]W\}}||z }|dk(sŒ|dz}|j j|j|j|j|z«|cStd|j›«‚cc}wcc}w)    zœ
        Consume all the text between square brackets [].
 
        Returns the number of characters matched. (Does not update
        self.offset)
 
        rz\[Nrz\]éÿÿÿÿrzEncountered unmatched '[' in )    rrÚreÚfinditerÚstartÚsortedrr"r)rÚtÚleftsÚrightsÚ
open_countÚidxÚ
open_closeÚ outer_rights        r r&zTokenizer._parse_brackets{s7€ð|‰|˜DŸK™KÑ(¨CÒ/Ð/Ð/ä—‘˜U D§L¡L°·±°Ð$>Ó?öA A!—'‘'“)˜Q’ðAˆðAô—+‘+˜e T§\¡\°$·+±+°,Ð%?Ó@öB a1—7‘7“9˜b’/ðBˆðBðˆ
Ü% e¨f¡nÓ5ò    #‰OˆCØ ˜*Ñ $ˆJؘQ‹Ø! A™g Ø—
‘
×!Ñ!Ø—L‘L §¡¨T¯[©[¸;Ñ-FÐGôIà"Ò"ð     #ôÐ<¸T¿\¹\¸NÐKÓLÐLùòAùòBs ÁD5ÂD:cóð—|jd¬«|j|jdk(sJ‚|j|jd}|jD]y}|j    |«sŒ|j
j tjdj|j«|z««|jdd…=t|«cStd|j›d|j›d«‚)    zÃ
        Consume the text following a '#' as an error.
 
        Looks for a match in self.ERROR_CODES and returns the number of
        characters matched. (Does not update self.offset)
 
        ú!r;rNÚzInvalid error code at position ú in 'r) r?rrÚ ERROR_CODESÚ
startswithrr"r#rCÚjoinrr0r)rÚ
subformulaÚerrs   r r'zTokenizer._parse_error”sԀð     ×Ѩ3ÐÔ/؏|‰|˜DŸK™KÑ(¨CÒ/Ð/Ð/Ø—\‘\ $§+¡+ ,Ð/ˆ
Ø×#Ñ#ò     ˆCØ×$Ñ$ SÕ)Ø—
‘
×!Ñ!¤%×"4Ñ"4°R·W±W¸T¿Z¹ZÓ5HÈ3Ñ5NÓ"OÔPØ—J‘JšqMܘ3“x’ð         ô
Ð>¸t¿{¹{¸mÈ5ÐQU×Q]ÑQ]ÐP^Ð^_Ð`ÓaÐar
cóP—|j|jdvsJ‚|jjt    |j|jtj
««|j j|j|jd«j«S)z†
        Consume a string of consecutive spaces.
 
        Returns the number of spaces found. (Does not update self.offset).
 
        )rr N)    rrrr"r#ÚWSPACEÚ    WSPACE_RErAÚend©rs r r(zTokenizer._parse_whitespace¦sv€ð|‰|˜DŸK™KÑ(¨KÑ7Ð7Ð7Ø 
‰
×Ñœ% § ¡ ¨T¯[©[Ñ 9¼5¿<¹<ÓHÔI؏~‰~×#Ñ# D§L¡L°·±°Ð$>Ó?×CÑCÓEÐEr
có¾—|j|j|jdzdvrX|jjt    |j|j|jdztj
««y|j|j}|dvsJ‚|dk(rt    dtj «}n|dvrt    |tj
«}nã|jst    |tj«}n¼td„t|j«D«d«}|xr[|jtjk(xs<|jtj k(xs|jtjk(}|rt    |tj
«}nt    |tj«}|jj|«y)    z
        Consume the characters constituting an operator.
 
        Returns the number of characters consumed. (Does not update
        self.offset)
 
        é)z>=z<=z<>z
%*/^&=><+-ú%z*/^&=><c3óZK—|]#}|jtjk7r|–—Œ%y­w©N)Útyper#r^)Ú.0Úis  r ú    <genexpr>z,Tokenizer._parse_operator.<locals>.<genexpr>És'èø€ò4˜qØŸF™F¤e§l¡lÒ2ôñ4ùs‚)+Nr)rrrr"r#ÚOP_INÚOP_POSTÚOP_PREÚnextÚreversedrFÚCLOSErgÚOPERAND)rr8rÚprevÚis_infixs     r r)zTokenizer._parse_operator±sm€ð <‰<˜Ÿ ™  D§K¡K°!¡OÐ 4Ð8JÑ JØ J‰J× Ñ œeØ— ‘ ˜TŸ[™[¨¯©°q©Ð9Ü— ‘ óô ðØ—L‘L §¡Ñ-ˆ    Ø˜LÑ(Ð(Ð(Ø ˜Ò ܘ#œuŸ}™}Ó-ŠEØ ˜)Ñ #ܘ)¤U§[¡[Ó1‰Eà—’Ü˜)¤U§\¡\Ó2‰Eäñ4¤H¨T¯Z©ZÓ$8ô4Ø59ó;ˆDàòØ— ‘ ¤§ ¡ Ñ+ò.Ø—9‘9¤§ ¡ Ñ-ò.à—9‘9¤§ ¡ Ñ-ð ñ
ܘi¬¯©Ó5‘ä˜i¬¯©Ó6Ø 
‰
×ј%Ô Ør
cóö—|j|jdvsJ‚|j|jdk(r&|j«tj    d«}nd|j
rCdj |j
«dz}|j
dd…=tj    |«}ntj    d«}|jj|«|jj|«y)z‰
        Consumes a ( or { character.
 
        Returns the number of characters consumed. (Does not update
        self.offset)
 
        )ú(ú{rvrVruNr)
rrr?r#Ú make_subexprrZrr"r)rrÚ token_values   r r*zTokenizer._parse_opener×s€ð|‰|˜DŸK™KÑ(¨JÑ6Ð6Ð6Ø <‰<˜Ÿ ™ Ñ $¨Ò +Ø × #Ñ #Ô %Ü×%Ñ% cÓ*‰EØ ZŠZØŸ'™' $§*¡*Ó-°Ñ3ˆKØ—
‘
š1 Ü×%Ñ% kÓ2‰Eä×%Ñ% cÓ*ˆEØ 
‰
×ј%Ô Ø ×Ñ×Ñ Ô&Ør
có@—|j|jdvsJ‚|jj«j    «}|j
|j|jk7rt d|jz«‚|jj|«y)z‰
        Consumes a } or ) character.
 
        Returns the number of characters consumed. (Does not update
        self.offset)
 
        )ú)ú}zMismatched ( and { pair in '%s'r)    rrrÚpopÚ
get_closerÚvaluerrr")rrs  r r+zTokenizer._parse_closerís…€ð|‰|˜DŸK™KÑ(¨JÑ6Ð6Ð6Ø× Ñ ×$Ñ$Ó&×1Ñ1Ó3ˆØ ;‰;˜$Ÿ,™, t§{¡{Ñ3Ò 3Ü Ø1°D·L±LÑ@óBð Bà 
‰
×ј%Ô Ør
có¼—|j|j}|dvsJ‚|dk(rtjd«}n^    |jdj
}|tj k(rtdtj«}ntjd«}    |jj|«y#t$rtdtj«}YŒAwxYw)z‰
        Consumes a ; or , character.
 
        Returns the number of characters consumed. (Does not update
        self.offset)
 
        )ú;ú,r€rHrr) rrr#Úmake_separatorrrgÚPARENrkÚ
IndexErrorrr")rr8rÚtop_types    r r,zTokenizer._parse_separatorýs»€ð—L‘L §¡Ñ-ˆ    Ø˜JÑ&Ð&Ð&Ø ˜Ò Ü×(Ñ(¨Ó-‰Eð 6Ø×+Ñ+¨BÑ/×4Ñ4ðœuŸ{™{Ò*Ü! #¤u§{¡{Ó3‘Eä!×0Ñ0°Ó5‘EØ 
‰
×ј%Ô Øøôò 0ܘc¤5§;¡;Ó/’ð 0ús¼B5Â5#CÃCcó8—|j|j}|dvr}t|j«dk\re|jj dj |j««r1|jj|«|xjdz c_yy)z¾
        Consumes a + or - character if part of a number in sci. notation.
 
        Returns True if the character was consumed and self.offset was
        updated, False otherwise.
 
        z+-rrVTF)rrr0rÚSN_RErArZr")rr8s  r r1z#Tokenizer.check_scientific_notationss€ð—L‘L §¡Ñ-ˆ    Ø ˜Ñ ܘŸ
™
“O qÒ(Ø—J‘J×$Ñ$ R§W¡W¨T¯Z©ZÓ%8Ô9Ø J‰J× Ñ ˜iÔ (Ø KŠK˜1Ñ KØØr
cóŒ—|jr8|jd|vr&td|j›d|j›d«‚yy)a:
        Ensure that there's no token currently being parsed.
 
        Or if there is a token being parsed, it must end with a character in
        can_follow.
 
        If there are unconsumed token contents, it means we hit an unexpected
        token transition. In this case, we raise a TokenizerError
 
        rHz!Unexpected character at position rWrN)rrrr)rr<s  r r?zTokenizer.assert_empty_token'sJ€ð :Š:˜$Ÿ*™* R™.°
Ñ:Ü Ð#DÀTÇ[Á[ÀMÐQVÐW[×WcÑWcÐVdÐdeÐ!fÓgÐ gð;ˆ:r
cóʗ|jrW|jjtj    dj |j«««|jdd…=yy)z9If there's a token being parsed, add it to the item list.rVN)rrr"r#rCrZras r r3zTokenizer.save_token5sC€à :Š:Ø J‰J× Ñ œe×0Ñ0°·±¸¿¹Ó1DÓEÔ FØ—
‘
š1‘ ð r
cóì—|jsy|jdjtjk(r|jdjSddj d„|jD««zS)z+Convert the parsed tokens back to a string.rVrrc3ó4K—|]}|j–—Œy­wrf)r~)rhrs  r rjz#Tokenizer.render.<locals>.<genexpr>Asèø€ÒA¨U˜UŸ[[ÑAùs‚)rrgr#r$r~rZras r ÚrenderzTokenizer.render;sX€àzŠzØØ Z‰Z˜‰]× Ñ ¤5§=¡=Ò 0Ø—:‘:˜a‘=×&Ñ&Ð &ؐR—W‘WÑA°d·j±jÔAÓAÑAÐAr
N)r    )rrrrrIÚcompiler‡r_r@rXr2rrr%r&r'r(r)r*r+r,r1r?r3rŒr    r
r r r sª„ñ ð ˆBJ‰JÐ0Ó 1€Eؐ—
‘
˜9Ó%€Ið ˆRZ‰ZÐ2Ó 3Ø ˆRZ‰ZÐ2Ó 3ñ €Nð5€Kà$€Lòò&òPò8Mò2bò$    Fò$òLò,ò ò2ó" hòó Br
r cóª—eZdZdZgd¢ZdZdZdZdZdZ    dZ
d    Z d
Z d Z d Zdd „ZdZdZdZdZdZd„Zed„«ZdZdZedd„«Zd„ZdZdZed„«Zy)r#a)
    A token in an Excel formula.
 
    Tokens have three attributes:
 
    * `value`: The string value parsed that led to this token
    * `type`: A string identifying the type of token
    * `subtype`: A string identifying subtype of the token (optional, and
                 defaults to "")
 
    ©r~rgrFr$rqÚFUNCÚARRAYrƒÚSEPzOPERATOR-PREFIXzOPERATOR-INFIXzOPERATOR-POSTFIXz WHITE-SPACEcó.—||_||_||_yrfr)rr~Útype_rFs    r rzToken.__init___s€ØˆŒ
؈Œ    Øˆ r
ÚTEXTÚNUMBERÚLOGICALÚERRORÚRANGEcód—dj|j|j|j«S)Nz {0} {1} {2}:)ÚformatrgrFr~ras r Ú__repr__zToken.__repr__qs#€Ø×%Ñ% d§i¡i°·±¸t¿z¹zÓJÐJr
có*—|jd«r |j}nG|jd«r |j}n)|dvr |j}n    t    |«|j
}|||j|«S#t $r|j}YŒ+wxYw)zCreate an operand token.rr)ÚTRUEÚFALSE)    rYr•r˜r—Úfloatr–Ú
ValueErrorr™rq©Úclsr~rFs   r rCzToken.make_operandtsˆ€ð × Ñ ˜CÔ  Ø—h‘h‰GØ × Ñ ˜cÔ "Ø—i‘i‰GØ Ð'Ñ 'Ø—k‘k‰Gð $ܐe” ØŸ*™*ñ5˜#Ÿ+™+ wÓ/Ð/øôò $ØŸ)™)’ð $úsÁA:Á:BÂBÚOPENrpcó*—|ddvsJ‚|r)tjd|«sJ‚tj}n:|dvrtj}n%|dvrtj
}ntj}|dvr |j n |j}||||«S)z•
        Create a subexpression token.
 
        `value`: The value of the token
        `func`: If True, force the token to be of type FUNC
 
        rH)rvr{rurzz.+\(|\)z{}z()r!)rIrAr#rr‘rƒrpr¤)r£r~Úfuncr”rFs     r rwzToken.make_subexp‘s„€ðR‰yÐ0Ñ0Ð0Ð0Ù Ü—8‘8˜K¨Ô/Ð /Ð/Ü—J‘J‰EØ d‰]Ü—K‘K‰EØ d‰]Ü—K‘K‰Eä—J‘JˆEØ$¨™}#—)’)°#·(±(ˆÙ5˜% Ó)Ð)r
có(—|j|j|j|jfvsJ‚|j|j
k(sJ‚|j|jk(rdnd}|j ||j|jk(¬«S)z6Return a closing token that matches this token's type.r{rz)r¦)rgrr‘rƒrFr¤rw)rr~s  r r}zToken.get_closer§sv€ày‰y˜TŸY™Y¨¯
©
°D·J±JÐ?Ñ?Ð?Ð?؏|‰|˜tŸy™yÒ(Ð(Ð(Ø—y‘y D§J¡JÒ.‘°CˆØ×Ñ ¨D¯I©I¸¿¹Ñ,BÐÓCÐCr
ÚARGÚROWcóp—|dvsJ‚|dk(r |jn |j}|||j|«S)zCreate a separator token)rr€r)r¨r©r’r¢s   r r‚zToken.make_separator¹s:€ð˜
Ñ"Ð"Ð"Ø" cš\#—'’'¨s¯w©wˆÙ5˜#Ÿ'™' 7Ó+Ð+r
N)rV)F)rrrrÚ    __slots__r$rqrr‘rƒr’rmrkrlr^rr•r–r—r˜r™rœÚ classmethodrCr¤rprwr}r¨r©r‚r    r
r r#r#Ds¼„ñ
ò-€Ià€GØ€GØ €DØ €EØ €EØ
€CØ €FØ €EØ €GØ €Fóð €DØ €FØ€GØ €EØ €EòKðñ0óð0ð2 €DØ €Eàò*óð*ò*Dð €CØ
€Càñ,óñ,r
r#)rrIÚ    Exceptionrr r#r    r
r ú<module>r®s6ðñó
ô/Yô/÷qBñqB÷h    z,òz,r