Hi,
I'd like to use a virtual identifier as for the length of lists.
E.g.
@@
expression list[virtual.N] Xs;
@@
...
I've come up with the following patch, which seems to work:
--- a/parsing_cocci/parser_cocci_menhir.mly
+++ b/parsing_cocci/parser_cocci_menhir.mly
@@ -424,6 +424,14 @@ metadec:
list_len:
pure_ident_or_meta_ident { Common.Left $1 }
| TInt { let (x,clt) = $1 in Common.Right (int_of_string x) }
+| TVirtual TDot pure_ident
+ { let nm = ("virtual",P.id2name $3) in
+ Iteration.parsed_virtual_identifiers :=
+ Common.union_set [snd nm]
+ !Iteration.parsed_virtual_identifiers;
+ Common.Right (int_of_string (
+ List.assoc (snd nm) !Flag.defined_virtual_env))
+ }
%inline metakind_fresh:
TFresh TIdentifier
But to be honest I have not much of an idea what I'm doing and this is mostly a
copy 'n paste of the code which is used to initialize an identifier from a
virtual identifier. There might be a better way to do it. Also I'm not sure how
to handle the 'Not found' for the lookup exception and the int_of_string
exception if the identifier is not a integer.
Thanks,
- Lars
_______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)