<string>::= '"' [ "\" . | '^ " \' ] * '"'

<path>::= <string> [ "/" <string> ] *

<string_list>::= <string> [ "," <string> ] *

<alpha>::= [ 'A - Z' | 'a - z' |' :_' ] +

<number>::= [ '0 - 9' ] +

<id>::= <alpha> [ <alpha> | <number> ] *

<rvar>::= "@" <id>

<svar>::= "%" <id>

<vvar>::= "$" <id>

<refine>::= [ "sub" | "super" ] ?

<qualifier>::= [ "inverse" ] ? <refine> <path>

<assign>::= <vvar> "<-" <path>

<attr_list>::= [ "attr" <assign> [ "," <assign>] * ] ?

<set>::= "ref" <val>
                 | "pattern" <val>
                 | <svar>
                 | <rvar>
                 | "(" <set> ")"
                 | "relation" <qualifier> <val> <attr_list>
                 | "select" <rvar> "in" <set> "where" <boole>
                 | <set> [ "union" | "intersect" | "diff" ] <set>
                 | "let" <svar> "be" <set> "in" <set>
                 | "let" <vvar> "be" <val> "in" <set>

<boole>::= [ "false" | "true" ]
                    | "(" <boole> ")"
                    | [ "not" | "ex" ] <boole>
                    | <boole> [ "and" | "or" ] <boole>
                    | <val> [ "sub" | "meet" | "eq" ] <val>

<val>::= "{" [ <string_list> ] ? "}"
                 | <string>
                 | "refof" <set>
                 | <rvar> "." <vvar>
                 | <vvar>
                 | "(" <val> ")"
                 | "property" <qualifier> <val>