User Constraint Language

expr ::=
  | True
  | False
  | Visitfname     (* Visiting a node without any specifiction on edge type or direction *)
  | HaveCallEdgefnamefname
  | HaveRetEdgefnamefname
  | VisitWithedge_typedirectionfname
  | HaveCallEdgeInedge_typefnamefname
  | HaveRetEdgeInedge_typefnamefname
  | (expr)
  | ~expr
  | expr&&expr
  | expr||expr
  | expr->expr

fname ::= " string "

edge_type ::=
  | Backbone
  | Branch
  | Any

direction ::=
  | Incoming
  | Outgoing
  | CallIn
  | CallOut
  | RetIn
  | RetOut