ppxlib-pp-ast as a --show-attrs flag that controls whether attributes are shown Consider the following .ml file: $ cat > test.ml << EOF > let x = 2 + (2[@foo 1]) > [@@bar: int * string] > EOF And how it's printed without the flag: $ ppxlib-pp-ast test.ml [ Pstr_value ( Nonrecursive , [ { pvb_pat = Ppat_var "x" ; pvb_expr = Pexp_apply ( Pexp_ident (Lident "+") , [ ( Nolabel, Pexp_constant (Pconst_integer ( "2", None))) ; ( Nolabel, Pexp_constant (Pconst_integer ( "2", None))) ] ) ; pvb_constraint = None ; pvb_attributes = __attrs ; pvb_loc = __loc } ] ) ] And with the flag: $ ppxlib-pp-ast --show-attrs test.ml [ Pstr_value ( Nonrecursive , [ { pvb_pat = Ppat_var "x" ; pvb_expr = Pexp_apply ( Pexp_ident (Lident "+") , [ ( Nolabel, Pexp_constant (Pconst_integer ( "2", None))) ; ( Nolabel , { pexp_desc = Pexp_constant (Pconst_integer ( "2", None)) ; pexp_loc = __loc ; pexp_loc_stack = __lstack ; pexp_attributes = [ { attr_name = "foo" ; attr_payload = PStr [ Pstr_eval ( Pexp_constant (Pconst_integer ( "1", None)) , [] ) ] ; attr_loc = __loc } ] } ) ] ) ; pvb_constraint = None ; pvb_attributes = [ { attr_name = "bar" ; attr_payload = PTyp (Ptyp_tuple [ Ptyp_constr ( Lident "int", []) ; Ptyp_constr ( Lident "string", []) ]) ; attr_loc = __loc } ] ; pvb_loc = __loc } ] ) ] Without the flag, floating attributes are simply skipped. Consider the following files: $ cat > test_floating.ml << EOF > [@@@floating] > let x = 2 > class c = object > [@@@floating] > method! f () = () > end > EOF and: $ cat > test_floating.mli << EOF > [@@@floating] > val x : int > class type t = object > [@@@floating] > method f : unit -> unit > end > EOF When printed without the flag, floating attributes are filtered out: $ ppxlib-pp-ast test_floating.ml [ Pstr_value ( Nonrecursive , [ { pvb_pat = Ppat_var "x" ; pvb_expr = Pexp_constant (Pconst_integer ( "2", None)) ; pvb_constraint = None ; pvb_attributes = __attrs ; pvb_loc = __loc } ] ) ; Pstr_class [ { pci_virt = Concrete ; pci_params = [] ; pci_name = "c" ; pci_expr = Pcl_structure { pcstr_self = Ppat_any ; pcstr_fields = [ Pcf_method ( "f" , Public , Cfk_concrete ( Override , Pexp_poly ( Pexp_function ( [ { pparam_loc = __loc ; pparam_desc = Pparam_val ( Nolabel , None , Ppat_construct ( Lident "()", None) ) } ] , None , Pfunction_body (Pexp_construct ( Lident "()", None)) ) , None ) ) ) ] } ; pci_loc = __loc ; pci_attributes = __attrs } ] ] $ ppxlib-pp-ast test_floating.mli [ Psig_value { pval_name = "x" ; pval_type = Ptyp_constr ( Lident "int", []) ; pval_prim = [] ; pval_attributes = __attrs ; pval_loc = __loc } ; Psig_class_type [ { pci_virt = Concrete ; pci_params = [] ; pci_name = "t" ; pci_expr = Pcty_signature { pcsig_self = Ptyp_any ; pcsig_fields = [ Pctf_method ( "f" , Public , Concrete , Ptyp_arrow ( Nolabel , Ptyp_constr ( Lident "unit", []) , Ptyp_constr ( Lident "unit", []) ) ) ] } ; pci_loc = __loc ; pci_attributes = __attrs } ] ] And now with the flag, we can see our floating attributes: $ ppxlib-pp-ast --show-attrs test_floating.ml [ Pstr_attribute { attr_name = "floating"; attr_payload = PStr []; attr_loc = __loc} ; Pstr_value ( Nonrecursive , [ { pvb_pat = Ppat_var "x" ; pvb_expr = Pexp_constant (Pconst_integer ( "2", None)) ; pvb_constraint = None ; pvb_attributes = [] ; pvb_loc = __loc } ] ) ; Pstr_class [ { pci_virt = Concrete ; pci_params = [] ; pci_name = "c" ; pci_expr = Pcl_structure { pcstr_self = Ppat_any ; pcstr_fields = [ Pcf_attribute { attr_name = "floating" ; attr_payload = PStr [] ; attr_loc = __loc } ; Pcf_method ( "f" , Public , Cfk_concrete ( Override , Pexp_poly ( Pexp_function ( [ { pparam_loc = __loc ; pparam_desc = Pparam_val ( Nolabel , None , Ppat_construct ( Lident "()", None) ) } ] , None , Pfunction_body (Pexp_construct ( Lident "()", None)) ) , None ) ) ) ] } ; pci_loc = __loc ; pci_attributes = [] } ] ] $ ppxlib-pp-ast --show-attrs test_floating.mli [ Psig_attribute { attr_name = "floating"; attr_payload = PStr []; attr_loc = __loc} ; Psig_value { pval_name = "x" ; pval_type = Ptyp_constr ( Lident "int", []) ; pval_prim = [] ; pval_attributes = [] ; pval_loc = __loc } ; Psig_class_type [ { pci_virt = Concrete ; pci_params = [] ; pci_name = "t" ; pci_expr = Pcty_signature { pcsig_self = Ptyp_any ; pcsig_fields = [ Pctf_attribute { attr_name = "floating" ; attr_payload = PStr [] ; attr_loc = __loc } ; Pctf_method ( "f" , Public , Concrete , Ptyp_arrow ( Nolabel , Ptyp_constr ( Lident "unit", []) , Ptyp_constr ( Lident "unit", []) ) ) ] } ; pci_loc = __loc ; pci_attributes = [] } ] ]