Dsxir.Predicate.Parser (dsxir v0.3.0)

Copy Markdown

NimbleParsec grammar for the predicate DSL.

Productions:

literal   ::= int | float | string | atom | bool | nil
field     ::= identifier "." identifier             (input.foo -> program_input)
length    ::= "length" "(" field ")"
comp_lhs  ::= field | length
comp_rhs  ::= literal | "[" literal ("," literal)* "]" | folded_arith
compare   ::= comp_lhs op comp_rhs
expr      ::= or_expr
or_expr   ::= and_expr ("or" and_expr)*
and_expr  ::= not_expr ("and" not_expr)*
not_expr  ::= "not" not_expr | atom_expr
atom_expr ::= compare | "(" expr ")"

Identifier atoms are resolved via String.to_existing_atom/1. Unknown atoms raise a :predicate_parse_error.

Arithmetic on the comparison RHS is literal-only and folded at parse time. Any non-literal in the arithmetic sub-tree raises a parse error.

Summary

Functions

Parses the given binary as predicate.

Functions

predicate(binary, opts \\ [])

@spec predicate(binary(), keyword()) ::
  {:ok, [term()], rest, context, line, byte_offset}
  | {:error, reason, rest, context, line, byte_offset}
when line: {pos_integer(), byte_offset},
     byte_offset: non_neg_integer(),
     rest: binary(),
     reason: String.t(),
     context: map()

Parses the given binary as predicate.

Returns {:ok, [token], rest, context, position, byte_offset} or {:error, reason, rest, context, line, byte_offset} where position describes the location of the predicate (start position) as {line, offset_to_start_of_line}.

To column where the error occurred can be inferred from byte_offset - offset_to_start_of_line.

Options

  • :byte_offset - the byte offset for the whole binary, defaults to 0
  • :line - the line and the byte offset into that line, defaults to {1, byte_offset}
  • :context - the initial context value. It will be converted to a map