c-to-c.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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 [http://eli.thegreenplace.net]
  8. # License: BSD
  9. #------------------------------------------------------------------------------
  10. from __future__ import print_function
  11. import sys
  12. # This is not required if you've installed pycparser into
  13. # your site-packages/ with setup.py
  14. #
  15. sys.path.extend(['.', '..'])
  16. from pycparser import parse_file, c_parser, c_generator
  17. def translate_to_c(filename):
  18. """ Simply use the c_generator module to emit a parsed AST.
  19. """
  20. ast = parse_file(filename, use_cpp=True)
  21. generator = c_generator.CGenerator()
  22. print(generator.visit(ast))
  23. def _zz_test_translate():
  24. # internal use
  25. src = r'''
  26. void f(char * restrict joe){}
  27. int main(void)
  28. {
  29. unsigned int long k = 4;
  30. int p = - - k;
  31. return 0;
  32. }
  33. '''
  34. parser = c_parser.CParser()
  35. ast = parser.parse(src)
  36. ast.show()
  37. generator = c_generator.CGenerator()
  38. print(generator.visit(ast))
  39. # tracing the generator for debugging
  40. #~ import trace
  41. #~ tr = trace.Trace(countcallers=1)
  42. #~ tr.runfunc(generator.visit, ast)
  43. #~ tr.results().write_results()
  44. #------------------------------------------------------------------------------
  45. if __name__ == "__main__":
  46. #_zz_test_translate()
  47. if len(sys.argv) > 1:
  48. translate_to_c(sys.argv[1])
  49. else:
  50. print("Please provide a filename as argument")