blob: 59400aaa7a41a449ac1e10b9be2b8b37fcf303d5 [file] [log] [blame]
Eli Bendersky3921e8e2010-05-21 09:05:39 +03001from pycparser.c_ast import *
2from pycparser.c_parser import CParser, Coord, ParseError
3
4
5def expand_decl(decl):
6 """ Converts the declaration into a nested list.
7 """
8 typ = type(decl)
9
10 if typ == TypeDecl:
11 return ['TypeDecl', expand_decl(decl.type)]
12 elif typ == IdentifierType:
13 return ['IdentifierType', decl.names]
14 elif typ == ID:
15 return ['ID', decl.name]
16 elif typ in [Struct, Union]:
17 decls = [expand_decl(d) for d in decl.decls or []]
18 return [typ.__name__, decl.name, decls]
19 else:
20 nested = expand_decl(decl.type)
21
22 if typ == Decl:
23 if decl.quals:
24 return ['Decl', decl.quals, decl.name, nested]
25 else:
26 return ['Decl', decl.name, nested]
27 elif typ == Typename: # for function parameters
28 if decl.quals:
29 return ['Typename', decl.quals, nested]
30 else:
31 return ['Typename', nested]
32 elif typ == ArrayDecl:
33 dimval = decl.dim.value if decl.dim else ''
34 return ['ArrayDecl', dimval, nested]
35 elif typ == PtrDecl:
36 return ['PtrDecl', nested]
37 elif typ == Typedef:
38 return ['Typedef', decl.name, nested]
39 elif typ == FuncDecl:
40 if decl.args:
41 params = [expand_decl(param) for param in decl.args.params]
42 else:
43 params = []
44 return ['FuncDecl', params, nested]
45
46#-----------------------------------------------------------------
47
eli.bendersky0e0a71f2010-10-09 08:32:00 +020048if __name__ == "__main__":
49 source_code = """
50 int main()
51 {
52 int a;
53 struct joe {
54 int :6;
55 int blbl:2;
56 } kwa;
57 a = sizeof(int());
58 }
59 """
Eli Bendersky3921e8e2010-05-21 09:05:39 +030060
eli.bendersky0e0a71f2010-10-09 08:32:00 +020061 parser = CParser()
62 ast = parser.parse(source_code)
Eli Bendersky3921e8e2010-05-21 09:05:39 +030063
eli.bendersky0e0a71f2010-10-09 08:32:00 +020064 ast.show()
Eli Bendersky3921e8e2010-05-21 09:05:39 +030065