blob: c35daad2c4eed5b2f1d2b6adf37f95ae7bd9b6a5 [file] [log] [blame]
eli.bendersky38165b72011-02-04 08:13:39 +02001import sys
Eli Bendersky3921e8e2010-05-21 09:05:39 +03002from pycparser.c_ast import *
3from pycparser.c_parser import CParser, Coord, ParseError
eli.bendersky38165b72011-02-04 08:13:39 +02004from pycparser.c_lexer import CLexer
Eli Bendersky3921e8e2010-05-21 09:05:39 +03005
6
7def 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.bendersky0e0a71f2010-10-09 08:32:00 +020050if __name__ == "__main__":
51 source_code = """
52 int main()
53 {
eli.bendersky4a314722010-12-10 07:19:31 +020054 const union blahunion tt = {
55 .joe = {0, 1},
56 .boo.bar[2] = 4};
eli.bendersky38ed9a92010-10-09 09:29:59 +020057 p++;
eli.bendersky0e0a71f2010-10-09 08:32:00 +020058 int a;
eli.bendersky0e0a71f2010-10-09 08:32:00 +020059 }
60 """
Eli Bendersky3921e8e2010-05-21 09:05:39 +030061
eli.bendersky38165b72011-02-04 08:13:39 +020062 source_code = """
eli.bendersky75092b32011-02-04 09:03:28 +020063 union
64 {
65 long sa;
66 int sb;
67 };
eli.bendersky38165b72011-02-04 08:13:39 +020068 """
69
70 #--------------- Lexing
eli.bendersky38165b72011-02-04 08:13:39 +020071 #~ 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.bendersky0e0a71f2010-10-09 08:32:00 +020085 parser = CParser()
86 ast = parser.parse(source_code)
Eli Bendersky3921e8e2010-05-21 09:05:39 +030087
eli.bendersky0e0a71f2010-10-09 08:32:00 +020088 ast.show()
Eli Bendersky3921e8e2010-05-21 09:05:39 +030089