_seps: "/(){},.:='-!"

20 neq = [term:"left" .w? "!=" .w? term:"right"]
19 role_block = [term:"role" .w? "{" .w? .s!.([.w? "," .w?] [
  .r?([comment .w?]) term:"arg"]) .w? "}"]
18 amb = {
  ["no" .w? "amb":!"amb"]
  ["amb":"amb"]
}
17 rule_term = {
  uniq:"uniq"
  role_of:"role_of"
  "amb":"amb"
  has:"has"
  eq:"eq"
  neq:"neq"
  rel:"rel"
}
16 rule = [rule_term:"res" .w? ":-" .w? .s!([.w? "," .w?] rule_term:"arg") .w? "."]
15 inner = ["." term:"arg"]
14 app = [.._seps!:"f" "(" .w? .s!([.w? "," .w?] {
  [".." .._seps!:"tail_sym"]
  "..":"tail"
  term:"arg"
}) .w? ")"]
13 amb_role = ["amb_role" .w? "(" .w?
  term:"a" .w? "," .w? term:"b1" .w? "," .w? term:"b2" .w? ")"]
12 comment = ["//" ..."\n"?]
11 amb_rel = ["amb_rel" .w? "(" .w?
  term:"a" .w? "," .w? term:"b1" .w? "," .w? term:"b2" .w? ")"]
10 has = [term_no_app:"f" .w? "(" .w? term:"arg" .w? ")" .w? "=>" .w? term:"res"]
9 ava = [.._seps!:"avatar" "'" .w? "(" .w? term:"core" .w? ")"]
8 uniq = ["uniq" .w! term:"arg"]
7 eq = [term_no_app:"f" .w? "(" .w? term:"arg" .w? ")" .w? "=" .w? term:"res"]
6 rel = ["(" .w? term:"a" .w? "," .w? term:"b" .w? ")"]
5 sym = .._seps!:"val"
4 role_of = {
  ["role_of(" .w? term:"arg" .w? ")" .w? "=" .w? term:"role"]
  [term:"arg" .w? ":" .w? term:"role"]
}
3 term = {inner:"inner" ava:"ava" app:"app" sym:"sym"}
2 term_no_app = {inner:"inner" ava:"ava" sym:"sym"}
2 expr = {
  rule:"rule"
  uniq:"uniq"
  role_of:"role_of"
  amb_role:"amb_role"
  amb_rel:"amb_rel"
  amb
  has:"has"
  eq:"eq"
  rel:"rel"
}
1 data = .l({
  ["import" .w! .t!:"import"]
  ["eval" .w! .._seps!:"eval"]
  ["no" .w! "eval":"no_eval"]
  role_block
  [expr:"expr" .w?]
  comment
})
0 document = [.w? data:"data" .w?]
