Add poc files

This commit is contained in:
Joey Yakimowich-Payne 2018-05-26 10:55:38 +09:00
commit fa600b98f7
220 changed files with 45679 additions and 0 deletions

227
lang_c/parsing/visitor_c.ml Normal file
View file

@ -0,0 +1,227 @@
(* Yoann Padioleau
*
* Copyright (C) 2014 Facebook
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License (GPL)
* version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* file license.txt for more details.
*)
open Ocaml
open Ast_c
(*****************************************************************************)
(* Prelude *)
(*****************************************************************************)
(*****************************************************************************)
(* Types *)
(*****************************************************************************)
(* hooks *)
type visitor_in = {
kexpr: Ast_c.expr vin;
kinfo: Ast_cpp.tok vin;
}
and visitor_out = any -> unit
and 'a vin = ('a -> unit) * visitor_out -> 'a -> unit
module Ast_cpp = struct
let v_assignOp _ = ()
let v_fixOp _ = ()
let v_unaryOp _ = ()
let v_binaryOp _ = ()
end
let default_visitor = {
kinfo = (fun (k,_) x -> k x);
kexpr = (fun (k,_) x -> k x);
}
let (mk_visitor: visitor_in -> visitor_out) = fun vin ->
let rec v_info x =
let k _ = () in
vin.kinfo (k, all_functions) x
and v_wrap:'a. ('a -> unit) -> 'a wrap -> unit =
fun _of_a (v1, v2) ->
let v1 = _of_a v1 and v2 = v_info v2 in ()
and v_name v = v_wrap v_string v
and v_type_ =
function
| TBase v1 -> let v1 = v_name v1 in ()
| TPointer v1 -> let v1 = v_type_ v1 in ()
| TArray ((v1, v2)) ->
let v1 = v_option v_const_expr v1 and v2 = v_type_ v2 in ()
| TFunction v1 -> let v1 = v_function_type v1 in ()
| TStructName ((v1, v2)) ->
let v1 = v_struct_kind v1 and v2 = v_name v2 in ()
| TEnumName v1 -> let v1 = v_name v1 in ()
| TTypeName v1 -> let v1 = v_name v1 in ()
and v_function_type (v1, v2) =
let v1 = v_type_ v1 and v2 = v_list v_parameter v2 in ()
and v_parameter { p_type = v_p_type; p_name = v_p_name } =
let arg = v_type_ v_p_type in let arg = v_option v_name v_p_name in ()
and v_struct_kind = function | Struct -> () | Union -> ()
and v_const_expr v = v_expr v
and v_expr x =
let k x = match x with
| Int v1 -> let v1 = v_wrap v_string v1 in ()
| Float v1 -> let v1 = v_wrap v_string v1 in ()
| String v1 -> let v1 = v_wrap v_string v1 in ()
| Char v1 -> let v1 = v_wrap v_string v1 in ()
| Id v1 -> let v1 = v_name v1 in ()
| Call ((v1, v2)) -> let v1 = v_expr v1 and v2 = v_list v_argument v2 in ()
| Assign ((v1, v2, v3)) ->
let v1 = v_wrap Ast_cpp.v_assignOp v1
and v2 = v_expr v2
and v3 = v_expr v3
in ()
| ArrayAccess ((v1, v2)) -> let v1 = v_expr v1 and v2 = v_expr v2 in ()
| RecordPtAccess ((v1, v2)) -> let v1 = v_expr v1 and v2 = v_name v2 in ()
| Cast ((v1, v2)) -> let v1 = v_type_ v1 and v2 = v_expr v2 in ()
| Postfix ((v1, v2)) ->
let v1 = v_expr v1 and v2 = v_wrap Ast_cpp.v_fixOp v2 in ()
| Infix ((v1, v2)) ->
let v1 = v_expr v1 and v2 = v_wrap Ast_cpp.v_fixOp v2 in ()
| Unary ((v1, v2)) ->
let v1 = v_expr v1 and v2 = v_wrap Ast_cpp.v_unaryOp v2 in ()
| Binary ((v1, v2, v3)) ->
let v1 = v_expr v1
and v2 = v_wrap Ast_cpp.v_binaryOp v2
and v3 = v_expr v3
in ()
| CondExpr ((v1, v2, v3)) ->
let v1 = v_expr v1 and v2 = v_expr v2 and v3 = v_expr v3 in ()
| Sequence ((v1, v2)) -> let v1 = v_expr v1 and v2 = v_expr v2 in ()
| SizeOf v1 -> let v1 = Ocaml.v_either v_expr v_type_ v1 in ()
| ArrayInit v1 ->
let v1 =
v_list
(fun (v1, v2) ->
let v1 = v_option v_expr v1 and v2 = v_expr v2 in ())
v1
in ()
| RecordInit v1 ->
let v1 =
v_list (fun (v1, v2) -> let v1 = v_name v1 and v2 = v_expr v2 in ())
v1
in ()
| GccConstructor ((v1, v2)) -> let v1 = v_type_ v1 and v2 = v_expr v2 in ()
in
vin.kexpr (k, all_functions) x
and v_argument v = v_expr v
and v_stmt =
function
| ExprSt v1 -> let v1 = v_expr v1 in ()
| Block v1 -> let v1 = v_list v_stmt v1 in ()
| If ((v1, v2, v3)) ->
let v1 = v_expr v1 and v2 = v_stmt v2 and v3 = v_stmt v3 in ()
| Switch ((v1, v2)) -> let v1 = v_expr v1 and v2 = v_list v_case v2 in ()
| While ((v1, v2)) -> let v1 = v_expr v1 and v2 = v_stmt v2 in ()
| DoWhile ((v1, v2)) -> let v1 = v_stmt v1 and v2 = v_expr v2 in ()
| For ((v1, v2, v3, v4)) ->
let v1 = v_option v_expr v1
and v2 = v_option v_expr v2
and v3 = v_option v_expr v3
and v4 = v_stmt v4
in ()
| Return v1 -> let v1 = v_option v_expr v1 in ()
| Continue -> ()
| Break -> ()
| Label ((v1, v2)) -> let v1 = v_name v1 and v2 = v_stmt v2 in ()
| Goto v1 -> let v1 = v_name v1 in ()
| Vars v1 -> let v1 = v_list v_var_decl v1 in ()
| Asm v1 -> let v1 = v_list v_expr v1 in ()
and v_case =
function
| Case ((v1, v2)) -> let v1 = v_expr v1 and v2 = v_list v_stmt v2 in ()
| Default v1 -> let v1 = v_list v_stmt v1 in ()
and
v_var_decl {
v_name = v_v_name;
v_type = v_v_type;
v_storage = v_v_storage;
v_init = v_v_init
} =
let arg = v_name v_v_name in
let arg = v_type_ v_v_type in
let arg = v_storage v_v_storage in
let arg = v_option v_initialiser v_v_init in ()
and v_initialiser v = v_expr v
and v_storage = function | Extern -> () | Static -> () | DefaultStorage -> ()
and v_struct_def { s_name = v_s_name; s_kind = v_s_kind; s_flds = v_s_flds } =
let arg = v_name v_s_name in
let arg = v_struct_kind v_s_kind in
let arg = v_list v_field_def v_s_flds in ()
and v_field_def { fld_name = v_fld_name; fld_type = v_fld_type } =
let arg = v_option v_name v_fld_name in let arg = v_type_ v_fld_type in ()
and v_func_def {
f_name = v_f_name;
f_type = v_f_type;
f_body = v_f_body;
f_static = v_f_static
} =
let arg = v_name v_f_name in
let arg = v_function_type v_f_type in
let arg = v_list v_stmt v_f_body in let arg = v_bool v_f_static in ()
and v_define_body =
function
| CppExpr v1 -> let v1 = v_expr v1 in ()
| CppStmt v1 -> let v1 = v_stmt v1 in ()
and v_toplevel =
function
| Include v1 -> let v1 = v_wrap v_string v1 in ()
| Define ((v1, v2)) -> let v1 = v_name v1 and v2 = v_define_body v2 in ()
| Macro ((v1, v2, v3)) ->
let v1 = v_name v1
and v2 = v_list v_name v2
and v3 = v_define_body v3
in ()
| StructDef v1 -> let v1 = v_struct_def v1 in ()
| TypeDef v1 -> let v1 = v_type_def v1 in ()
| EnumDef v1 -> let v1 = v_enum_def v1 in ()
| FuncDef v1 -> let v1 = v_func_def v1 in ()
| Global v1 -> let v1 = v_var_decl v1 in ()
| Prototype v1 -> let v1 = v_func_def v1 in ()
and v_type_def (v1, v2) = let v1 = v_name v1 and v2 = v_type_ v2 in ()
and v_enum_def (v1, v2) =
let v1 = v_name v1
and v2 =
v_list
(fun (v1, v2) -> let v1 = v_name v1 and v2 = v_option v_expr v2 in ())
v2
in ()
and v_any =
function
| Expr v1 -> let v1 = v_expr v1 in ()
| Stmt v1 -> let v1 = v_stmt v1 in ()
| Type v1 -> let v1 = v_type_ v1 in ()
| Toplevel v1 -> let v1 = v_toplevel v1 in ()
| Program v1 -> let v1 = v_program v1 in ()
and v_program v = v_list v_toplevel v
and all_functions x = v_any x
in
v_any