blob: 1eec2a0bb77c76f6506f39a00ca7e7cbff7dc44d [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
48source_code = """
49int main()
50{
51 int a;
52 a = sizeof(int());
53}
54"""
55
56parser = CParser()
57ast = parser.parse(source_code)
58function_body = ast.ext[0].body #hardcoded to the main() function
59
60for stmt in function_body.stmts:
61 print stmt.coord, expand_decl(stmt.rvalue.expr.type)
62
63#~ class StructRefVisitor(c_ast.NodeVisitor):
64 #~ def visit_StructRef(self, node):
65 #~ print node.name.name, node.field.name
66
67
68#~ parser = c_parser.CParser()
69#~ ast = parser.parse(code)
70
71#~ ast.show()
72
73#~ v = StructRefVisitor()
74#~ v.visit(ast)
75