package ocamlgrep
Install
dune-project
Dependency
Authors
Maintainers
Sources
sha256=4444a8c53217f81b63d8de0c5a34cbd4c01a2e06d97e14f8969996a75104cc7d
sha512=7d48fd2e882cc5ab775d26cf0a8d450ba268949d9a08e91f541ec851b0bc91a6a9d36e60ec75b52aabfe947f7b32e2a7afa50a7aa21e5a4a026710791ed9ca0c
doc/README.html
Structural search of OCaml code
ocamlgrep is a command-line tool written at LexiFi to perform structural search of OCaml code.
The code is released as-is in case it is of interest to the community. The present code is extracted from a version used internally at LexiFi and we do not pretend that it is ready for public consumption, but we are making the code available to publicize the approach.
Compilation
dune buildThe tool requires OCaml 5.2 (since it depends on compiler-libs, compilation aginst other versions of OCaml will require some adjustments).
This produces an executable _build/install/bin/ocamlgrep.exe which can be run from the command line.
Usage
ocamlgrep PATTERNThe tool assumes that it is executed within a Dune workspace, as it has a number of heuristics that will not work otherwise. The tool will search the files under the current directory subtree.
You will need to run dune build @check in your project to ensure all .cmt files are up-to-date before using ocamlgrep.
PATTERN: The pattern to search for. This should be a valid OCaml expression.
- The wildcard
__matches any expression or any record field. - A numbered wildcard
__1,__2, ... matches any expression or record field and enforce strict equality of all the matching occurrences for the same number. - An identifier (value or class) is matched as a suffix of the fully qualified path in the typed expression.
- Labels and constructors identifiers are matched as a suffix of the identifier in the typed expression.
For function applications, it is allowed to omit in the pattern any argument of the actual function call; special forms are recognized to enforce that a given optional argument present or missing:
foo ?arg:PRESENT foo ?arg:MISSING- An expression
(... : typexpr)matches any expression matching...and whose type is equal totypexpr. - For
try..with/match..with/functionsexpressions, the order of clauses doesn't matter. A single clause of the searched expression can match several clauses of the code. Same set-semantics for record expressions. - An expression
e1.lid1matchese2.lid2 <- e3ife1matchese2and the labellid1matcheslid2. - The expression
__.idmatches any pattern of the form{...; P.id; ...}for any prefixP. This rule was added so that grepping for__.foowill return every "get" and "set" of the record fieldfoo, including reads in patterns.
Examples
ocamlgrep 'List.filter'
ocamlgrep '(__ (__ : floatarray): float array)'
ocamlgrep 'List.rev __ @ __'
ocamlgrep 'match __ with None -> __ | Some __1 -> Some __1'
ocamlgrep 'List.fold_left __ __ (List.map __ __)'
ocamlgrep 'Stdlib.max (__:float) __'