blob: 7ac00e11006b95717b20a282e16b9222234f70ef [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 {
eli.bendersky38ed9a92010-10-09 09:29:59 +020052 p++;
eli.bendersky0e0a71f2010-10-09 08:32:00 +020053 int a;
eli.bendersky0e0a71f2010-10-09 08:32:00 +020054 }
55 """
Eli Bendersky3921e8e2010-05-21 09:05:39 +030056
eli.bendersky0e0a71f2010-10-09 08:32:00 +020057 parser = CParser()
58 ast = parser.parse(source_code)
Eli Bendersky3921e8e2010-05-21 09:05:39 +030059
eli.bendersky0e0a71f2010-10-09 08:32:00 +020060 ast.show()
Eli Bendersky3921e8e2010-05-21 09:05:39 +030061