mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 10:26:02 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			244 lines
		
	
	
	
		
			6.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			244 lines
		
	
	
	
		
			6.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
 | |
| 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
 | |
| 
 | |
| 
 | |
| 
 | |
| # 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
 | |
| #    ''')
 | |
| 
 | |
| '''
 | |
|         # 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>
 | |
| '''
 | 
