Click here for the  tool for dumping C programs into AST in Prolog. 
Only the pre-compiled binary for RedHat 9 is in there. Binaries for 
other Linux systems and Solaris can be produced as requested. The source code 
is also available for those who want deal with Ocaml and CIL by themselves.

A readme is in the end of this message. 

Please tell me your comments on the AST syntax as well as any bugs of the 
tool. Thanks.

-Wei Xu

----------------------------------------------------------------------------------
README

C2AST is a tool for dumping C programs into AST in Prolog.  It is
implemented based on CIL (http://manju.cs.berkeley.edu/cil/).

To use C2AST, please first run 

   ./configure 

to set up proper program paths. After that you can use 

   bin/c2ast 

wherever gcc appears. The AST output file is specified by the "--out"
option.

There are three examples (rfib.c, swap.c, and matrix.c) in the test/
directory.  Running

   make test
 
in the C2AST directory will produce the corresponding AST files (rfib.P,
swap.P, and matrix.P) for the C programs.  You may see error messages
like "undefined reference to `main'" during compilation.  They are normal
and can be safely ignored.


Syntax of AST (By Examples)
===========================

1. Program

prog(globals([v1,v2,v3]), functions([f1,f2]), entry(s10)).

2. Functions

func(f1, fn_main, formals([]), locals([v5,v6]), entry(s10)).

3. Variables

var(v1, global_a).
var(v5, local_main_i).

4. Statements

stmt(s1, skip).
stmt(s5, assign(e2,e9)).
stmt(s6, call(e1,e5,[e6,e7]).
stmt(s7, if(e6,s11,s12)).
stmt(s9, while(e8,s15)).
stmt(s10, return(e20)).
stmt(s12, block([s5,s7])).
stmt(s14, goto(s1)).

5. Expressions

expr(e1, number(1)).
expr(e3, string('Hello')).
expr(e2, variable(global_a, [idx(e1)])).
expr(e6, variable(local_main_s, [field(fld_name), idx(e1)])).
expr(e7, deref(e2, [field(val_name)])).
expr(e9, addrof(e6)).
expr(e10, not(e1)).		% Unary Ops: neg, not, bitnot
expr(e11, add(e7, e1)).		% Binary Ops: add, sub, mul, div, mod,
				%	      greater, less, equal,
				%	      geq, leq, neq, and, or,
				%	      bitand, bitor, bitxor,
				%	      lshift, rshift