Eli Bendersky | 0e8e1b7 | 2012-01-24 05:53:41 +0200 | [diff] [blame] | 1 | #------------------------------------------------------------------------------ |
eli.bendersky | d5ba345 | 2011-02-18 21:32:47 +0200 | [diff] [blame] | 2 | # pycparser: c-to-c.py |
| 3 | # |
Eli Bendersky | 0e8e1b7 | 2012-01-24 05:53:41 +0200 | [diff] [blame] | 4 | # Example of using pycparser.c_generator, serving as a simplistic translator |
| 5 | # from C to AST and back to C. |
eli.bendersky | d5ba345 | 2011-02-18 21:32:47 +0200 | [diff] [blame] | 6 | # |
Eli Bendersky | 0e8e1b7 | 2012-01-24 05:53:41 +0200 | [diff] [blame] | 7 | # Copyright (C) 2008-2012, Eli Bendersky |
eli.bendersky | 84a6a63 | 2011-04-29 09:00:43 +0300 | [diff] [blame] | 8 | # License: BSD |
Eli Bendersky | 0e8e1b7 | 2012-01-24 05:53:41 +0200 | [diff] [blame] | 9 | #------------------------------------------------------------------------------ |
eli.bendersky | d5ba345 | 2011-02-18 21:32:47 +0200 | [diff] [blame] | 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 | # |
Ben | f86dea1 | 2012-02-03 06:24:55 +0200 | [diff] [blame] | 16 | sys.path.extend(['.', '..']) |
eli.bendersky | d5ba345 | 2011-02-18 21:32:47 +0200 | [diff] [blame] | 17 | |
Eli Bendersky | 0e8e1b7 | 2012-01-24 05:53:41 +0200 | [diff] [blame] | 18 | from pycparser import parse_file, c_parser, c_generator |
eli.bendersky | b36f5bb | 2011-03-06 07:22:33 +0200 | [diff] [blame] | 19 | |
eli.bendersky | d5ba345 | 2011-02-18 21:32:47 +0200 | [diff] [blame] | 20 | |
| 21 | def translate_to_c(filename): |
| 22 | ast = parse_file(filename, use_cpp=True) |
Eli Bendersky | 0e8e1b7 | 2012-01-24 05:53:41 +0200 | [diff] [blame] | 23 | generator = c_generator.CGenerator() |
eli.bendersky | afcfaac | 2011-02-25 16:46:01 +0200 | [diff] [blame] | 24 | print(generator.visit(ast)) |
eli.bendersky | d5ba345 | 2011-02-18 21:32:47 +0200 | [diff] [blame] | 25 | |
| 26 | |
eli.bendersky | b36f5bb | 2011-03-06 07:22:33 +0200 | [diff] [blame] | 27 | def zz_test_translate(): |
| 28 | # internal use |
eli.bendersky | 8e6c586 | 2011-05-20 12:35:08 +0300 | [diff] [blame] | 29 | src = r''' |
eli.bendersky | 1bd6c17 | 2011-07-16 06:43:20 +0300 | [diff] [blame] | 30 | |
Eli Bendersky | 875bd88 | 2012-01-24 06:12:50 +0200 | [diff] [blame] | 31 | void f(char * restrict joe){} |
eli.bendersky | 1bd6c17 | 2011-07-16 06:43:20 +0300 | [diff] [blame] | 32 | |
eli.bendersky | 8348a9d | 2011-05-26 07:01:43 +0300 | [diff] [blame] | 33 | int main(void) |
| 34 | { |
Eli Bendersky | 68497c2 | 2012-01-19 06:04:58 +0200 | [diff] [blame] | 35 | unsigned int long k = 4; |
Eli Bendersky | bf4fae8 | 2012-01-24 06:06:24 +0200 | [diff] [blame] | 36 | int p = - - k; |
eli.bendersky | 91c0aa3 | 2011-10-16 05:50:43 +0200 | [diff] [blame] | 37 | return 0; |
eli.bendersky | 8348a9d | 2011-05-26 07:01:43 +0300 | [diff] [blame] | 38 | } |
| 39 | ''' |
eli.bendersky | 8e6c586 | 2011-05-20 12:35:08 +0300 | [diff] [blame] | 40 | parser = c_parser.CParser() |
| 41 | ast = parser.parse(src) |
| 42 | ast.show() |
Eli Bendersky | 0e8e1b7 | 2012-01-24 05:53:41 +0200 | [diff] [blame] | 43 | generator = c_generator.CGenerator() |
eli.bendersky | 8e6c586 | 2011-05-20 12:35:08 +0300 | [diff] [blame] | 44 | |
| 45 | print(generator.visit(ast)) |
| 46 | |
| 47 | # tracing the generator for debugging |
| 48 | #~ import trace |
| 49 | #~ tr = trace.Trace(countcallers=1) |
| 50 | #~ tr.runfunc(generator.visit, ast) |
| 51 | #~ tr.results().write_results() |
eli.bendersky | b36f5bb | 2011-03-06 07:22:33 +0200 | [diff] [blame] | 52 | |
| 53 | |
| 54 | #------------------------------------------------------------------------------ |
| 55 | if __name__ == "__main__": |
Eli Bendersky | 7fd8897 | 2012-01-24 06:14:41 +0200 | [diff] [blame] | 56 | #zz_test_translate() |
eli.bendersky | b36f5bb | 2011-03-06 07:22:33 +0200 | [diff] [blame] | 57 | if len(sys.argv) > 1: |
| 58 | translate_to_c(sys.argv[1]) |
| 59 | else: |
eli.bendersky | d5ba345 | 2011-02-18 21:32:47 +0200 | [diff] [blame] | 60 | print("Please provide a filename as argument") |
eli.bendersky | 3ae9f7a | 2011-02-27 07:19:41 +0200 | [diff] [blame] | 61 | |