eli.bendersky | 38165b7 | 2011-02-04 08:13:39 +0200 | [diff] [blame] | 1 | import sys
|
Eli Bendersky | 3921e8e | 2010-05-21 09:05:39 +0300 | [diff] [blame] | 2 | from pycparser.c_ast import *
|
| 3 | from pycparser.c_parser import CParser, Coord, ParseError
|
eli.bendersky | 38165b7 | 2011-02-04 08:13:39 +0200 | [diff] [blame] | 4 | from pycparser.c_lexer import CLexer
|
Eli Bendersky | 3921e8e | 2010-05-21 09:05:39 +0300 | [diff] [blame] | 5 |
|
| 6 |
|
| 7 | def expand_decl(decl):
|
| 8 | """ Converts the declaration into a nested list.
|
| 9 | """
|
| 10 | typ = type(decl)
|
| 11 |
|
| 12 | if typ == TypeDecl:
|
| 13 | return ['TypeDecl', expand_decl(decl.type)]
|
| 14 | elif typ == IdentifierType:
|
| 15 | return ['IdentifierType', decl.names]
|
| 16 | elif typ == ID:
|
| 17 | return ['ID', decl.name]
|
| 18 | elif typ in [Struct, Union]:
|
| 19 | decls = [expand_decl(d) for d in decl.decls or []]
|
| 20 | return [typ.__name__, decl.name, decls]
|
| 21 | else:
|
| 22 | nested = expand_decl(decl.type)
|
| 23 |
|
| 24 | if typ == Decl:
|
| 25 | if decl.quals:
|
| 26 | return ['Decl', decl.quals, decl.name, nested]
|
| 27 | else:
|
| 28 | return ['Decl', decl.name, nested]
|
| 29 | elif typ == Typename: # for function parameters
|
| 30 | if decl.quals:
|
| 31 | return ['Typename', decl.quals, nested]
|
| 32 | else:
|
| 33 | return ['Typename', nested]
|
| 34 | elif typ == ArrayDecl:
|
| 35 | dimval = decl.dim.value if decl.dim else ''
|
| 36 | return ['ArrayDecl', dimval, nested]
|
| 37 | elif typ == PtrDecl:
|
| 38 | return ['PtrDecl', nested]
|
| 39 | elif typ == Typedef:
|
| 40 | return ['Typedef', decl.name, nested]
|
| 41 | elif typ == FuncDecl:
|
| 42 | if decl.args:
|
| 43 | params = [expand_decl(param) for param in decl.args.params]
|
| 44 | else:
|
| 45 | params = []
|
| 46 | return ['FuncDecl', params, nested]
|
| 47 |
|
| 48 | #-----------------------------------------------------------------
|
| 49 |
|
eli.bendersky | 0e0a71f | 2010-10-09 08:32:00 +0200 | [diff] [blame] | 50 | if __name__ == "__main__":
|
| 51 | source_code = """
|
| 52 | int main()
|
| 53 | {
|
eli.bendersky | 4a31472 | 2010-12-10 07:19:31 +0200 | [diff] [blame] | 54 | const union blahunion tt = {
|
| 55 | .joe = {0, 1},
|
| 56 | .boo.bar[2] = 4};
|
eli.bendersky | 38ed9a9 | 2010-10-09 09:29:59 +0200 | [diff] [blame] | 57 | p++;
|
eli.bendersky | 0e0a71f | 2010-10-09 08:32:00 +0200 | [diff] [blame] | 58 | int a;
|
eli.bendersky | 0e0a71f | 2010-10-09 08:32:00 +0200 | [diff] [blame] | 59 | }
|
| 60 | """
|
Eli Bendersky | 3921e8e | 2010-05-21 09:05:39 +0300 | [diff] [blame] | 61 |
|
eli.bendersky | 38165b7 | 2011-02-04 08:13:39 +0200 | [diff] [blame] | 62 | source_code = """
|
eli.bendersky | c51e1d3 | 2011-02-04 08:52:33 +0200 | [diff] [blame^] | 63 | int main() {
|
| 64 | int foo, bar;;;
|
| 65 | float sdf;
|
| 66 | }
|
eli.bendersky | 38165b7 | 2011-02-04 08:13:39 +0200 | [diff] [blame] | 67 | """
|
| 68 |
|
| 69 | #--------------- Lexing
|
| 70 | #~ from pycparser.portability import printme
|
| 71 | #~ def errfoo(msg, a, b): |
| 72 | #~ printme(msg)
|
| 73 | #~ sys.exit()
|
| 74 | #~ clex = CLexer(errfoo, lambda t: False)
|
| 75 | #~ clex.build()
|
| 76 | #~ clex.input(source_code)
|
| 77 |
|
| 78 | #~ while 1:
|
| 79 | #~ tok = clex.token()
|
| 80 | #~ if not tok: break
|
| 81 |
|
| 82 | #~ printme([tok.value, tok.type, tok.lineno, clex.filename, tok.lexpos])
|
| 83 |
|
| 84 | #--------------- Parsing
|
eli.bendersky | 0e0a71f | 2010-10-09 08:32:00 +0200 | [diff] [blame] | 85 | parser = CParser()
|
| 86 | ast = parser.parse(source_code)
|
Eli Bendersky | 3921e8e | 2010-05-21 09:05:39 +0300 | [diff] [blame] | 87 |
|
eli.bendersky | 0e0a71f | 2010-10-09 08:32:00 +0200 | [diff] [blame] | 88 | ast.show()
|
Eli Bendersky | 3921e8e | 2010-05-21 09:05:39 +0300 | [diff] [blame] | 89 |
|