Parselix v0.4.0 Parselix

Provides the macro for creating parser and some helper functions.

Examples

Function style

@doc "Replaces error messages."
def error_message(parser, message) do
  fn target, position ->
    case parser.(target, position) do
      {:error, _, _} -> {:error, message, position}
      x -> x
    end
  end
end

@doc "Parse lowercase characters."
def lowercases do
  fn target, position do
    parser = lowercase() |> many_1()
    parser.(target, position)
  end
end

Function style with parser_body macro

@doc "Parse uppercase characters."
def uppercases do
  parser_body do
    uppercase() |> many_1()
  end
end

Macro style

@doc "Picks one value from the result of the given parser."
parser :pick, [parser, index] do
  parser |> map(&Enum.at(&1, index))
end

@doc "Parses the end of text."
parser :eof do
  fn
    "", position -> {:ok, :eof, "", position}
    _, position -> {:error, "There is not EOF.", position}
  end
end

# Private
parserp :private_dump, [parser] do
  parser |> map(fn _ -> :empty end)
end

Summary

Types

A failed result

A successful result

Types

error()
error :: {:error, String.t, %Parselix.Position{horizontal: term, index: term, vertical: term}}

A failed result.

{:error, ERROR_MESSAGE, POSITION}

ok()
ok :: {:ok, any, String.t, %Parselix.Position{horizontal: term, index: term, vertical: term}}

A successful result.

{:ok, RESULT, REMAINDER, NEW_POSITION}

parser()
parser :: (String.t, %Parselix.Position{horizontal: term, index: term, vertical: term} -> ok | error)

Functions

format_result(result, name \\ nil, target, current_position)
get_position(current, target, consumed)
parse(parser, target, position \\ position)
position(index \\ 0, vertical \\ 0, horizontal \\ 0)

Macros

parser(name, argument_names \\ [], list)

Defines a parser.

parser_body(list)

Wraps a parser body.

parserp(name, argument_names \\ [], list)

Defines a private parser.