| 
									
										
										
										
											2020-10-22 18:42:51 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | f'''
 | 
					
						
							|  |  |  |     struct {ANON_IDENTIFIER}; | 
					
						
							|  |  |  |     struct {{ ... }} | 
					
						
							|  |  |  |     struct {IDENTIFIER} {{ ... }} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     union {ANON_IDENTIFIER}; | 
					
						
							|  |  |  |     union {{ ... }} | 
					
						
							|  |  |  |     union {IDENTIFIER} {{ ... }} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     enum {ANON_IDENTIFIER}; | 
					
						
							|  |  |  |     enum {{ ... }} | 
					
						
							|  |  |  |     enum {IDENTIFIER} {{ ... }} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     typedef {VARTYPE} {IDENTIFIER}; | 
					
						
							|  |  |  |     typedef {IDENTIFIER}; | 
					
						
							|  |  |  |     typedef {IDENTIFIER}; | 
					
						
							|  |  |  |     typedef {IDENTIFIER}; | 
					
						
							|  |  |  | '''
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def parse(srclines): | 
					
						
							|  |  |  |     if isinstance(srclines, str):  # a filename | 
					
						
							|  |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-09 21:32:54 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-22 18:42:51 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | # This only handles at most 10 nested levels. | 
					
						
							|  |  |  | #MATCHED_PARENS = textwrap.dedent(rf''' | 
					
						
							|  |  |  | #    # matched parens | 
					
						
							|  |  |  | #    (?: | 
					
						
							|  |  |  | #        [(]  # level 0 | 
					
						
							|  |  |  | #        (?: | 
					
						
							|  |  |  | #            [^()]* | 
					
						
							|  |  |  | #            [(]  # level 1 | 
					
						
							|  |  |  | #            (?: | 
					
						
							|  |  |  | #                [^()]* | 
					
						
							|  |  |  | #                [(]  # level 2 | 
					
						
							|  |  |  | #                (?: | 
					
						
							|  |  |  | #                    [^()]* | 
					
						
							|  |  |  | #                    [(]  # level 3 | 
					
						
							|  |  |  | #                    (?: | 
					
						
							|  |  |  | #                        [^()]* | 
					
						
							|  |  |  | #                        [(]  # level 4 | 
					
						
							|  |  |  | #                        (?: | 
					
						
							|  |  |  | #                            [^()]* | 
					
						
							|  |  |  | #                            [(]  # level 5 | 
					
						
							|  |  |  | #                            (?: | 
					
						
							|  |  |  | #                                [^()]* | 
					
						
							|  |  |  | #                                [(]  # level 6 | 
					
						
							|  |  |  | #                                (?: | 
					
						
							|  |  |  | #                                    [^()]* | 
					
						
							|  |  |  | #                                    [(]  # level 7 | 
					
						
							|  |  |  | #                                    (?: | 
					
						
							|  |  |  | #                                        [^()]* | 
					
						
							|  |  |  | #                                        [(]  # level 8 | 
					
						
							|  |  |  | #                                        (?: | 
					
						
							|  |  |  | #                                            [^()]* | 
					
						
							|  |  |  | #                                            [(]  # level 9 | 
					
						
							|  |  |  | #                                            (?: | 
					
						
							|  |  |  | #                                                [^()]* | 
					
						
							|  |  |  | #                                                [(]  # level 10 | 
					
						
							|  |  |  | #                                                [^()]* | 
					
						
							|  |  |  | #                                                [)] | 
					
						
							|  |  |  | #                                             )* | 
					
						
							|  |  |  | #                                            [^()]* | 
					
						
							|  |  |  | #                                            [)] | 
					
						
							|  |  |  | #                                         )* | 
					
						
							|  |  |  | #                                        [^()]* | 
					
						
							|  |  |  | #                                        [)] | 
					
						
							|  |  |  | #                                     )* | 
					
						
							|  |  |  | #                                    [^()]* | 
					
						
							|  |  |  | #                                    [)] | 
					
						
							|  |  |  | #                                 )* | 
					
						
							|  |  |  | #                                [^()]* | 
					
						
							|  |  |  | #                                [)] | 
					
						
							|  |  |  | #                             )* | 
					
						
							|  |  |  | #                            [^()]* | 
					
						
							|  |  |  | #                            [)] | 
					
						
							|  |  |  | #                         )* | 
					
						
							|  |  |  | #                        [^()]* | 
					
						
							|  |  |  | #                        [)] | 
					
						
							|  |  |  | #                     )* | 
					
						
							|  |  |  | #                    [^()]* | 
					
						
							|  |  |  | #                    [)] | 
					
						
							|  |  |  | #                 )* | 
					
						
							|  |  |  | #                [^()]* | 
					
						
							|  |  |  | #                [)] | 
					
						
							|  |  |  | #             )* | 
					
						
							|  |  |  | #            [^()]* | 
					
						
							|  |  |  | #            [)] | 
					
						
							|  |  |  | #         )* | 
					
						
							|  |  |  | #        [^()]* | 
					
						
							|  |  |  | #        [)] | 
					
						
							|  |  |  | #     ) | 
					
						
							|  |  |  | #    # end matched parens | 
					
						
							|  |  |  | #    ''') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 17:53:25 +01:00
										 |  |  | r'''
 | 
					
						
							| 
									
										
										
										
											2020-10-22 18:42:51 -06:00
										 |  |  |         # for loop | 
					
						
							|  |  |  |         (?: | 
					
						
							|  |  |  |             \s* \b for | 
					
						
							|  |  |  |             \s* [(] | 
					
						
							|  |  |  |             ( | 
					
						
							|  |  |  |                 [^;]* ; | 
					
						
							|  |  |  |                 [^;]* ; | 
					
						
							|  |  |  |                 .*? | 
					
						
							|  |  |  |              )  # <header> | 
					
						
							|  |  |  |             [)] | 
					
						
							|  |  |  |             \s* | 
					
						
							|  |  |  |             (?: | 
					
						
							|  |  |  |                 (?: | 
					
						
							|  |  |  |                     ( | 
					
						
							|  |  |  |                         {_ind(SIMPLE_STMT, 6)} | 
					
						
							|  |  |  |                      )  # <stmt> | 
					
						
							|  |  |  |                     ; | 
					
						
							|  |  |  |                  ) | 
					
						
							|  |  |  |                 | | 
					
						
							|  |  |  |                 ( {{ )  # <open> | 
					
						
							|  |  |  |              ) | 
					
						
							|  |  |  |          ) | 
					
						
							|  |  |  |         | | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             ( | 
					
						
							|  |  |  |                 (?: | 
					
						
							|  |  |  |                     (?: | 
					
						
							|  |  |  |                         (?: | 
					
						
							|  |  |  |                             {_ind(SIMPLE_STMT, 6)} | 
					
						
							|  |  |  |                          )? | 
					
						
							|  |  |  |                         return \b \s* | 
					
						
							|  |  |  |                         {_ind(INITIALIZER, 5)} | 
					
						
							|  |  |  |                      ) | 
					
						
							|  |  |  |                     | | 
					
						
							|  |  |  |                     (?: | 
					
						
							|  |  |  |                         (?: | 
					
						
							|  |  |  |                             {IDENTIFIER} \s* | 
					
						
							|  |  |  |                             (?: . | -> ) \s* | 
					
						
							|  |  |  |                          )* | 
					
						
							|  |  |  |                         {IDENTIFIER} | 
					
						
							|  |  |  |                         \s* = \s* | 
					
						
							|  |  |  |                         {_ind(INITIALIZER, 5)} | 
					
						
							|  |  |  |                      ) | 
					
						
							|  |  |  |                     | | 
					
						
							|  |  |  |                     (?: | 
					
						
							|  |  |  |                         {_ind(SIMPLE_STMT, 5)} | 
					
						
							|  |  |  |                      ) | 
					
						
							|  |  |  |                  ) | 
					
						
							|  |  |  |                 | | 
					
						
							|  |  |  |                 # cast compound literal | 
					
						
							|  |  |  |                 (?: | 
					
						
							|  |  |  |                     (?: | 
					
						
							|  |  |  |                         [^'"{{}};]* | 
					
						
							|  |  |  |                         {_ind(STRING_LITERAL, 5)} | 
					
						
							|  |  |  |                      )* | 
					
						
							|  |  |  |                     [^'"{{}};]*? | 
					
						
							|  |  |  |                     [^'"{{}};=] | 
					
						
							|  |  |  |                     = | 
					
						
							|  |  |  |                     \s* [(] [^)]* [)] | 
					
						
							|  |  |  |                     \s* {{ [^;]* }} | 
					
						
							|  |  |  |                  ) | 
					
						
							|  |  |  |              )  # <stmt> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # compound statement | 
					
						
							|  |  |  |         (?: | 
					
						
							|  |  |  |             ( | 
					
						
							|  |  |  |                 (?: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     # "for" statements are handled separately above. | 
					
						
							|  |  |  |                     (?: (?: else \s+ )? if | switch | while ) \s* | 
					
						
							|  |  |  |                     {_ind(COMPOUND_HEAD, 5)} | 
					
						
							|  |  |  |                  ) | 
					
						
							|  |  |  |                 | | 
					
						
							|  |  |  |                 (?: else | do ) | 
					
						
							|  |  |  |                 # We do not worry about compound statements for labels, | 
					
						
							|  |  |  |                 # "case", or "default". | 
					
						
							|  |  |  |              )?  # <header> | 
					
						
							|  |  |  |             \s* | 
					
						
							|  |  |  |             ( {{ )  # <open> | 
					
						
							|  |  |  |          ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             ( | 
					
						
							|  |  |  |                 (?: | 
					
						
							|  |  |  |                     [^'"{{}};]* | 
					
						
							|  |  |  |                     {_ind(STRING_LITERAL, 5)} | 
					
						
							|  |  |  |                  )* | 
					
						
							|  |  |  |                 [^'"{{}};]* | 
					
						
							|  |  |  |                 # Presumably we will not see "== {{". | 
					
						
							|  |  |  |                 [^\s='"{{}};] | 
					
						
							|  |  |  |              )?  # <header> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             ( | 
					
						
							|  |  |  |                 \b | 
					
						
							|  |  |  |                 (?: | 
					
						
							|  |  |  |                     # We don't worry about labels with a compound statement. | 
					
						
							|  |  |  |                     (?: | 
					
						
							|  |  |  |                         switch \s* [(] [^{{]* [)] | 
					
						
							|  |  |  |                      ) | 
					
						
							|  |  |  |                     | | 
					
						
							|  |  |  |                     (?: | 
					
						
							|  |  |  |                         case \b \s* [^:]+ [:] | 
					
						
							|  |  |  |                      ) | 
					
						
							|  |  |  |                     | | 
					
						
							|  |  |  |                     (?: | 
					
						
							|  |  |  |                         default \s* [:] | 
					
						
							|  |  |  |                      ) | 
					
						
							|  |  |  |                     | | 
					
						
							|  |  |  |                     (?: | 
					
						
							|  |  |  |                         do | 
					
						
							|  |  |  |                      ) | 
					
						
							|  |  |  |                     | | 
					
						
							|  |  |  |                     (?: | 
					
						
							|  |  |  |                         while \s* [(] [^{{]* [)] | 
					
						
							|  |  |  |                      ) | 
					
						
							|  |  |  |                     | | 
					
						
							|  |  |  |                     #(?: | 
					
						
							|  |  |  |                     #    for \s* [(] [^{{]* [)] | 
					
						
							|  |  |  |                     # ) | 
					
						
							|  |  |  |                     #| | 
					
						
							|  |  |  |                     (?: | 
					
						
							|  |  |  |                         if \s* [(] | 
					
						
							|  |  |  |                         (?: [^{{]* [^)] \s* {{ )* [^{{]* | 
					
						
							|  |  |  |                         [)] | 
					
						
							|  |  |  |                      ) | 
					
						
							|  |  |  |                     | | 
					
						
							|  |  |  |                     (?: | 
					
						
							|  |  |  |                         else | 
					
						
							|  |  |  |                         (?: | 
					
						
							|  |  |  |                             \s* | 
					
						
							|  |  |  |                             if \s* [(] | 
					
						
							|  |  |  |                             (?: [^{{]* [^)] \s* {{ )* [^{{]* | 
					
						
							|  |  |  |                             [)] | 
					
						
							|  |  |  |                          )? | 
					
						
							|  |  |  |                      ) | 
					
						
							|  |  |  |                  ) | 
					
						
							|  |  |  |              )?  # <header> | 
					
						
							|  |  |  | '''
 |