On Tue, 28 Apr 2020, Jaskaran Singh wrote:
> To add Cast attributes to the C AST, pass attributes from the type_name
> rule of the C parser.
I'm not sure what you mean by "pass". Normally, one passes something to
something else, but it's not clear what the something else is.
>
> Signed-off-by: Jaskaran Singh <[email protected]>
> ---
> ocaml/coccilib.mli | 3 ++-
> parsing_c/parse_c.ml | 4 +++-
> parsing_c/parser_c.mly | 16 ++++++++--------
> 3 files changed, 13 insertions(+), 10 deletions(-)
>
> diff --git a/ocaml/coccilib.mli b/ocaml/coccilib.mli
> index 0e807c9a..a305d616 100644
> --- a/ocaml/coccilib.mli
> +++ b/ocaml/coccilib.mli
> @@ -791,7 +791,8 @@ module Parser_c :
> (Lexing.lexbuf -> token) -> Lexing.lexbuf -> Ast_c.statement
> val expr : (Lexing.lexbuf -> token) -> Lexing.lexbuf -> Ast_c.expression
> val type_name :
> - (Lexing.lexbuf -> token) -> Lexing.lexbuf -> Ast_c.fullType
> + (Lexing.lexbuf -> token) -> Lexing.lexbuf ->
> + Ast_c.attribute list * Ast_c.fullType
> end
> module Lexer_c :
> sig
> diff --git a/parsing_c/parse_c.ml b/parsing_c/parse_c.ml
> index 0d3a189a..5f8d5e2d 100644
> --- a/parsing_c/parse_c.ml
> +++ b/parsing_c/parse_c.ml
> @@ -370,7 +370,9 @@ let parse_gen ~cpp ~tos parsefunc s =
> result
>
> (* Please DO NOT remove this code, even though most of it is not used *)
> -let type_of_string = parse_gen ~cpp:false ~tos:true Parser_c.type_name
> +let type_of_string s =
> + let typname = parse_gen ~cpp:false ~tos:true Parser_c.type_name s in
> + Common.snd typname
> let statement_of_string = parse_gen ~cpp:false ~tos:false Parser_c.statement
> let expression_of_string = parse_gen ~cpp:false ~tos:false Parser_c.expr
> let cpp_expression_of_string = parse_gen ~cpp:true ~tos:false Parser_c.expr
> diff --git a/parsing_c/parser_c.mly b/parsing_c/parser_c.mly
> index aedde179..0abcc9b0 100644
> --- a/parsing_c/parser_c.mly
> +++ b/parsing_c/parser_c.mly
> @@ -665,7 +665,7 @@ let postfakeInfo pii =
>
> %type <Ast_c.statement> statement
> %type <Ast_c.expression> expr
> -%type <Ast_c.fullType> type_name
> +%type <Ast_c.attribute list * Ast_c.fullType> type_name
>
> %%
>
> /*(*************************************************************************)*/
> @@ -818,7 +818,7 @@ arith_expr:
>
> cast_expr:
> | unary_expr { $1 }
> - | topar2 type_name tcpar2 cast_expr { mk_e(Cast ($2, $4)) [$1;$3] }
> + | topar2 type_name tcpar2 cast_expr { mk_e(Cast (snd $2, $4)) [$1;$3] }
> /*
> It could be useful to have the following, but there is no place for the
> attribute in the AST.
> @@ -831,7 +831,7 @@ unary_expr:
> | TDec unary_expr { mk_e(Infix ($2, Dec)) [$1] }
> | unary_op cast_expr { mk_e(Unary ($2, fst $1)) [snd $1] }
> | Tsizeof unary_expr { mk_e(SizeOfExpr ($2)) [$1] }
> - | Tsizeof topar2 type_name tcpar2 { mk_e(SizeOfType ($3)) [$1;$2;$4] }
> + | Tsizeof topar2 type_name tcpar2 { mk_e(SizeOfType (snd $3)) [$1;$2;$4]
> }
There could be less white space in front of the [
julia
> | Tnew new_argument { mk_e(New (None, $2)) [$1] }
> | Tnew TOPar argument_list_ne TCPar new_argument { mk_e(New (Some $3, $5))
> [$1; $2; $4] }
> | Tdelete cast_expr { mk_e(Delete(false, $2)) [$1] }
> @@ -897,9 +897,9 @@ postfix_expr:
>
> /*(* gccext: also called compound literals *)*/
> | topar2 type_name tcpar2 TOBrace TCBrace
> - { mk_e(Constructor ($2, (InitList [], [$4;$5]))) [$1;$3] }
> + { mk_e(Constructor (snd $2, (InitList [], [$4;$5]))) [$1;$3] }
> | topar2 type_name tcpar2 TOBrace initialize_list gcc_comma_opt_struct
> TCBrace
> - { mk_e(Constructor ($2, (InitList (List.rev $5),[$4;$7] @ $6))) [$1;$3]
> }
> + { mk_e(Constructor (snd $2, (InitList (List.rev $5),[$4;$7] @ $6)))
> [$1;$3] }
>
>
> primary_expr:
> @@ -1298,7 +1298,7 @@ type_spec2:
> Right3 (TypeName (name, Ast_c.noTypedefDef())),[] }
>
> | Ttypeof TOPar assign_expr TCPar { Right3 (TypeOfExpr ($3)), [$1;$2;$4] }
> - | Ttypeof TOPar type_name TCPar { Right3 (TypeOfType ($3)), [$1;$2;$4] }
> + | Ttypeof TOPar type_name TCPar { Right3 (TypeOfType (snd $3)),
> [$1;$2;$4] }
>
> /*(*----------------------------*)*/
> /*(* workarounds *)*/
> @@ -1531,12 +1531,12 @@ type_qualif_list:
> type_name:
> | spec_qualif_list
> { let (attrs, ds) = $1 in
> - let (returnType, _) = fixDeclSpecForDecl ds in returnType }
> + let (returnType, _) = fixDeclSpecForDecl ds in (attrs, returnType) }
> | spec_qualif_list abstract_declaratort
> { let (attrs1, ds) = $1 in
> let (attrs2, fn) = $2 in
> let (returnType, _) = fixDeclSpecForDecl ds in
> - fn returnType }
> + (attrs1@attrs2, fn returnType) }
>
>
>
> --
> 2.21.1
>
>
_______________________________________________
Cocci mailing list
[email protected]
https://systeme.lip6.fr/mailman/listinfo/cocci