type constant = 
          Print_const_int of int
	| Print_const_dbl of float
        | Print_const_str of string

type constant_expr =
          Print_const_expr of constant
	| Print_const_expr_neg of constant_expr
	| Print_const_expr_not of constant_expr
	| Print_const_expr_binop of constant_expr * string * constant_expr
	| Print_const_expr_paren of constant_expr 

type constant_expr_list =
          Print_const_expr_list of constant_expr_list option * constant_expr

type expr =
     	  Print_expr_func of string * expr_list_opt
	| Print_expr_const of constant		
	| Print_expr_op of string * expr
        | Print_expr_lval of lvalue * string option
        | Print_expr_binop of expr * string * expr
	| Print_expr_asgop of lvalue * string * expr
	| Print_expr_paren of expr

and expr_list_opt = 
          Print_expr_list_opt of expr_list option

and expr_list = 
    	  Print_expr_list of expr_list option * expr
    		 
and lvalue =
          Print_lval_id of string
        | Print_lval_arr of lvalue * expr
        | Print_lval_obj of lvalue * string

and stmt_list =
          Print_stmt_list of stmt_list option * stmt

and stmt =
          Print_stmt of expr
        | Print_stmt_block of stmt_list
        | Print_stmt_if of expr * stmt
	| Print_stmt_ifelse of expr * stmt * stmt
        | Print_stmt_for of expr_opt * expr_opt * expr_opt * stmt
        | Print_stmt_break
        | Print_stmt_ret of expr
        | Print_stmt_noop

and expr_opt =
          Print_expropt of expr option  

type initializer_ =
          Print_init_const of constant_expr
        | Print_init_const_list of constant_expr_list	

type type_specifier = 
          Print_type_str of string
	| Print_type_list of type_specifier        
	| Print_type_struct of string

and declarator = 
          Print_declarator of string * initializer_ option

and declarator_list = 
          Print_declarator_list of declarator_list option * declarator

and declaration =
          Print_decl of type_specifier * declarator_list 
        | Print_decl_struct of string * declaration_list

and declaration_list =
          Print_decl_list of declaration_list option * declaration

type declaration_list_opt = 
          Print_decl_list_opt of declaration_list option

type function_body = 
          Print_funcbody of declaration_list_opt * stmt_list

type function_parameter =
          Print_func_param of type_specifier * string

type parameter_list =
          Print_param_list of parameter_list option * function_parameter

type param_list_opt = 
          Print_param_list_opt of parameter_list option

type function_declarator = 
          Print_func_decl of string * param_list_opt

type function_definition = 
          Print_func_def of type_specifier * function_declarator * function_body

type function_definition_list =
	  Print_func_def_list of function_definition_list option * function_definition

type program =
          Print_prog of declaration_list option * function_definition_list

	  

