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
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
U
Þ=®d«šã @sUdZddlZddlZddlmZddlmZddlmZddlm    Z    ddlm
Z
ej rlddl Z dd    lmZe d
ejej¡Ze d ejej¡Zed d ddddddddddg ƒZeddddddgƒZejejejejejejdœZ ej!e"ej#ej$fe%d<Gd d!„d!ƒZ&dS)"z8Parse tokens from the lexer into nodes for the compiler.éNé)Únodes)ÚTemplateAssertionError)ÚTemplateSyntaxError)Údescribe_token)Údescribe_token_expr)Ú EnvironmentÚ_ImportIncludeÚ
_MacroCallÚforÚifÚblockZextendsÚprintÚmacroÚincludeÚfromÚimportÚsetÚwithÚ
autoescapeÚeqÚneÚltZlteqÚgtZgteq)ÚaddÚsubÚmulÚdivÚfloordivÚmodÚ _math_nodesc
@s
eZdZdZdƒdeejeejeejeddœdd„Zdefeeje    ej
eddœd    d
„Z ejeej ej ed feje    dd œd d„Zd„eeje    ddœdd„Zd…ejej ed feje    ddœdd„Zd†ejej ed fedœdd„Zd‡eje    ejdœdd„Zejejej ejfdœdd„Zdˆej ed feej ejdœd d!„Zejejejfdœd"d#„Zejdœd$d%„Zejdœd&d'„Z ej!dœd(d)„Z"ej#dœd*d+„Z$ej%dœd,d-„Z&ej'dœd.d/„Z(e)ee)d0œd1d2„Z*ej+dœd3d4„Z,ej-dœd5d6„Z.ej/dœd7d8„Z0e1dd9œd:d;„Z2ej3dœd<d=„Z4ej5dœd>d?„Z6ej7dœd@dA„Z8ej9dœdBdC„Z:e;j<d‰edDej=dEœdFdG„ƒZ>e;j<dŠeeejej ed feejej?ej=ej fdIœdJdG„ƒZ>d‹eeejej ed feejej?ej=ej fdIœdKdG„Z>dŒeej@dLœdMdN„ZAej@dœdOdP„ZBej@dœdQdR„ZCej@dœdSdT„ZDej@dœdUdV„ZEej@dœdWdX„ZFej@dœdYdZ„ZGej@dœd[d\„ZHej@dœd]d^„ZIej@dœd_d`„ZJdeej@daœdbdc„ZKej@dœddde„ZLdŽeeejej ed feejej ej@fdfœdgdh„ZMej dœdidj„ZNejOdœdkdl„ZPej@ej@d9œdmdn„ZQej@ej@d9œdodp„ZRej@ejejSejTfd9œdqdr„ZUej@dœdsdt„ZVej dœdudv„ZWej@ejXd9œdwdx„ZYdejej@eejej@dyœdzd{„ZZej@ej@d9œd|d}„Z[dejej ed fej ejd~œdd€„Z\ej]dœdd‚„Z^dS)‘ÚParserz…This is the central parsing class Jinja uses.  It's passed to
    extensions and can be used to parse expressions or statements.
    Nr)Ú environmentÚsourceÚnameÚfilenameÚstateÚreturncCsl||_| ||||¡|_||_||_d|_i|_| ¡D]}|jD]}|j    |j|<qBq8d|_
g|_ g|_ dS)NFr) r"Ú    _tokenizeÚstreamr$r%ÚclosedÚ
extensionsZiter_extensionsÚtagsÚparseÚ_last_identifierÚ
_tag_stackÚ_end_token_stack)Úselfr"r#r$r%r&Ú    extensionÚtag©r4úDd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\jinja2/parser.pyÚ__init__3sþ 
zParser.__init__z te.NoReturn)ÚmsgÚlinenoÚexcr'cCs(|dkr|jjj}||||j|jƒ‚dS)z Convenience method that raises `exc` with the message, passed
        line number or last line number as well as the current name and
        filename.
        N)r)Úcurrentr8r$r%)r1r7r8r9r4r4r5ÚfailJs
 
z Parser.fail.)r$Úend_token_stackr8r'cCsÐtƒ}|D]}| tt|ƒ¡q
|r@d tttt|dƒƒ¡}nd}|dkrTdg}nd|›dg}|rœ|dk    rŠ||krŠ| d|›d¡n| d|›d¡|jrº| d|jd›d¡| d     |¡|¡dS)
Nz or éÿÿÿÿzUnexpected end of template.zEncountered unknown tag Ú.z\You probably made a nesting mistake. Jinja is expecting this tag, but currently looking for z*Jinja was looking for the following tags: z/The innermost block that needs to be closed is ú )    rÚupdateÚmaprÚjoinÚreprÚappendr/r;)r1r$r<r8ÚexpectedÚexprsZcurrently_lookingÚmessager4r4r5Ú _fail_ut_eofXs0ÿ
ÿ
ÿÿzParser._fail_ut_eof)r$r8r'cCs| ||j|¡dS)z¤Called if the parser encounters an unknown tag.  Tries to fail
        with a human readable error message that could help to identify
        the problem.
        N)rHr0)r1r$r8r4r4r5Úfail_unknown_tag€szParser.fail_unknown_tag)Ú
end_tokensr8r'cCs.t|jƒ}|dk    r| |¡| d||¡dS)z9Like fail_unknown_tag but for end of template situations.N)Úlistr0rDrH)r1rJr8Ústackr4r4r5Úfail_eof‰s
 
zParser.fail_eof)Úextra_end_rulesr'cCs,|jjjdkrdS|dk    r(|jj |¡SdS)zAre we at the end of a tuple?)Ú variable_endÚ    block_endÚrparenTNF)r)r:ÚtypeÚtest_any)r1rNr4r4r5Ú is_tuple_end”s
zParser.is_tuple_end)r8r'cCs8|jd7_t tj¡}tjj|d|j›|d|S)zDReturn a new free identifier as :class:`~jinja2.nodes.InternalName`.rÚfi©r8)r.ÚobjectÚ__new__rÚ InternalNameÚNoder6)r1r8Úrvr4r4r5Úfree_identifieržs zParser.free_identifier©r'cCsâ|jj}|jdkr | d|j¡|j |j¡d}zš|jt    kr^t
|d|jjj›ƒ}|ƒW¢rS|jdkrt|  ¡W¢\S|jdkrŠ|  ¡W¢FS|j  |j¡}|dk    r¬||ƒW¢$S|j ¡d}| |j|j¡W5|rÜ|j ¡XdS)    zParse a single statement.r$ztag name expectedTZparse_ÚcallÚfilterNF)r)r:rRr;r8r/rDÚvalueÚpopÚ_statement_keywordsÚgetattrÚparse_call_blockÚparse_filter_blockr+ÚgetrI)r1ÚtokenZpop_tagÚfÚextr4r4r5Úparse_statement¥s*
 
 
 
 
 
zParser.parse_statementF)rJÚ drop_needler'cCsL|j d¡|j d¡| |¡}|jjjdkr:| |¡|rHt|jƒ|S)aRParse multiple statements into a list until one of the end tokens
        is reached.  This is used to parse the body of statements as it also
        parses template data if appropriate.  The parser checks first if the
        current token is a colon and skips it if there is one.  Then it checks
        for the block end and parses until if one of the `end_tokens` is
        reached.  Per default the active token in the stream at the end of
        the call is the matched end token.  If this is not wanted `drop_needle`
        can be set to `True` and the end token is removed.
        ÚcolonrPÚeof)r)Úskip_ifÚexpectÚsubparser:rRrMÚnext)r1rJrkÚresultr4r4r5Úparse_statementsÂs  
 
 
zParser.parse_statementscCsft|jƒj}|jdd}|j d¡r<| ¡}tj|||dS| d¡}|j    ddd}tj
||||dS)zParse an assign statement.T)Úwith_namespaceÚassignrVN)z name:endset©rk) rqr)r8Úparse_assign_targetrnÚ parse_tuplerÚAssignÚ parse_filterrsÚ AssignBlock)r1r8ÚtargetÚexprZ filter_nodeÚbodyr4r4r5Ú    parse_setßs   
zParser.parse_setc    Csž|j d¡j}|jdd}|j d¡|jddd}d}|j d    ¡rL| ¡}|j d
¡}| d ¡}t|jƒj    d krxg}n|jd dd}t
j |||||||dS)zParse a for loop.zname:for)úname:in)rNr€F)úname:recursive)Ú with_condexprrNNúname:ifr)ú name:endforú    name:elseZendfor)r„TrvrV) r)ror8rwrxrnÚparse_expressionrsrqr`rÚFor)r1r8r|ÚiterÚtestÚ    recursiver~Úelse_r4r4r5Ú    parse_forês   ÿ  
zParser.parse_forcCs˜tj|j d¡jd}}|jdd|_| d¡|_g|_    g|_
t |jƒ}| d¡rvtj|jj jd}|j      |¡qq”| d¡r”|jdd    d
|_
q”q|S) zParse an if construct.rƒrVF©r‚)ú    name:elifr…ú
name:endifrŽr…)rTrv)rÚIfr)ror8rxr‰rsr~Zelif_r‹rqr:rD)r1Únoderrrgr4r4r5Úparse_ifýs 
 
 
zParser.parse_ifcCs’tjt|jƒjd}g}g}|jjjdkrr|r:|j d¡| ¡}|     d¡| 
|¡|j d¡| 
|  ¡¡q||_ ||_ |jddd|_|S)    NrVrPÚcommaÚparamru)z name:endwithTrv)rÚWithrqr)r8r:rRrorwÚset_ctxrDr†ÚtargetsÚvaluesrsr~)r1r‘r—r˜r|r4r4r5Ú
parse_withs 
 
 zParser.parse_withcCsDtjt|jƒjd}t d| ¡¡g|_|jddd|_    t 
|g¡S)NrVr)zname:endautoescapeTrv) rZScopedEvalContextModifierrqr)r8ÚKeywordr†Úoptionsrsr~ÚScope©r1r‘r4r4r5Úparse_autoescape szParser.parse_autoescapecCs¢tjt|jƒjd}|j d¡j|_|j d¡|_    |j d¡|_
|jj j dkrX|  d¡|jddd    |_|j
rŒtd
d „|jDƒƒsŒ|  d ¡|j d |j¡|S)NrVr$z name:scopedz name:requiredrzpBlock names in Jinja have to be valid Python identifiers and may not contain hyphens, use an underscore instead.)z name:endblockTrvcss0|](}|jD]}t|tjƒo$|j ¡Vq qdS©N)rÚ
isinstanceÚ TemplateDataÚdataÚisspace)Ú.0r~Úchildr4r4r5Ú    <genexpr>:sþz%Parser.parse_block.<locals>.<genexpr>z7Required blocks can only contain comments or whitespacezname:)rÚBlockrqr)r8ror`r$rnÚscopedÚrequiredr:rRr;rsr~Úallrr4r4r5Ú parse_block&sÿþ
zParser.parse_blockcCs"tjt|jƒjd}| ¡|_|S©NrV)rÚExtendsrqr)r8r†Útemplaterr4r4r5Ú parse_extendsDs
zParser.parse_extends)r‘Údefaultr'cCsH|jj dd¡r>|j ¡ d¡r>t|jƒjdk|_|j ¡n||_|S)Nz    name:withz name:withoutú name:contextr)    r)r:rSÚlookr‰rqr`Ú with_contextÚskip)r1r‘r°r4r4r5Úparse_import_contextIsÿþ zParser.parse_import_contextcCsbtjt|jƒjd}| ¡|_|jj d¡rP|j     ¡ d¡rPd|_
|j  d¡nd|_
|  |d¡S)NrVz name:ignorez name:missingTéF) rÚIncluderqr)r8r†r®r:r‰r²Zignore_missingr´rµrr4r4r5Ú parse_includeUs
ÿzParser.parse_includecCsFtjt|jƒjd}| ¡|_|j d¡|jddj    |_
|  |d¡S)NrVúname:asT©Ú    name_onlyF) rÚImportrqr)r8r†r®rorwr$r|rµrr4r4r5Ú parse_importas
 
 zParser.parse_importcstjtˆjƒjd‰ˆ ¡ˆ_ˆj d¡gˆ_t    dœ‡‡fdd„ }ˆjrVˆj d¡ˆjj
j dkrê|ƒrlqøˆj dd    }|j  d
¡r–ˆjd |jtd ˆj d ¡rĈj dd    }ˆj |j |j f¡nˆj |j ¡|ƒsøˆjj
j dkröqøqDˆj d¡qDtˆdƒs
dˆ_ˆS)NrVz name:importr]csBˆjjjdkr>ˆj ¡ d¡r>tˆjƒjdkˆ_ˆj ¡dSdS)N>Úwithoutrr±rTF)r)r:r`r²r‰rqr³r´r4©r‘r1r4r5Ú parse_contextnsý
z(Parser.parse_from.<locals>.parse_contextr“r$TrºÚ_z4names starting with an underline can not be imported)r9r¹r³F)rÚ
FromImportrqr)r8r†r®roÚnamesÚboolr:rRrwr$Ú
startswithr;rrnrDÚhasattrr³)r1rÀr|Úaliasr4r¿r5Ú
parse_fromhs6
     ý   zParser.parse_from)r‘r'cCsšg}|_g}|_|j d¡|jjjdkrŠ|r>|j d¡|jdd}| d¡|j d¡rp|     | 
¡¡n|r~|  d¡|     |¡q |j d¡dS)    NÚlparenrQr“Trºr”ruz-non-default argument follows default argument) ÚargsÚdefaultsr)ror:rRrwr–rnrDr†r;)r1r‘rÊrËÚargr4r4r5Úparse_signature’s
 
 
 
 zParser.parse_signaturecCsvtjt|jƒjd}|jjjdkr.| |¡n g|_g|_    | 
¡}t |tj ƒs\|  d|j¡||_|jddd|_|S)NrVrÉz expected call)z name:endcallTrv)rÚ    CallBlockrqr)r8r:rRrÍrÊrËr†r ÚCallr;r^rsr~)r1r‘Z    call_noder4r4r5rd¢s  zParser.parse_call_blockcCs8tjt|jƒjd}|jddd|_|jddd|_|S)NrVT)Ú start_inline)zname:endfilterrv)    rÚ FilterBlockrqr)r8rzr_rsr~rr4r4r5re±szParser.parse_filter_blockcCsBtjt|jƒjd}|jddj|_| |¡|jddd|_    |S)NrVTrº)z name:endmacrorv)
rÚMacrorqr)r8rwr$rÍrsr~rr4r4r5Ú parse_macro·s
 
zParser.parse_macrocCsPtjt|jƒjd}g|_|jjjdkrL|jr:|j d¡|j |     ¡¡q|S)NrVrPr“)
rÚOutputrqr)r8r:rRrorDr†rr4r4r5Ú parse_print¾s zParser.parse_printzte.Literal[True])Ú
with_tupler»r'cCsdSrŸr4)r1rÖr»r4r4r5rwÇszParser.parse_assign_targetT)rÖr»rNrtr'cCsdSrŸr4)r1rÖr»rNrtr4r4r5rwÍscCsÄ|rN|j ¡jdkrN|j d¡}t|jƒ|j d¡}tj|j|j|jd}nL|rt|j d¡}tj    |jd|jd}n&|rˆ|j
d|d}n|  ¡}|  d¡|  ¡sÀ| dt|ƒj ¡›|j¡|S)aParse an assignment target.  As Jinja allows assignments to
        tuples, this function can parse all allowed assignment targets.  Per
        default assignments to tuples are parsed, that can be disable however
        by setting `with_tuple` to `False`.  If only assignments to names are
        wanted `name_only` can be set to `True`.  The `extra_end_rules`
        parameter is forwarded to the tuple parsing function.  If
        `with_namespace` is enabled, a namespace assignment may be parsed.
        Údotr$rVÚstoreT)Ú
simplifiedrNzcan't assign to )r)r²rRrorqrÚNSRefr`r8ÚNamerxÚ parse_primaryr–Z
can_assignr;Ú__name__Úlower)r1rÖr»rNrtrgÚattrr|r4r4r5rw×s* 
  ÿ
ÿ)r‚r'cCs|r | ¡S| ¡S)zºParse an expression.  Per default all expressions are parsed, if
        the optional `with_condexpr` parameter is set to `False` conditional
        expressions are not parsed.
        )Úparse_condexprÚparse_or)r1r‚r4r4r5r†szParser.parse_expressioncCsb|jjj}| ¡}|j d¡r^| ¡}|j d¡r<| ¡}nd}tj||||d}|jjj}q|S)Nrƒr…rV)r)r:r8rárnràrZCondExpr)r1r8Úexpr1Zexpr2Zexpr3r4r4r5rà
s
 
 zParser.parse_condexprcCsF|jjj}| ¡}|j d¡rB| ¡}tj|||d}|jjj}q|S)Núname:orrV)r)r:r8Ú    parse_andrnrÚOr©r1r8ÚleftÚrightr4r4r5rás
  zParser.parse_orcCsF|jjj}| ¡}|j d¡rB| ¡}tj|||d}|jjj}q|S)Núname:andrV)r)r:r8Ú    parse_notrnrÚAndrær4r4r5rä"s
  zParser.parse_andcCs4|jj d¡r,t|jƒj}tj| ¡|dS| ¡S)Núname:notrV)    r)r:r‰rqr8rÚNotrêÚ parse_compare)r1r8r4r4r5rê+s zParser.parse_notcCsÖ|jjj}| ¡}g}|jjj}|tkrJt|jƒ| t     || ¡¡¡nh|j 
d¡rn| t     d| ¡¡¡nD|jj  d¡r¾|j  ¡  d¡r¾|j  d¡| t     d| ¡¡¡nq¾|jjj}q|sÆ|Stj|||dS)Nr€Úinrìr¶ÚnotinrV)r)r:r8Ú parse_math1rRÚ_compare_operatorsrqrDrZOperandrnr‰r²r´ZCompare)r1r8r}ÚopsÚ
token_typer4r4r5rî1s&
 
 
 ÿ  zParser.parse_comparecCs^|jjj}| ¡}|jjjdkrZt|jjj}t|jƒ| ¡}||||d}|jjj}q|S)N)rrrV)r)r:r8Ú parse_concatrRr rq©r1r8rçÚclsrèr4r4r5rñHs
 
 zParser.parse_math1cCs^|jjj}| ¡g}|jjjdkr<t|jƒ| | ¡¡qt|ƒdkrP|dStj    ||dS)NÚtilderrrV)
r)r:r8Ú parse_math2rRrqrDÚlenrZConcat)r1r8rÊr4r4r5rõSs
 
 
 zParser.parse_concatcCs^|jjj}| ¡}|jjjdkrZt|jjj}t|jƒ| ¡}||||d}|jjj}q|S)N)rrrrrV)r)r:r8Ú    parse_powrRr rqrör4r4r5rù]s
 
 zParser.parse_math2cCsR|jjj}| ¡}|jjjdkrNt|jƒ| ¡}tj|||d}|jjj}q|S)NÚpowrV)r)r:r8Ú parse_unaryrRrqrZPowrær4r4r5rûhs
 
 zParser.parse_pow)Ú with_filterr'cCsˆ|jjj}|jjj}|dkr<t|jƒtj| d¡|d}n0|dkrdt|jƒtj| d¡|d}n|     ¡}| 
|¡}|r„|  |¡}|S)NrFrVr) r)r:rRr8rqrZNegrýZPosrÜÚ parse_postfixÚparse_filter_expr)r1rþrôr8r‘r4r4r5rýrs
 
 
 
 
 
zParser.parse_unarycCsr|jj}|jdkrp|jdkr4tj|jdk|jd}n0|jdkrPtjd|jd}ntj|jd|jd}t|jƒnþ|jdkrÒt|jƒ|jg}|j}|jjjdkr¼|     |jjj¡t|jƒq’tjd 
|¡|d}nœ|jd    krút|jƒtj|j|jd}nt|jd
kr*t|jƒ|j d d }|j  d ¡nD|jdkr@|  ¡}n.|jdkrV| ¡}n| dt|ƒ›|j¡|S)Nr$)ÚtrueÚfalseÚTrueÚFalse)rrrV)ÚnoneÚNoneÚloadÚstringÚ)ÚintegerÚfloatrÉT)Úexplicit_parenthesesrQÚlbracketÚlbracez unexpected )r)r:rRr`rÚConstr8rÛrqrDrBrxroÚ
parse_listÚ
parse_dictr;r)r1rgr‘Úbufr8r4r4r5r܄s:
 
 
 
 
 
 
 
 
 
zParser.parse_primary)rÙr‚rNr r'c    sĈjjj}|rˆj}n |r"ˆj}ntjdœ‡fdd„ }g}d}|rNˆj d¡ˆ |¡rZqˆ|     |ƒ¡ˆjjj
dkrˆd}nqˆˆjjj}q>|s´|r˜|dS|s´ˆ  dt ˆjjƒ›¡tj |d    |d
S) a©Works like `parse_expression` but if multiple expressions are
        delimited by a comma a :class:`~jinja2.nodes.Tuple` node is created.
        This method could also return a regular expression instead of a tuple
        if no commas where found.
 
        The default parsing mode is a full tuple.  If `simplified` is `True`
        only names and literals are parsed.  The `no_condexpr` parameter is
        forwarded to :meth:`parse_expression`.
 
        Because tuples do not require delimiters and may end in a bogus comma
        an extra hint is needed that marks the end of a tuple.  For example
        for loops support tuples between `for` and `in`.  In that case the
        `extra_end_rules` is set to ``['name:in']``.
 
        `explicit_parentheses` is true if the parsing was triggered by an
        expression in parentheses.  This is used to figure out if an empty
        tuple is a valid expression or not.
        r]cs ˆjddS)NFr)r†r4©r1r4r5r-Æsz!Parser.parse_tuple.<locals>.parseFr“TrzExpected an expression, got rrV)r)r:r8rÜr†rÚExprrorTrDrRr;rÚTuple)    r1rÙr‚rNr r8r-rÊZis_tupler4rr5rx¦s2
 
  ÿzParser.parse_tuplecCsj|j d¡}g}|jjjdkrN|r.|j d¡|jjjdkr>qN| | ¡¡q|j d¡tj||jdS)Nr Úrbracketr“rV)    r)ror:rRrDr†rÚListr8)r1rgÚitemsr4r4r5rès   zParser.parse_listcCs|j d¡}g}|jjjdkrt|r.|j d¡|jjjdkr>qt| ¡}|j d¡| ¡}| tj|||jd¡q|j d¡tj    ||jdS)NrÚrbracer“rlrV)
r)ror:rRr†rDrZPairr8ÚDict)r1rgrÚkeyr`r4r4r5rôs    zParser.parse_dictcCsB|jjj}|dks|dkr&| |¡}q|dkr>| |¡}qq>q|S)Nr×r rÉ)r)r:rRÚparse_subscriptÚ
parse_call©r1r‘rôr4r4r5rÿs
  zParser.parse_postfixcCs\|jjj}|dkr| |¡}q|dkr@|jjjdkr@| |¡}q|dkrX| |¡}qqXq|S)NÚpiper$ÚisrÉ)r)r:rRrzr`Ú
parse_testrrr4r4r5rs
   zParser.parse_filter_exprcCst|jƒ}|jdkr„|jj}t|jƒ|jdkrFtj||jd|jdS|jdkr^| d|j¡tj    |j|jd}tj
||d|jdS|jdkr
g}|jjjdkrÂ|r²|j  d    ¡|  |  ¡¡q”|j  d¡t|ƒd
krä|d }ntj|d|jd}tj
||d|jdS| d |j¡dS) Nr×r$rrVr
zexpected name or numberr rr“rrzexpected subscript expression)rqr)rRr:rÚGetattrr`r8r;rÚGetitemrorDÚparse_subscribedrúr)r1r‘rgZ
attr_tokenrÌrÊr4r4r5rs6
 
 
 
ÿ
 
zParser.parse_subscriptcCsò|jjj}|jjjdkr*t|jƒdg}n*| ¡}|jjjdkrD|St|jƒ|g}|jjjdkrn| d¡n(|jjjdkrŒ| | ¡¡n
| d¡|jjjdkrØt|jƒ|jjjdkrÌ| | ¡¡qâ| d¡n
| d¡tj|d|iŽS)Nrl)rr“r8)    r)r:r8rRrqr†rDrZSlice)r1r8rÊr‘r4r4r5r$>s*
 
 
 
 
 
zParser.parse_subscribedc    s|ˆj d¡‰g}g}d}d}d}tddœ‡‡fdd„ }ˆjjjdkrd|rhˆj d¡ˆjjjdkrhqdˆjjjdkrž||dko†|dkƒtˆjƒˆ ¡}nÀˆjjjd    krÌ||dkƒtˆjƒˆ ¡}n’ˆjjjd
kr2ˆj ¡jd kr2||dkƒˆjjj}ˆj     d ¡ˆ ¡}| 
t j |||j d ¡n,||dkoL|dkoL| ƒ| 
ˆ ¡¡d}q6ˆj d¡||||fS)NrÉF)r}r'cs|sˆ dˆj¡dS)Nz+invalid syntax for function call expression)r;r8)r}©r1rgr4r5Úensurefsz&Parser.parse_call_args.<locals>.ensurerQr“rrür$rur¶rVT)r)rorÄr:rRrqr†r²r`r´rDrršr8)    r1rÊÚkwargsÚdyn_argsÚ
dyn_kwargsZ require_commar&rr`r4r%r5Úparse_call_args^sD  
 
 
 
 ÿþ 
  zParser.parse_call_argscCs0|jj}| ¡\}}}}tj||||||jdSr¬)r)r:r*rrÏr8)r1r‘rgrÊr'r(r)r4r4r5rszParser.parse_call)r‘rÐr'c        Cs¶|jjjdks|r²|s t|jƒ|j d¡}|j}|jjjdkrbt|jƒ|d|j d¡j7}q2|jjjdkr‚| ¡\}}}}ng}g}d}}tj|||||||j    d}d}q|S)Nrr$r×r>rÉrVF)
r)r:rRrqror`r*rÚFilterr8)    r1r‘rÐrgr$rÊr'r(r)r4r4r5rz–s0
 
ÿzParser.parse_filterc
    Cs t|jƒ}|jj d¡r(t|jƒd}nd}|j d¡j}|jjjdkrjt|jƒ|d|j d¡j7}q:d}}g}|jjjdkr–| ¡\}}}}nV|jjjdkrè|jj d    d
d ¡sè|jj d ¡rÎ|     d ¡| 
¡}    |  |    ¡}    |    g}ng}t j |||||||jd}|rt j||jd}|S)NrìTFr$r×r>rÉ>rrr r$rÉr
r r…rãrézname:isz'You cannot chain multiple tests with isrV)rqr)r:r‰ror`rRr*rSr;rÜrÿrZTestr8rí)
r1r‘rgZnegatedr$r(r)r'rÊZarg_noder4r4r5r!­sD
 
 
ø    
 
ÿzParser.parse_test)rJr'csLg‰g‰ˆj}|dk    r"|j |¡ddœ‡‡fdd„ }zú|jr(|jj}|jdkrz|jrn|tj|j|j    dƒt
|jƒq8|jdkr¬t
|jƒ||j ddƒ|j  d    ¡q8|jd
kr|ƒt
|jƒ|dk    ræ|jjj |ŽræˆW¢NS| ¡}t|tƒrˆ |¡n
ˆ |¡|j  d ¡q8td ƒ‚q8|ƒW5|dk    rF|j ¡XˆS) Nr]cs8ˆr4ˆdj}ˆ tjˆdd…|d¡ˆdd…=dS)NrrV)r8rDrrÔrV©r~Z data_bufferr4r5Ú
flush_dataÝs
z#Parser.subparse.<locals>.flush_datar¢rVZvariable_beginTrrOZ block_beginrPzinternal parsing error)rDr0rar)r:rRr`rr¡r8rqrxrorSrjr rKÚextendÚAssertionError)r1rJZadd_datar-rgr[r4r,r5rpÓsD 
 
 
 
ÿ  
 
 
 
 zParser.subparsecCs"tj| ¡dd}| |j¡|S)z0Parse the whole template into a `Template` node.rrV)rÚTemplaterpZset_environmentr")r1rrr4r4r5r-s z Parser.parse)NNN)N)NN)N)N)F)..)TFNF)TFNF)T)T)FTNF)F)N)_rÝÚ
__module__Ú __qualname__Ú__doc__ÚstrÚtÚOptionalr6rÚintÚTyper;rrrHrIrMrÄrTrrYr\ÚUnionrZrjrsryr{rr‡rŒrr’r•r™rœržr§r«r­r¯r    rµr·r¸r¼r½rÂrÈr
rÍrÎrdrÑrerÒrÓrÔrÕÚtypingÚoverloadrÛrwrÚrr†ràrárärêrîrñrõrùrûrýrÜrxrrrrÿrr"r#rr$r*rÏrrzr!rpr0r-r4r4r4r5r!.s&úù üû û )ÿþ ýü ÿþ
"ÿ 
þ  þ  *    ÿþûú ûú *             
 
$ûú B  þ  1ÿ
 
þ 'ÿ
þ 1r!)'r3r:r5r    rÚ
exceptionsrrÚlexerrrÚ TYPE_CHECKINGZtyping_extensionsÚter"rÚTypeVarr¼r·r    rÒrÎr
Ú    frozensetrbròZAddZSubZMulZDivZFloorDivZModr rr4r8rÚ__annotations__r!r4r4r4r5Ú<module>sH      ôÿú