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