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#------------------------------------------------------------------------------ 10from __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.extend(['.', '..']) 17 18from pycparser import parse_file, c_parser, c_generator 19 20 21def 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 29def _zz_test_translate(): 30 # internal use 31 src = r''' 32 33 void f(char * restrict joe){} 34 35int 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#------------------------------------------------------------------------------ 57if __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