zmc
2023-12-22 9fdbf60165db0400c2e8e6be2dc6e88138ac719a
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
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
U
L±dÐã@sdddlmZddlmZddlmZddlmZmZm    Z    m
Z
ddl m Z m Z e
Gdd„deƒƒZdS)    é)Úyacc)Úc_ast)ÚCLexer)Ú    PLYParserÚ
ParseErrorÚ parameterizedÚtemplate)Úfix_switch_casesÚfix_atomic_specifiersc@sŒeZdZdedddddfdd„Zd]dd    „Zd
d „Zd d „Zdd„Zdd„Z    dd„Z
dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zd d!„Zd^d"d#„Zd_d$d%„Zd&d'„Zd(d)„Zd*Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„Zd7d8„Zd9d:„Zd;d<„Zd=d>„Z d?d@„Z!dAdB„Z"dCdD„Z#dEdF„Z$dGdH„Z%dIdJ„Z&dKdL„Z'dMdN„Z(dOdP„Z)dQdR„Z*dSdT„Z+dUdV„Z,dWdX„Z-dYdZ„Z.d[d\„Z/d]d^„Z0d_d`„Z1dadb„Z2dcdd„Z3dedf„Z4dgdh„Z5didj„Z6dkdl„Z7dmdn„Z8dodp„Z9dqdr„Z:dsdt„Z;dudv„Z<dwdx„Z=dydz„Z>d{d|„Z?d}d~„Z@dd€„ZAdd‚„ZBdƒd„„ZCd…d†„ZDd‡dˆ„ZEd‰dŠ„ZFd‹dŒ„ZGddŽ„ZHdd„ZId‘d’„ZJd“d”„ZKd•d–„ZLd—d˜„ZMd™dš„ZNd›dœ„ZOddž„ZPdŸd „ZQd¡d¢„ZRd£d¤„ZSd¥d¦„ZTd§d¨„ZUd©dª„ZVeWd«d¬d­ƒd®d¯„ƒZXeWd«d¬d­ƒd°d±„ƒZYeWd«d¬d­ƒd²d³„ƒZZeWd«d¬ƒd´dµ„ƒZ[eWd«d¬d­ƒd¶d·„ƒZ\eWd«d¬d­ƒd¸d¹„ƒZ]eWd«d¬d­ƒdºd»„ƒZ^eWd«d¬d­ƒd¼d½„ƒZ_d¾d¿„Z`dÀdÁ„ZadÂdÄZbdÄdńZcdÆdDŽZddÈdɄZedÊd˄ZfdÌd̈́ZgdÎdτZhdÐdфZidÒdӄZjdÔdՄZkdÖdׄZldØdلZmdÚdۄZndÜd݄ZodÞd߄Zpdàdá„Zqdâdã„Zrdädå„Zsdædç„Ztdèdé„Zudêdë„Zvdìdí„Zwdîdï„Zxdðdñ„Zydòdó„Zzdôdõ„Z{död÷„Z|dødù„Z}dúdû„Z~düdý„Zdþdÿ„Z€dd„Zdd„Z‚dd„Zƒdd„Z„dd    „Z…d
d „Z†d d „Z‡dd„Zˆdd„Z‰dd„ZАdd„Z‹dd„ZŒdd„Zdd„Zސdd„Zdd„Zd d!„Z‘d"d#„Z’d$d%„Z“d&d'„Z”d(d)„Z•d*d+„Z–d,d-„Z—d.d/„Z˜d0d1„Z™d2d3„Zšd4d5„Z›d6d7„Zœd8d9„Zd:d;„Zžd<d=„ZŸd>d?„Z d@dA„Z¡dBdC„Z¢dDdE„Z£dFdG„Z¤dHdI„Z¥dJdK„Z¦dLdM„Z§dNdO„Z¨dPdQ„Z©dRdS„ZªdTdU„Z«dVdW„Z¬dXdY„Z­dZd[„Z®d\S(`ÚCParserTzpycparser.lextabzpycparser.yacctabFÚc
Cs–||j|j|j|jd|_|jj|||d|jj|_ddddddd    d
d d d dddg}|D]}    | |    ¡qZtj|d||||d|_    t
ƒg|_ d|_ dS)a Create a new CParser.
 
            Some arguments for controlling the debug/optimization
            level of the parser are provided. The defaults are
            tuned for release/performance mode.
            The simple rules for using them are:
            *) When tweaking CParser/CLexer, set these to False
            *) When releasing a stable parser, set to True
 
            lex_optimize:
                Set to False when you're modifying the lexer.
                Otherwise, changes in the lexer won't be used, if
                some lextab.py file exists.
                When releasing with a stable lexer, set to True
                to save the re-generation of the lexer table on
                each run.
 
            lexer:
                Set this parameter to define the lexer to use if
                you're not using the default CLexer.
 
            lextab:
                Points to the lex table that's used for optimized
                mode. Only if you're modifying the lexer and want
                some tests to avoid re-generating the table, make
                this point to a local lex table file (that's been
                earlier generated with lex_optimize=True)
 
            yacc_optimize:
                Set to False when you're modifying the parser.
                Otherwise, changes in the parser won't be used, if
                some parsetab.py file exists.
                When releasing with a stable parser, set to True
                to save the re-generation of the parser table on
                each run.
 
            yacctab:
                Points to the yacc table that's used for optimized
                mode. Only if you're modifying the parser, make
                this point to a local yacc table file
 
            yacc_debug:
                Generate a parser.out file that explains how yacc
                built the parsing table from the grammar.
 
            taboutputdir:
                Set this parameter to control the location of generated
                lextab and yacctab files.
        )Z
error_funcZon_lbrace_funcZon_rbrace_funcZtype_lookup_func)ÚoptimizeÚlextabÚ    outputdirZabstract_declaratorZassignment_expressionZdeclaration_listZdeclaration_specifiers_no_typeZ designationZ
expressionZidentifier_listZinit_declarator_listZid_init_declarator_listZinitializer_listZparameter_type_listZblock_item_listZtype_qualifier_listZstruct_declarator_listZtranslation_unit_or_empty)ÚmoduleÚstartÚdebugr Z    tabmodulerN) Ú_lex_error_funcÚ_lex_on_lbrace_funcÚ_lex_on_rbrace_funcÚ_lex_type_lookup_funcÚclexÚbuildÚtokensZ_create_opt_rulerÚcparserÚdictÚ _scope_stackÚ_last_yielded_token)
ÚselfZ lex_optimizeÚlexerrZ yacc_optimizeZyacctabZ
yacc_debugZ taboutputdirZrules_with_optZrule©r úId:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\pycparser/c_parser.pyÚ__init__sN:üý
ò ú
zCParser.__init__cCs6||j_|j ¡tƒg|_d|_|jj||j|dS)a  Parses C code and returns an AST.
 
            text:
                A string containing the C source code
 
            filename:
                Name of the file being parsed (for meaningful
                error messages)
 
            debug:
                Debug flag to YACC
        N)Úinputrr)rÚfilenameZ reset_linenorrrrÚparse)rÚtextr$rr r r!r%‚s 
 
ýz CParser.parsecCs|j tƒ¡dS©N)rÚappendr©rr r r!Ú _push_scopešszCParser._push_scopecCs t|jƒdkst‚|j ¡dS)Nr)ÚlenrÚAssertionErrorÚpopr)r r r!Ú
_pop_scopeszCParser._pop_scopecCs4|jd |d¡s"| d||¡d|jd|<dS)zC Add a new typedef name (ie a TYPEID) to the current scope
        éÿÿÿÿTz;Typedef %r previously declared as non-typedef in this scopeN©rÚgetÚ _parse_error©rÚnameÚcoordr r r!Ú_add_typedef_name¡sÿþzCParser._add_typedef_namecCs4|jd |d¡r"| d||¡d|jd|<dS)ze Add a new object, function, or enum member name (ie an ID) to the
            current scope
        r/Fz;Non-typedef %r previously declared as typedef in this scopeNr0r3r r r!Ú_add_identifierªsÿþzCParser._add_identifiercCs.t|jƒD]}| |¡}|dk    r
|Sq
dS)z8 Is *name* a typedef-name in the current scope?
        NF)Úreversedrr1)rr4ZscopeZin_scoper r r!Ú_is_type_in_scope´s
 
 
zCParser._is_type_in_scopecCs| || ||¡¡dSr')r2Ú_coord)rÚmsgÚlineÚcolumnr r r!r¾szCParser._lex_error_funccCs | ¡dSr')r*r)r r r!rÁszCParser._lex_on_lbrace_funccCs | ¡dSr')r.r)r r r!rÄszCParser._lex_on_rbrace_funccCs| |¡}|S)z§ Looks up types that were previously defined with
            typedef.
            Passed to the lexer for recognizing identifiers that
            are types.
        )r9)rr4Zis_typer r r!rÇs
zCParser._lex_type_lookup_funccCs|jjS)z§ We need access to yacc's lookahead token in certain cases.
            This is the last token yacc requested from the lexer, so we
            ask the lexer.
        )rZ
last_tokenr)r r r!Ú_get_yacc_lookahead_tokenÐsz!CParser._get_yacc_lookahead_tokencCs\|}|}|jr|j}qt|tjƒr,||_|S|}t|jtjƒsF|j}q0|j|_||_|SdS)z  Tacks a type modifier on a declarator, and returns
            the modified declarator.
 
            Note: the declarator and modifier may be modified
        N)ÚtypeÚ
isinstancerÚTypeDecl)rÚdeclÚmodifierZ modifier_headZ modifier_tailZ    decl_tailr r r!Ú_type_modify_declùs  zCParser._type_modify_declcCsÊ|}t|tjƒs|j}q|j|_|jdd…|_|D]:}t|tjƒs4t|ƒdkr`|     d|j
¡q4||_|Sq4|s¦t|jtj ƒs|     d|j
¡tjdg|j
d|_n tjdd„|Dƒ|d    j
d|_|S)
z- Fixes a declaration. Modifies decl.
        Nrz Invalid multiple types specifiedzMissing type in declarationÚint©r5cSsg|]}|jD]}|‘qqSr )Únames)Ú.0Úidr4r r r!Ú
<listcomp>Ssz/CParser._fix_decl_name_type.<locals>.<listcomp>é) r@rrAr?Údeclnamer4ÚqualsÚIdentifierTyper+r2r5ÚFuncDecl)rrBÚtypenamer?Útnr r r!Ú_fix_decl_name_type+s:   ÿ
ÿþ
 þzCParser._fix_decl_name_typecCs>|ptgggggd}|r*|| |¡n|| d|¡|S)a¿ Declaration specifiers are represented by a dictionary
            with the entries:
            * qual: a list of type qualifiers
            * storage: a list of storage type qualifiers
            * type: a list of type specifiers
            * function: a list of function specifiers
            * alignment: a list of alignment specifiers
 
            This method is given a declaration specifier, and a
            new specifier of a given kind.
            If `append` is True, the new specifier is added to the end of
            the specifiers list, otherwise it's added at the beginning.
            Returns the declaration specifier, with the new
            specifier incorporated.
        )ÚqualÚstorager?ÚfunctionÚ    alignmentrK)rr(Úinsert)rZdeclspecZnewspecÚkindr(Úspecr r r!Ú_add_declaration_specifierWs
z"CParser._add_declaration_specifierc Csbd|dk}g}|d d¡dk    r&n6|dddkrêt|dƒdkstt|dd    jƒd
kst| |dd    jd¡s¦d }|dD]}t|d ƒr€|j}qšq€| d |¡tj|dd    jddd|d|dd    jd|dd<|dd    =nrt    |ddtj
tj tj tj fƒs\|dd}t    |tjƒs2|j}q|jdkr\|dd    jd|_|dd    =|D]ü}    |    ddk    svt‚|r¤tjd|d|d|    d|    djd}
nBtjd|d|d|d|d|    d|     d¡|     d¡|    djd    }
t    |
jtj
tj tj tj fƒr
|
} n| |
|d¡} |rH|r8| | j| j¡n| | j| j¡t| ƒ} | | ¡q`|S)zÿ Builds a list of declarations all sharing the given specifiers.
            If typedef_namespace is true, each declared name is added
            to the "typedef namespace", which also includes objects,
            functions, and enum constants.
        ÚtypedefrTrKÚbitsizeNrBr?ér/rú?r5zInvalid declarationrV©rLr?rMÚalignr5rS)r4rMrTr?r5rUÚinit©    r4rMr`rTZfuncspecr?rar\r5)r1r+rGr9Úhasattrr5r2rrAr@ÚEnumÚStructÚUnionrNr?rLr,ZTypedefÚDeclrRr6r4r7r
r() rrYÚdeclsÚtypedef_namespaceZ
is_typedefZ declarationsr5ÚtZ decls_0_tailrBÚ declarationZ
fixed_declr r r!Ú_build_declarationspsŒ &ÿ 
  û  ÿ 
 
û÷ þzCParser._build_declarationscCsLd|dkr| d|j¡|j|t|ddgddd}tj||||jd    S)
z' Builds a function definition.
        r[rTzInvalid typedefN©rBraT©rYrhrirK)rBÚ param_declsÚbodyr5)r2r5rlrrZFuncDef)rrYrBrorprkr r r!Ú_build_function_definitionÉs  ýýüz"CParser._build_function_definitioncCs|dkrtjStjSdS)z` Given a token (either STRUCT or UNION), selects the
            appropriate AST class.
        ÚstructN)rrerf)rÚtokenr r r!Ú_select_struct_union_classÚsz"CParser._select_struct_union_class)
)ÚleftZLOR)ruZLAND)ruÚOR)ruZXOR)ruÚAND)ruZEQZNE)ruÚGTZGEÚLTZLE)ruZRSHIFTZLSHIFT)ruÚPLUSÚMINUS)ruZTIMESZDIVIDEZMODcCs2|ddkrt g¡|d<nt |d¡|d<dS)zh translation_unit_or_empty   : translation_unit
                                        | empty
        rNrK)rZFileAST©rÚpr r r!Úp_translation_unit_or_emptyüs z#CParser.p_translation_unit_or_emptycCs|d|d<dS)z4 translation_unit    : external_declaration
        rrKNr r|r r r!Úp_translation_unit_1szCParser.p_translation_unit_1cCs"|d |d¡|d|d<dS)zE translation_unit    : translation_unit external_declaration
        rr]rKN)Úextendr|r r r!Úp_translation_unit_2 szCParser.p_translation_unit_2cCs|dg|d<dS)z7 external_declaration    : function_definition
        rrKNr r|r r r!Úp_external_declaration_1sz CParser.p_external_declaration_1cCs|d|d<dS)z/ external_declaration    : declaration
        rrKNr r|r r r!Úp_external_declaration_2sz CParser.p_external_declaration_2cCs|dg|d<dS)zi external_declaration    : pp_directive
                                    | pppragma_directive
        rrKNr r|r r r!Úp_external_declaration_3sz CParser.p_external_declaration_3cCs g|d<dS)z( external_declaration    : SEMI
        rKNr r|r r r!Úp_external_declaration_4%sz CParser.p_external_declaration_4cCs|d|d<dS)z1 external_declaration    : static_assert
        rrKNr r|r r r!Úp_external_declaration_5*sz CParser.p_external_declaration_5cCsVt|ƒdkr.t |dd| |d¡¡g|d<n$t |d|d| |d¡¡g|d<dS)zÈ static_assert           : _STATIC_ASSERT LPAREN constant_expression COMMA unified_string_literal RPAREN
                                    | _STATIC_ASSERT LPAREN constant_expression RPAREN
        ééNrrK)r+rZ StaticAssertÚ _token_coordr|r r r!Úp_static_assert_declaration/s "z#CParser.p_static_assert_declarationcCs| d| |d¡¡dS)z  pp_directive  : PPHASH
        zDirectives not supported yetrN)r2r‰r|r r r!Úp_pp_directive8s
ÿzCParser.p_pp_directivecCsFt|ƒdkr*t |d| |d¡¡|d<nt d| |d¡¡|d<dS)zg pppragma_directive      : PPPRAGMA
                                    | PPPRAGMA PPPRAGMASTR
        rˆr]rKr rN)r+rÚPragmar‰r|r r r!Úp_pppragma_directive>s zCParser.p_pppragma_directivec
CsNtgggtjdg| |d¡dggd}|j||d|d|dd|d<d    S)
zU function_definition : id_declarator declaration_list_opt compound_statement
        rErrF©rSrVrTr?rUr]rˆ©rYrBrorprKN)rrrNr‰rq©rr}rYr r r!Úp_function_definition_1Is
ÿúüzCParser.p_function_definition_1cCs.|d}|j||d|d|dd|d<dS)zl function_definition : declaration_specifiers id_declarator declaration_list_opt compound_statement
        rr]rˆérrKN)rqrr r r!Úp_function_definition_2[süzCParser.p_function_definition_2cCs|d|d<dS)a_ statement   : labeled_statement
                        | expression_statement
                        | compound_statement
                        | selection_statement
                        | iteration_statement
                        | jump_statement
                        | pppragma_directive
                        | static_assert
        rrKNr r|r r r!Ú p_statementjs
zCParser.p_statementcCsTt|dtjƒrDt|ƒdkrDtj|d|dg| |d¡d|d<n |d|d<dS)zx pragmacomp_or_statement     : pppragma_directive statement
                                        | statement
        rrˆr]©Z block_itemsr5rKN)r@rrŒr+ÚCompoundr‰r|r r r!Úp_pragmacomp_or_statement¡s 
þ z!CParser.p_pragmacomp_or_statementc Cs¼|d}|ddkrœ|d}tjtjtjf}t|ƒdkr€t|d|ƒr€tjd|d|d|d|d    |ddd|djd
    g}q°|j|t    ddd gd d }n|j||dd d }||d<dS)z˜ decl_body : declaration_specifiers init_declarator_list_opt
                      | declaration_specifiers_no_type id_init_declarator_list_opt
        rr]Nr?rKrSrVrTrUrbrmTrn)
rrerfrdr+r@rgr5rlr)rr}rYÚtyZs_u_or_erhr r r!Ú p_decl_bodyµs6 ÷
 ýýzCParser.p_decl_bodycCs|d|d<dS)z& declaration : decl_body SEMI
        rrKNr r|r r r!Ú p_declarationòszCParser.p_declarationcCs,t|ƒdkr|dn|d|d|d<dS)zj declaration_list    : declaration
                                | declaration_list declaration
        r]rrKN©r+r|r r r!Úp_declaration_listûszCParser.p_declaration_listcCs| |d|dd¡|d<dS)z] declaration_specifiers_no_type  : type_qualifier declaration_specifiers_no_type_opt
        r]rrSrKN©rZr|r r r!Ú"p_declaration_specifiers_no_type_1sz*CParser.p_declaration_specifiers_no_type_1cCs| |d|dd¡|d<dS)zf declaration_specifiers_no_type  : storage_class_specifier declaration_specifiers_no_type_opt
        r]rrTrKNrr|r r r!Ú"p_declaration_specifiers_no_type_2 sz*CParser.p_declaration_specifiers_no_type_2cCs| |d|dd¡|d<dS)za declaration_specifiers_no_type  : function_specifier declaration_specifiers_no_type_opt
        r]rrUrKNrr|r r r!Ú"p_declaration_specifiers_no_type_3sz*CParser.p_declaration_specifiers_no_type_3cCs| |d|dd¡|d<dS)z_ declaration_specifiers_no_type  : atomic_specifier declaration_specifiers_no_type_opt
        r]rr?rKNrr|r r r!Ú"p_declaration_specifiers_no_type_4sz*CParser.p_declaration_specifiers_no_type_4cCs| |d|dd¡|d<dS)zb declaration_specifiers_no_type  : alignment_specifier declaration_specifiers_no_type_opt
        r]rrVrKNrr|r r r!Ú"p_declaration_specifiers_no_type_5sz*CParser.p_declaration_specifiers_no_type_5cCs"|j|d|dddd|d<dS)zI declaration_specifiers  : declaration_specifiers type_qualifier
        rr]rST©r(rKNrr|r r r!Úp_declaration_specifiers_1!sz"CParser.p_declaration_specifiers_1cCs"|j|d|dddd|d<dS)zR declaration_specifiers  : declaration_specifiers storage_class_specifier
        rr]rTTr£rKNrr|r r r!Úp_declaration_specifiers_2&sz"CParser.p_declaration_specifiers_2cCs"|j|d|dddd|d<dS)zM declaration_specifiers  : declaration_specifiers function_specifier
        rr]rUTr£rKNrr|r r r!Úp_declaration_specifiers_3+sz"CParser.p_declaration_specifiers_3cCs"|j|d|dddd|d<dS)zS declaration_specifiers  : declaration_specifiers type_specifier_no_typeid
        rr]r?Tr£rKNrr|r r r!Úp_declaration_specifiers_40sz"CParser.p_declaration_specifiers_4cCs| d|dd¡|d<dS)z2 declaration_specifiers  : type_specifier
        Nrr?rKrr|r r r!Úp_declaration_specifiers_55sz"CParser.p_declaration_specifiers_5cCs"|j|d|dddd|d<dS)zQ declaration_specifiers  : declaration_specifiers_no_type type_specifier
        rr]r?Tr£rKNrr|r r r!Úp_declaration_specifiers_6:sz"CParser.p_declaration_specifiers_6cCs"|j|d|dddd|d<dS)zN declaration_specifiers  : declaration_specifiers alignment_specifier
        rr]rVTr£rKNrr|r r r!Úp_declaration_specifiers_7?sz"CParser.p_declaration_specifiers_7cCs|d|d<dS)a storage_class_specifier : AUTO
                                    | REGISTER
                                    | STATIC
                                    | EXTERN
                                    | TYPEDEF
                                    | _THREAD_LOCAL
        rrKNr r|r r r!Úp_storage_class_specifierDsz!CParser.p_storage_class_specifiercCs|d|d<dS)zR function_specifier  : INLINE
                                | _NORETURN
        rrKNr r|r r r!Úp_function_specifierNszCParser.p_function_specifiercCs$tj|dg| |d¡d|d<dS)a+ type_specifier_no_typeid  : VOID
                                      | _BOOL
                                      | CHAR
                                      | SHORT
                                      | INT
                                      | LONG
                                      | FLOAT
                                      | DOUBLE
                                      | _COMPLEX
                                      | SIGNED
                                      | UNSIGNED
                                      | __INT128
        rrFrKN©rrNr‰r|r r r!Úp_type_specifier_no_typeidTsz"CParser.p_type_specifier_no_typeidcCs|d|d<dS)zó type_specifier  : typedef_name
                            | enum_specifier
                            | struct_or_union_specifier
                            | type_specifier_no_typeid
                            | atomic_specifier
        rrKNr r|r r r!Úp_type_specifierdszCParser.p_type_specifiercCs |d}|j d¡||d<dS)z= atomic_specifier  : _ATOMIC LPAREN type_name RPAREN
        rˆZ_AtomicrKN)rMr()rr}Útypr r r!Úp_atomic_specifierns zCParser.p_atomic_specifiercCs|d|d<dS)z• type_qualifier  : CONST
                            | RESTRICT
                            | VOLATILE
                            | _ATOMIC
        rrKNr r|r r r!Úp_type_qualifieruszCParser.p_type_qualifiercCs0t|ƒdkr|d|dgn|dg|d<dS)z„ init_declarator_list    : init_declarator
                                    | init_declarator_list COMMA init_declarator
        r’rrˆrKNr›r|r r r!Úp_init_declarator_list}szCParser.p_init_declarator_listcCs,t|dt|ƒdkr|dndd|d<dS)zb init_declarator : declarator
                            | declarator EQUALS initializer
        rr]rˆNrmrK©rr+r|r r r!Úp_init_declarator†szCParser.p_init_declaratorcCs0t|ƒdkr|d|dgn|dg|d<dS)z id_init_declarator_list    : id_init_declarator
                                       | id_init_declarator_list COMMA init_declarator
        r’rrˆrKNr›r|r r r!Úp_id_init_declarator_listŒsz!CParser.p_id_init_declarator_listcCs,t|dt|ƒdkr|dndd|d<dS)zn id_init_declarator : id_declarator
                               | id_declarator EQUALS initializer
        rr]rˆNrmrKr´r|r r r!Úp_id_init_declarator’szCParser.p_id_init_declaratorcCs"|j|d|dddd|d<dS)zY specifier_qualifier_list    : specifier_qualifier_list type_specifier_no_typeid
        rr]r?Tr£rKNrr|r r r!Úp_specifier_qualifier_list_1šsz$CParser.p_specifier_qualifier_list_1cCs"|j|d|dddd|d<dS)zO specifier_qualifier_list    : specifier_qualifier_list type_qualifier
        rr]rSTr£rKNrr|r r r!Úp_specifier_qualifier_list_2Ÿsz$CParser.p_specifier_qualifier_list_2cCs| d|dd¡|d<dS)z4 specifier_qualifier_list  : type_specifier
        Nrr?rKrr|r r r!Úp_specifier_qualifier_list_3¤sz$CParser.p_specifier_qualifier_list_3cCs$t|dgg|dggd|d<dS)zH specifier_qualifier_list  : type_qualifier_list type_specifier
        rr]rŽrKN©rr|r r r!Úp_specifier_qualifier_list_4©sz$CParser.p_specifier_qualifier_list_4cCs tg|dggggd|d<dS)z9 specifier_qualifier_list  : alignment_specifier
        rrŽrKNr»r|r r r!Úp_specifier_qualifier_list_5®sz$CParser.p_specifier_qualifier_list_5cCs| |d|dd¡|d<dS)zR specifier_qualifier_list  : specifier_qualifier_list alignment_specifier
        rr]rVrKNrr|r r r!Úp_specifier_qualifier_list_6³sz$CParser.p_specifier_qualifier_list_6cCs0| |d¡}||dd| |d¡d|d<dS)z{ struct_or_union_specifier   : struct_or_union ID
                                        | struct_or_union TYPEID
        rr]N©r4rhr5rK)rtr‰©rr}Úklassr r r!Úp_struct_or_union_specifier_1»s 
ýz%CParser.p_struct_or_union_specifier_1cCsX| |d¡}t|ƒdkr6|dg| |d¡d|d<n|d|d| |d¡d|d<dS)z³ struct_or_union_specifier : struct_or_union brace_open struct_declaration_list brace_close
                                      | struct_or_union brace_open brace_close
        rr’Nr]r¿rKrˆ©rtr+r‰rÀr r r!Úp_struct_or_union_specifier_2Æs 
ý 
ýz%CParser.p_struct_or_union_specifier_2cCs`| |d¡}t|ƒdkr:||dg| |d¡d|d<n"||d|d| |d¡d|d<dS)a… struct_or_union_specifier   : struct_or_union ID brace_open struct_declaration_list brace_close
                                        | struct_or_union ID brace_open brace_close
                                        | struct_or_union TYPEID brace_open struct_declaration_list brace_close
                                        | struct_or_union TYPEID brace_open brace_close
        rr‡r]r¿rKr’NrÃrÀr r r!Úp_struct_or_union_specifier_3Øs 
ý 
ýz%CParser.p_struct_or_union_specifier_3cCs|d|d<dS)zF struct_or_union : STRUCT
                            | UNION
        rrKNr r|r r r!Úp_struct_or_unionëszCParser.p_struct_or_unioncCs:t|ƒdkr|dpg|d<n|d|dp.g|d<dS)z struct_declaration_list     : struct_declaration
                                        | struct_declaration_list struct_declaration
        r]rrKNr›r|r r r!Úp_struct_declaration_listós z!CParser.p_struct_declaration_listcCs¬|d}d|dkst‚|ddk    r8|j||dd}nht|dƒdkrˆ|dd}t|tjƒrf|}n
t |¡}|j|t|d    gd}n|j|tddd
gd}||d<dS) zW struct_declaration : specifier_qualifier_list struct_declarator_list_opt SEMI
        rr[rTr]N©rYrhr?rK©rBrm)r,rlr+r@rÚNoderNr)rr}rYrhÚnodeZ    decl_typer r r!Úp_struct_declaration_1üs* þ  
 
þ     þzCParser.p_struct_declaration_1cCs d|d<dS)z# struct_declaration : SEMI
        NrKr r|r r r!Úp_struct_declaration_2"szCParser.p_struct_declaration_2cCs|dg|d<dS)z1 struct_declaration : pppragma_directive
        rrKNr r|r r r!Úp_struct_declaration_3'szCParser.p_struct_declaration_3cCs0t|ƒdkr|d|dgn|dg|d<dS)zŠ struct_declarator_list  : struct_declarator
                                    | struct_declarator_list COMMA struct_declarator
        r’rrˆrKNr›r|r r r!Úp_struct_declarator_list,sz CParser.p_struct_declarator_listcCs|dddœ|d<dS)z( struct_declarator : declarator
        rN©rBr\rKr r|r r r!Úp_struct_declarator_15szCParser.p_struct_declarator_1cCsFt|ƒdkr$|d|ddœ|d<nt dddd¡|ddœ|d<dS)z€ struct_declarator   : declarator COLON constant_expression
                                | COLON constant_expression
        rˆrrÐrKNr])r+rrAr|r r r!Úp_struct_declarator_2:s zCParser.p_struct_declarator_2cCs"t |dd| |d¡¡|d<dS)zM enum_specifier  : ENUM ID
                            | ENUM TYPEID
        r]NrrK©rrdr‰r|r r r!Úp_enum_specifier_1CszCParser.p_enum_specifier_1cCs"t d|d| |d¡¡|d<dS)zG enum_specifier  : ENUM brace_open enumerator_list brace_close
        NrˆrrKrÓr|r r r!Úp_enum_specifier_2IszCParser.p_enum_specifier_2cCs&t |d|d| |d¡¡|d<dS)z› enum_specifier  : ENUM ID brace_open enumerator_list brace_close
                            | ENUM TYPEID brace_open enumerator_list brace_close
        r]r’rrKNrÓr|r r r!Úp_enum_specifier_3NszCParser.p_enum_specifier_3cCsht|ƒdkr*t |dg|dj¡|d<n:t|ƒdkrD|d|d<n |dj |d¡|d|d<dS)z™ enumerator_list : enumerator
                            | enumerator_list COMMA
                            | enumerator_list COMMA enumerator
        r]rrKrˆN)r+rZEnumeratorListr5Z enumeratorsr(r|r r r!Úp_enumerator_listTs   zCParser.p_enumerator_listcCs t |d| |d¡¡|d<dS)z alignment_specifier  : _ALIGNAS LPAREN type_name RPAREN
                                 | _ALIGNAS LPAREN constant_expression RPAREN
        rˆrrKN)rZAlignasr‰r|r r r!Úp_alignment_specifieraszCParser.p_alignment_specifiercCsbt|ƒdkr(t |dd| |d¡¡}nt |d|d| |d¡¡}| |j|j¡||d<dS)zR enumerator  : ID
                        | ID EQUALS constant_expression
        r]rNrˆrK)r+rZ
Enumeratorr‰r7r4r5)rr}Z
enumeratorr r r!Ú p_enumeratorgs 
þ
þzCParser.p_enumeratorcCs|d|d<dS)zQ declarator  : id_declarator
                        | typeid_declarator
        rrKNr r|r r r!Ú p_declaratorwszCParser.p_declarator)rIÚID)ZtypeidÚTYPEID)Ztypeid_noparenrÜcCs|d|d<dS)z1 xxx_declarator  : direct_xxx_declarator
        rrKNr r|r r r!Úp_xxx_declarator_1}szCParser.p_xxx_declarator_1cCs| |d|d¡|d<dS)z9 xxx_declarator  : pointer direct_xxx_declarator
        r]rrKN©rDr|r r r!Úp_xxx_declarator_2ƒszCParser.p_xxx_declarator_2c    Cs(tj|dddd| |d¡d|d<dS)z' direct_xxx_declarator   : yyy
        rNr_rK)rrAr‰r|r r r!Úp_direct_xxx_declarator_1‰s
ûz!CParser.p_direct_xxx_declarator_1cCs|d|d<dS)z@ direct_xxx_declarator   : LPAREN xxx_declarator RPAREN
        r]rKNr r|r r r!Úp_direct_xxx_declarator_2”sz!CParser.p_direct_xxx_declarator_2cCsft|ƒdkr|dngpg}tjdt|ƒdkr6|dn|d||djd}|j|d|d|d<dS)    z} direct_xxx_declarator   : direct_xxx_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
        r‡rˆNr’r©r?ZdimÚ    dim_qualsr5©rBrCrK)r+rÚ    ArrayDeclr5rD)rr}rMÚarrr r r!Úp_direct_xxx_declarator_3šsüz!CParser.p_direct_xxx_declarator_3cCs^dd„|d|dfDƒ}dd„|Dƒ}tjd|d||djd    }|j|d|d
|d <dS) zÿ direct_xxx_declarator   : direct_xxx_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET
                                    | direct_xxx_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET
        cSs g|]}t|tƒr|n|g‘qSr ©r@Úlist)rHÚitemr r r!rJ±sÿz5CParser.p_direct_xxx_declarator_4.<locals>.<listcomp>rˆr’cSs"g|]}|D]}|dk    r |‘q qSr'r )rHZsublistrSr r r!rJ³s
ÿNr‡rrârärK©rrår5rD)rr}Z listed_qualsrãrær r r!Úp_direct_xxx_declarator_4©sÿüz!CParser.p_direct_xxx_declarator_4c    CsZtjdt |d| |d¡¡|ddk    r0|dng|djd}|j|d|d|d<dS)zi direct_xxx_declarator   : direct_xxx_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET
        Nr’rˆrrârärK©rrårÛr‰r5rD©rr}rær r r!Úp_direct_xxx_declarator_5¿süz!CParser.p_direct_xxx_declarator_5cCsztj|dd|djd}| ¡jdkr`|jdk    r`|jjD]$}t|tjƒrNq`|     |j
|j¡q:|j |d|d|d<dS)z¹ direct_xxx_declarator   : direct_xxx_declarator LPAREN parameter_type_list RPAREN
                                    | direct_xxx_declarator LPAREN identifier_list_opt RPAREN
        rˆNr©Úargsr?r5ÚLBRACErärK) rrOr5r>r?rñÚparamsr@Ú EllipsisParamr7r4rD)rr}ÚfuncÚparamr r r!Úp_direct_xxx_declarator_6Ësý
  z!CParser.p_direct_xxx_declarator_6cCsj| |d¡}tj|dpgd|d}t|ƒdkr^|d}|jdk    rJ|j}q8||_|d|d<n||d<dS)zm pointer : TIMES type_qualifier_list_opt
                    | TIMES type_qualifier_list_opt pointer
        rr]N)rMr?r5rˆrK)r‰rZPtrDeclr+r?)rr}r5Z nested_typeZ    tail_typer r r!Ú    p_pointerès  
zCParser.p_pointercCs0t|ƒdkr|dgn|d|dg|d<dS)zs type_qualifier_list : type_qualifier
                                | type_qualifier_list type_qualifier
        r]rrKNr›r|r r r!Úp_type_qualifier_listszCParser.p_type_qualifier_listcCs:t|ƒdkr*|dj t | |d¡¡¡|d|d<dS)zn parameter_type_list : parameter_list
                                | parameter_list COMMA ELLIPSIS
        r]rrˆrKN)r+rór(rrôr‰r|r r r!Úp_parameter_type_list s zCParser.p_parameter_type_listcCsNt|ƒdkr*t |dg|dj¡|d<n |dj |d¡|d|d<dS)zz parameter_list  : parameter_declaration
                            | parameter_list COMMA parameter_declaration
        r]rrKrˆN©r+rZ    ParamListr5rór(r|r r r!Úp_parameter_lists zCParser.p_parameter_listcCsT|d}|ds.tjdg| |d¡dg|d<|j|t|ddgdd|d<d    S)
zŸ parameter_declaration   : declaration_specifiers id_declarator
                                    | declaration_specifiers typeid_noparen_declarator
        rr?rErFr]rÉrÈrKN)rrNr‰rlrrr r r!Úp_parameter_declaration_1)s
ÿ þþz!CParser.p_parameter_declaration_1c
Csâ|d}|ds.tjdg| |d¡dg|d<t|dƒdkrŽt|ddjƒdkrŽ| |ddjd¡rŽ|j|t|ddd    gd
d}nHtjd |d d|dp²t     dddd¡| |d¡d }|d}| 
||¡}||d<dS)zR parameter_declaration   : declaration_specifiers abstract_declarator_opt
        rr?rErFr/rKr]NrmrÈr rS©r4rMr`r?r5) rrNr‰r+rGr9rlrÚTypenamerArR)rr}rYrBrPr r r!Úp_parameter_declaration_25s0
ÿ &ÿþþ
û z!CParser.p_parameter_declaration_2cCsNt|ƒdkr*t |dg|dj¡|d<n |dj |d¡|d|d<dS)ze identifier_list : identifier
                            | identifier_list COMMA identifier
        r]rrKrˆNrûr|r r r!Úp_identifier_listUs zCParser.p_identifier_listcCs|d|d<dS)z- initializer : assignment_expression
        rrKNr r|r r r!Úp_initializer_1_szCParser.p_initializer_1cCs6|ddkr&t g| |d¡¡|d<n |d|d<dS)z‹ initializer : brace_open initializer_list_opt brace_close
                        | brace_open initializer_list COMMA brace_close
        r]NrrK)rÚInitListr‰r|r r r!Úp_initializer_2ds zCParser.p_initializer_2cCs–t|ƒdkrN|ddkr |dnt |d|d¡}t |g|dj¡|d<nD|ddkrb|dnt |d|d¡}|dj |¡|d|d<dS)z initializer_list    : designation_opt initializer
                                | initializer_list COMMA designation_opt initializer
        rˆrNr]rKr’)r+rZNamedInitializerrr5Úexprsr()rr}rar r r!Úp_initializer_listms  ((zCParser.p_initializer_listcCs|d|d<dS)z. designation : designator_list EQUALS
        rrKNr r|r r r!Ú p_designationyszCParser.p_designationcCs0t|ƒdkr|dgn|d|dg|d<dS)z_ designator_list : designator
                            | designator_list designator
        r]rrKNr›r|r r r!Úp_designator_listszCParser.p_designator_listcCs|d|d<dS)zi designator  : LBRACKET constant_expression RBRACKET
                        | PERIOD identifier
        r]rKNr r|r r r!Ú p_designator‡szCParser.p_designatorc
Cs\tjd|dddd…d|dp0t dddd¡| |d¡d}| ||dd¡|d<dS)    zH type_name   : specifier_qualifier_list abstract_declarator_opt
        r rrSNr]rþr?rK)rrÿrAr‰rR)rr}rPr r r!Ú p_type_names
ûzCParser.p_type_namecCs*t dddd¡}|j||dd|d<dS)z+ abstract_declarator     : pointer
        NrrärK)rrArD)rr}Z    dummytyper r r!Úp_abstract_declarator_1™s
þzCParser.p_abstract_declarator_1cCs| |d|d¡|d<dS)zF abstract_declarator     : pointer direct_abstract_declarator
        r]rrKNrÞr|r r r!Úp_abstract_declarator_2¡szCParser.p_abstract_declarator_2cCs|d|d<dS)z> abstract_declarator     : direct_abstract_declarator
        rrKNr r|r r r!Úp_abstract_declarator_3¦szCParser.p_abstract_declarator_3cCs|d|d<dS)zA direct_abstract_declarator  : LPAREN abstract_declarator RPAREN r]rKNr r|r r r!Úp_direct_abstract_declarator_1°sz&CParser.p_direct_abstract_declarator_1cCs6tjd|dg|djd}|j|d|d|d<dS)zn direct_abstract_declarator  : direct_abstract_declarator LBRACKET assignment_expression_opt RBRACKET
        NrˆrrârärKrërîr r r!Úp_direct_abstract_declarator_2´süz&CParser.p_direct_abstract_declarator_2cCsbt|ƒdkr|dngpg}tjt dddd¡t|ƒdkrB|dn|d|| |d¡d|d<dS)zk direct_abstract_declarator  : LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
        r’r]NrˆrrârK)r+rrårAr‰)rr}rMr r r!Úp_direct_abstract_declarator_3¿s
üz&CParser.p_direct_abstract_declarator_3c    CsFtjdt |d| |d¡¡g|djd}|j|d|d|d<dS)zZ direct_abstract_declarator  : direct_abstract_declarator LBRACKET TIMES RBRACKET
        NrˆrrârärKrírîr r r!Úp_direct_abstract_declarator_4Ésüz&CParser.p_direct_abstract_declarator_4c    CsBtjt dddd¡t |d| |d¡¡g| |d¡d|d<dS)z? direct_abstract_declarator  : LBRACKET TIMES RBRACKET
        NrˆrrârK)rrårArÛr‰r|r r r!Úp_direct_abstract_declarator_5Ôs 
üz&CParser.p_direct_abstract_declarator_5cCs4tj|dd|djd}|j|d|d|d<dS)zh direct_abstract_declarator  : direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN
        rˆNrrðrärK)rrOr5rD)rr}rõr r r!Úp_direct_abstract_declarator_6Ýs ýz&CParser.p_direct_abstract_declarator_6cCs0tj|dt dddd¡| |d¡d|d<dS)zM direct_abstract_declarator  : LPAREN parameter_type_list_opt RPAREN
        r]NrrðrK)rrOrAr‰r|r r r!Úp_direct_abstract_declarator_7çs
 
ýz&CParser.p_direct_abstract_declarator_7cCs(t|dtƒr|dn|dg|d<dS)zG block_item  : declaration
                        | statement
        rrKNrèr|r r r!Ú p_block_itemòszCParser.p_block_itemcCs:t|ƒdks|ddgkr"|dn|d|d|d<dS)z_ block_item_list : block_item
                            | block_item_list block_item
        r]NrrKr›r|r r r!Úp_block_item_listúszCParser.p_block_item_listcCs"tj|d| |d¡d|d<dS)zA compound_statement : brace_open block_item_list_opt brace_close r]rr•rKN)rr–r‰r|r r r!Úp_compound_statement_1s
þzCParser.p_compound_statement_1cCs&t |d|d| |d¡¡|d<dS)z6 labeled_statement : ID COLON pragmacomp_or_statement rrˆrKN)rZLabelr‰r|r r r!Úp_labeled_statement_1szCParser.p_labeled_statement_1cCs(t |d|dg| |d¡¡|d<dS)zL labeled_statement : CASE constant_expression COLON pragmacomp_or_statement r]r’rrKN)rZCaser‰r|r r r!Úp_labeled_statement_2 szCParser.p_labeled_statement_2cCs"t |dg| |d¡¡|d<dS)z; labeled_statement : DEFAULT COLON pragmacomp_or_statement rˆrrKN)rZDefaultr‰r|r r r!Úp_labeled_statement_3szCParser.p_labeled_statement_3c    Cs(t |d|dd| |d¡¡|d<dS)zK selection_statement : IF LPAREN expression RPAREN pragmacomp_or_statement rˆr‡NrrK©rZIfr‰r|r r r!Úp_selection_statement_1szCParser.p_selection_statement_1c    Cs,t |d|d|d| |d¡¡|d<dS)zZ selection_statement : IF LPAREN expression RPAREN statement ELSE pragmacomp_or_statement rˆr‡érrKNrr|r r r!Úp_selection_statement_2szCParser.p_selection_statement_2c    Cs*tt |d|d| |d¡¡ƒ|d<dS)zO selection_statement : SWITCH LPAREN expression RPAREN pragmacomp_or_statement rˆr‡rrKN)r    rZSwitchr‰r|r r r!Úp_selection_statement_3sÿzCParser.p_selection_statement_3cCs&t |d|d| |d¡¡|d<dS)zN iteration_statement : WHILE LPAREN expression RPAREN pragmacomp_or_statement rˆr‡rrKN)rZWhiler‰r|r r r!Úp_iteration_statement_1 szCParser.p_iteration_statement_1cCs&t |d|d| |d¡¡|d<dS)zV iteration_statement : DO pragmacomp_or_statement WHILE LPAREN expression RPAREN SEMI r‡r]rrKN)rZDoWhiler‰r|r r r!Úp_iteration_statement_2$szCParser.p_iteration_statement_2c
Cs2t |d|d|d|d| |d¡¡|d<dS)zx iteration_statement : FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement rˆr‡ré    rrKN)rÚForr‰r|r r r!Úp_iteration_statement_3(szCParser.p_iteration_statement_3c
CsBt t |d| |d¡¡|d|d|d| |d¡¡|d<dS)zp iteration_statement : FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement rˆrr’éérKN)rr#ZDeclListr‰r|r r r!Úp_iteration_statement_4,s 
ÿzCParser.p_iteration_statement_4cCs t |d| |d¡¡|d<dS)z  jump_statement  : GOTO ID SEMI r]rrKN)rZGotor‰r|r r r!Úp_jump_statement_11szCParser.p_jump_statement_1cCst | |d¡¡|d<dS)z jump_statement  : BREAK SEMI rrKN)rZBreakr‰r|r r r!Úp_jump_statement_25szCParser.p_jump_statement_2cCst | |d¡¡|d<dS)z! jump_statement  : CONTINUE SEMI rrKN)rÚContinuer‰r|r r r!Úp_jump_statement_39szCParser.p_jump_statement_3cCs0t t|ƒdkr|dnd| |d¡¡|d<dS)z\ jump_statement  : RETURN expression SEMI
                            | RETURN SEMI
        r’r]NrrK)rZReturnr+r‰r|r r r!Úp_jump_statement_4=szCParser.p_jump_statement_4cCs4|ddkr$t | |d¡¡|d<n |d|d<dS)z, expression_statement : expression_opt SEMI rNr]rK)rZEmptyStatementr‰r|r r r!Úp_expression_statementCs zCParser.p_expression_statementcCsjt|ƒdkr|d|d<nLt|dtjƒsFt |dg|dj¡|d<|dj |d¡|d|d<dS)zn expression  : assignment_expression
                        | expression COMMA assignment_expression
        r]rrKrˆN)r+r@rÚExprListr5rr(r|r r r!Ú p_expressionJs  zCParser.p_expressioncCs|d|d<dS)z: assignment_expression : LPAREN compound_statement RPAREN r]rKNr r|r r r!Ú#p_parenthesized_compound_expressionWsz+CParser.p_parenthesized_compound_expressioncCs$tj|dg| |d¡d|d<dS)z typedef_name : TYPEID rrFrKNr­r|r r r!Úp_typedef_name[szCParser.p_typedef_namecCsDt|ƒdkr|d|d<n&t |d|d|d|dj¡|d<dS)z› assignment_expression   : conditional_expression
                                    | unary_expression assignment_operator assignment_expression
        r]rrKrˆN)r+rZ
Assignmentr5r|r r r!Úp_assignment_expression_s zCParser.p_assignment_expressioncCs|d|d<dS)aÞ assignment_operator : EQUALS
                                | XOREQUAL
                                | TIMESEQUAL
                                | DIVEQUAL
                                | MODEQUAL
                                | PLUSEQUAL
                                | MINUSEQUAL
                                | LSHIFTEQUAL
                                | RSHIFTEQUAL
                                | ANDEQUAL
                                | OREQUAL
        rrKNr r|r r r!Úp_assignment_operatorms zCParser.p_assignment_operatorcCs|d|d<dS)z. constant_expression : conditional_expression rrKNr r|r r r!Úp_constant_expression|szCParser.p_constant_expressioncCsDt|ƒdkr|d|d<n&t |d|d|d|dj¡|d<dS)zœ conditional_expression  : binary_expression
                                    | binary_expression CONDOP expression COLON conditional_expression
        r]rrKrˆr‡N)r+rZ    TernaryOpr5r|r r r!Úp_conditional_expression€s z CParser.p_conditional_expressioncCsDt|ƒdkr|d|d<n&t |d|d|d|dj¡|d<dS)ak binary_expression   : cast_expression
                                | binary_expression TIMES binary_expression
                                | binary_expression DIVIDE binary_expression
                                | binary_expression MOD binary_expression
                                | binary_expression PLUS binary_expression
                                | binary_expression MINUS binary_expression
                                | binary_expression RSHIFT binary_expression
                                | binary_expression LSHIFT binary_expression
                                | binary_expression LT binary_expression
                                | binary_expression LE binary_expression
                                | binary_expression GE binary_expression
                                | binary_expression GT binary_expression
                                | binary_expression EQ binary_expression
                                | binary_expression NE binary_expression
                                | binary_expression AND binary_expression
                                | binary_expression OR binary_expression
                                | binary_expression XOR binary_expression
                                | binary_expression LAND binary_expression
                                | binary_expression LOR binary_expression
        r]rrKrˆN)r+rZBinaryOpr5r|r r r!Úp_binary_expression‰s zCParser.p_binary_expressioncCs|d|d<dS)z$ cast_expression : unary_expression rrKNr r|r r r!Úp_cast_expression_1£szCParser.p_cast_expression_1cCs&t |d|d| |d¡¡|d<dS)z; cast_expression : LPAREN type_name RPAREN cast_expression r]r’rrKN)rZCastr‰r|r r r!Úp_cast_expression_2§szCParser.p_cast_expression_2cCs|d|d<dS)z* unary_expression    : postfix_expression rrKNr r|r r r!Úp_unary_expression_1«szCParser.p_unary_expression_1cCs$t |d|d|dj¡|d<dS)z¸ unary_expression    : PLUSPLUS unary_expression
                                | MINUSMINUS unary_expression
                                | unary_operator cast_expression
        rr]rKN©rÚUnaryOpr5r|r r r!Úp_unary_expression_2¯szCParser.p_unary_expression_2cCs:t |dt|ƒdkr|dn|d| |d¡¡|d<dS)z» unary_expression    : SIZEOF unary_expression
                                | SIZEOF LPAREN type_name RPAREN
                                | _ALIGNOF LPAREN type_name RPAREN
        rrˆr]rKN)rr;r+r‰r|r r r!Úp_unary_expression_3¶s
 
ýzCParser.p_unary_expression_3cCs|d|d<dS)zÏ unary_operator  : AND
                            | TIMES
                            | PLUS
                            | MINUS
                            | NOT
                            | LNOT
        rrKNr r|r r r!Úp_unary_operatorÀszCParser.p_unary_operatorcCs|d|d<dS)z* postfix_expression  : primary_expression rrKNr r|r r r!Úp_postfix_expression_1ÊszCParser.p_postfix_expression_1cCs$t |d|d|dj¡|d<dS)zG postfix_expression  : postfix_expression LBRACKET expression RBRACKET rrˆrKN)rÚArrayRefr5r|r r r!Úp_postfix_expression_2ÎszCParser.p_postfix_expression_2cCs4t |dt|ƒdkr|dnd|dj¡|d<dS)zœ postfix_expression  : postfix_expression LPAREN argument_expression_list RPAREN
                                | postfix_expression LPAREN RPAREN
        rr‡rˆNrK)rÚFuncCallr+r5r|r r r!Úp_postfix_expression_3ÒszCParser.p_postfix_expression_3cCs>t |d| |d¡¡}t |d|d||dj¡|d<dS)zÿ postfix_expression  : postfix_expression PERIOD ID
                                | postfix_expression PERIOD TYPEID
                                | postfix_expression ARROW ID
                                | postfix_expression ARROW TYPEID
        rˆrr]rKN)rrÛr‰Ú    StructRefr5)rr}Úfieldr r r!Úp_postfix_expression_4ØszCParser.p_postfix_expression_4cCs(t d|d|d|dj¡|d<dS)z{ postfix_expression  : postfix_expression PLUSPLUS
                                | postfix_expression MINUSMINUS
        r}r]rrKNr:r|r r r!Úp_postfix_expression_5ászCParser.p_postfix_expression_5cCst |d|d¡|d<dS)zÇ postfix_expression  : LPAREN type_name RPAREN brace_open initializer_list brace_close
                                | LPAREN type_name RPAREN brace_open initializer_list COMMA brace_close
        r]r‡rKN)rZCompoundLiteralr|r r r!Úp_postfix_expression_6çszCParser.p_postfix_expression_6cCs|d|d<dS)z" primary_expression  : identifier rrKNr r|r r r!Úp_primary_expression_1íszCParser.p_primary_expression_1cCs|d|d<dS)z  primary_expression  : constant rrKNr r|r r r!Úp_primary_expression_2ñszCParser.p_primary_expression_2cCs|d|d<dS)zp primary_expression  : unified_string_literal
                                | unified_wstring_literal
        rrKNr r|r r r!Úp_primary_expression_3õszCParser.p_primary_expression_3cCs|d|d<dS)z0 primary_expression  : LPAREN expression RPAREN r]rKNr r|r r r!Úp_primary_expression_4ûszCParser.p_primary_expression_4cCsB| |d¡}t t |d|¡t |d|dg|¡|¡|d<dS)za primary_expression  : OFFSETOF LPAREN type_name COMMA offsetof_member_designator RPAREN
        rrˆr‡rKN)r‰rrBrÛr.)rr}r5r r r!Úp_primary_expression_5ÿs
 þzCParser.p_primary_expression_5cCst|ƒdkr|d|d<nrt|ƒdkrNt |d|d|d|dj¡|d<n>t|ƒdkr|t |d|d|dj¡|d<ntdt|ƒƒ‚dS)    zì offsetof_member_designator : identifier
                                         | offsetof_member_designator PERIOD identifier
                                         | offsetof_member_designator LBRACKET expression RBRACKET
        r]rrKr’rˆr‡z$Unexpected parsing state. len(p): %uN)r+rrDr5r@ÚNotImplementedErrorr|r r r!Úp_offsetof_member_designators  ( "z$CParser.p_offsetof_member_designatorcCsNt|ƒdkr*t |dg|dj¡|d<n |dj |d¡|d|d<dS)zœ argument_expression_list    : assignment_expression
                                        | argument_expression_list COMMA assignment_expression
        r]rrKrˆN)r+rr.r5rr(r|r r r!Úp_argument_expression_lists z"CParser.p_argument_expression_listcCs t |d| |d¡¡|d<dS)z identifier  : ID rrKN)rrÛr‰r|r r r!Ú p_identifierszCParser.p_identifiercCsœd}d}|ddd…D]&}|dkr.|d7}q|dkr|d7}qd}|dkrVtdƒ‚n|d    krftd
ƒ‚d |d |}t |d |d| |d¡¡|d<dS)zÆ constant    : INT_CONST_DEC
                        | INT_CONST_OCT
                        | INT_CONST_HEX
                        | INT_CONST_BIN
                        | INT_CONST_CHAR
        rKréýÿÿÿN©ÚlÚL)ÚuÚUr z.Constant cannot have more than one u/U suffix.r]z.Constant cannot have more than two l/L suffix.z    unsigned zlong rE)Ú
ValueErrorrÚConstantr‰)rr}ZuCountZlCountÚxrjÚprefixr r r!Ú p_constant_1#s$
 
 
 
ÿzCParser.p_constant_1cCshd|d ¡krd}n0|dddkr,d}n|dddkrBd}nd}t ||d| |d¡¡|d    <d
S) zM constant    : FLOAT_CONST
                        | HEX_FLOAT_CONST
        rZrÚfloatr/)ÚfÚFrSz long doubleÚdoublerKN)ÚlowerrrYr‰)rr}rjr r r!Ú p_constant_2:s
ÿzCParser.p_constant_2cCs"t d|d| |d¡¡|d<dS)z¿ constant    : CHAR_CONST
                        | WCHAR_CONST
                        | U8CHAR_CONST
                        | U16CHAR_CONST
                        | U32CHAR_CONST
        ÚcharrrKN)rrYr‰r|r r r!Ú p_constant_3Ks
 
ÿzCParser.p_constant_3cCsdt|ƒdkr,t d|d| |d¡¡|d<n4|djdd…|ddd…|d_|d|d<dS)z~ unified_string_literal  : STRING_LITERAL
                                    | unified_string_literal STRING_LITERAL
        r]ÚstringrrKNr/)r+rrYr‰Úvaluer|r r r!Úp_unified_string_literalZs 
ÿ
(z CParser.p_unified_string_literalcCsht|ƒdkr,t d|d| |d¡¡|d<n8|dj ¡dd…|ddd…|d_|d|d<dS)a unified_wstring_literal : WSTRING_LITERAL
                                    | U8STRING_LITERAL
                                    | U16STRING_LITERAL
                                    | U32STRING_LITERAL
                                    | unified_wstring_literal WSTRING_LITERAL
                                    | unified_wstring_literal U8STRING_LITERAL
                                    | unified_wstring_literal U16STRING_LITERAL
                                    | unified_wstring_literal U32STRING_LITERAL
        r]rerrKNr/)r+rrYr‰rfÚrstripr|r r r!Úp_unified_wstring_literales
 
ÿ
,z!CParser.p_unified_wstring_literalcCs"|d|d<| d| d¡¡dS)z  brace_open  :   LBRACE
        rrKN©Z
set_linenoÚlinenor|r r r!Ú p_brace_openvs zCParser.p_brace_opencCs"|d|d<| d| d¡¡dS)z  brace_close :   RBRACE
        rrKNrjr|r r r!Ú p_brace_close|s zCParser.p_brace_closecCs d|d<dS)zempty : NrKr r|r r r!Úp_empty‚szCParser.p_emptycCs@|r,| d|j|j|j|j |¡d¡n| d|jj¡dS)Nz
before: %s)rkr=zAt end of input)r2rfr:rkrZfind_tok_columnr$r|r r r!Úp_error†s
ÿþzCParser.p_errorN)r F)F)F)¯Ú__name__Ú
__module__Ú __qualname__rr"r%r*r.r6r7r9rrrrr>rDrRrZrlrqrtÚ
precedencer~rrr‚rƒr„r…r†rŠr‹rr‘r“r”r—r™ršrœržrŸr r¡r¢r¤r¥r¦r§r¨r©rªr«r¬r®r¯r±r²r³rµr¶r·r¸r¹rºr¼r½r¾rÂrÄrÅrÆrÇrÌrÍrÎrÏrÑrÒrÔrÕrÖr×rØrÙrÚrrÝrßràrárçrìrïr÷rørùrúrürýrrrrrrrr    r
r r r rrrrrrrrrrrrrrrrr r!r$r'r(r)r+r,r-r/r0r1r2r3r4r5r6r7r8r9r<r=r>r?rArCrFrGrHrIrJrKrLrMrOrPrQr\rbrdrgrirlrmrnror r r r!r srø
o     
 
    )2,  Y    
     7=     
 
         &         
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
      
      
 
     
                         
 
               
       r N)Zplyrr rZc_lexerrZ    plyparserrrrrZast_transformsr    r
r r r r r!Ú<module>    s