• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #------------------------------------------------------------------------------
2 # pycparser: c-to-c.py
3 #
4 # Example of using pycparser.c_generator, serving as a simplistic translator
5 # from C to AST and back to C.
6 #
7 # Eli Bendersky [https://eli.thegreenplace.net/]
8 # License: BSD
9 #------------------------------------------------------------------------------
10 from __future__ import print_function
11 import sys
12 
13 # This is not required if you've installed pycparser into
14 # your site-packages/ with setup.py
15 #
16 sys.path.extend(['.', '..'])
17 
18 from pycparser import parse_file, c_parser, c_generator
19 
20 
21 def translate_to_c(filename):
22     """ Simply use the c_generator module to emit a parsed AST.
23     """
24     ast = parse_file(filename, use_cpp=True)
25     generator = c_generator.CGenerator()
26     print(generator.visit(ast))
27 
28 
29 def _zz_test_translate():
30     # internal use
31     src = r'''
32 
33     void f(char * restrict joe){}
34 
35 int main(void)
36 {
37     unsigned int long k = 4;
38     int p = - - k;
39     return 0;
40 }
41 '''
42     parser = c_parser.CParser()
43     ast = parser.parse(src)
44     ast.show()
45     generator = c_generator.CGenerator()
46 
47     print(generator.visit(ast))
48 
49     # tracing the generator for debugging
50     #~ import trace
51     #~ tr = trace.Trace(countcallers=1)
52     #~ tr.runfunc(generator.visit, ast)
53     #~ tr.results().write_results()
54 
55 
56 #------------------------------------------------------------------------------
57 if __name__ == "__main__":
58     #_zz_test_translate()
59     if len(sys.argv) > 1:
60         translate_to_c(sys.argv[1])
61     else:
62         print("Please provide a filename as argument")
63