blob: ca76cc587d257ce4da3167ed2c8dda029b3c4296 [file] [log] [blame]
Eli Bendersky0e8e1b72012-01-24 05:53:41 +02001#------------------------------------------------------------------------------
eli.benderskyd5ba3452011-02-18 21:32:47 +02002# pycparser: c-to-c.py
3#
Eli Bendersky0e8e1b72012-01-24 05:53:41 +02004# Example of using pycparser.c_generator, serving as a simplistic translator
5# from C to AST and back to C.
eli.benderskyd5ba3452011-02-18 21:32:47 +02006#
Eli Bendersky0e8e1b72012-01-24 05:53:41 +02007# Copyright (C) 2008-2012, Eli Bendersky
eli.bendersky84a6a632011-04-29 09:00:43 +03008# License: BSD
Eli Bendersky0e8e1b72012-01-24 05:53:41 +02009#------------------------------------------------------------------------------
eli.benderskyd5ba3452011-02-18 21:32:47 +020010from __future__ import print_function
11import sys
12
13# This is not required if you've installed pycparser into
14# your site-packages/ with setup.py
15#
16sys.path.insert(0, '..')
17
Eli Bendersky0e8e1b72012-01-24 05:53:41 +020018from pycparser import parse_file, c_parser, c_generator
eli.benderskyb36f5bb2011-03-06 07:22:33 +020019
eli.benderskyd5ba3452011-02-18 21:32:47 +020020
21def translate_to_c(filename):
22 ast = parse_file(filename, use_cpp=True)
Eli Bendersky0e8e1b72012-01-24 05:53:41 +020023 generator = c_generator.CGenerator()
eli.benderskyafcfaac2011-02-25 16:46:01 +020024 print(generator.visit(ast))
eli.benderskyd5ba3452011-02-18 21:32:47 +020025
26
eli.benderskyb36f5bb2011-03-06 07:22:33 +020027def zz_test_translate():
28 # internal use
eli.bendersky8e6c5862011-05-20 12:35:08 +030029 src = r'''
eli.bendersky1bd6c172011-07-16 06:43:20 +030030
31 void f(void){}
32
eli.bendersky8348a9d2011-05-26 07:01:43 +030033int main(void)
34{
Eli Bendersky68497c22012-01-19 06:04:58 +020035 unsigned int long k = 4;
eli.bendersky91c0aa32011-10-16 05:50:43 +020036 return 0;
eli.bendersky8348a9d2011-05-26 07:01:43 +030037}
38'''
eli.bendersky8e6c5862011-05-20 12:35:08 +030039 parser = c_parser.CParser()
40 ast = parser.parse(src)
41 ast.show()
Eli Bendersky0e8e1b72012-01-24 05:53:41 +020042 generator = c_generator.CGenerator()
eli.bendersky8e6c5862011-05-20 12:35:08 +030043
44 print(generator.visit(ast))
45
46 # tracing the generator for debugging
47 #~ import trace
48 #~ tr = trace.Trace(countcallers=1)
49 #~ tr.runfunc(generator.visit, ast)
50 #~ tr.results().write_results()
eli.benderskyb36f5bb2011-03-06 07:22:33 +020051
52
53#------------------------------------------------------------------------------
54if __name__ == "__main__":
Eli Bendersky0e8e1b72012-01-24 05:53:41 +020055 #zz_test_translate()
eli.benderskyb36f5bb2011-03-06 07:22:33 +020056 if len(sys.argv) > 1:
57 translate_to_c(sys.argv[1])
58 else:
eli.benderskyd5ba3452011-02-18 21:32:47 +020059 print("Please provide a filename as argument")
eli.bendersky3ae9f7a2011-02-27 07:19:41 +020060