An ABNF parser generator
This version is a maintenance version from the now non-active ABNF developed by @vanstee
This version also relaxes the rules regarding ABNF file formats. The RFC requires that lines be separated by \r\n
. This version also allows \n
as an alternative in line with unix norms.
For an example of its usage in the wild, see the package ex_cldr; in particular the modules Cldr.Locale
and Cldr.LanguageTag.Parser
.
iex(1)> parser = Abnf.load("priv/rfc5234.abnf")
Rfc5234
iex(2)> parser.parse(:rule, "DQUOTE = %x22\r\n")
[{:rule, "DQUOTE = %x22\r\n",
[{:rulename, "DQUOTE",
[{:ALPHA, "D", [{:literal, "D", []}]}, {:ALPHA, "Q", [{:literal, "Q", []}]},
{:ALPHA, "U", [{:literal, "U", []}]}, {:ALPHA, "O", [{:literal, "O", []}]},
{:ALPHA, "T", [{:literal, "T", []}]},
{:ALPHA, "E", [{:literal, "E", []}]}]},
{:"defined-as", " = ",
[{:"c-wsp", " ", [{:WSP, " ", [{:SP, " ", [{:literal, " ", []}]}]}]},
{:literal, "=", []},
{:"c-wsp", " ", [{:WSP, " ", [{:SP, " ", [{:literal, " ", []}]}]}]}]},
{:elements, "%x22",
[{:alternation, "%x22",
[{:concatenation, "%x22",
[{:repetition, "%x22",
[{:element, "%x22",
[{:"num-val", "%x22",
[{:literal, "%", []},
{:"hex-val", "x22",
[{:literal, "x", []},
{:HEXDIG, "2", [{:DIGIT, "2", [{:literal, "2", []}]}]},
{:HEXDIG, "2",
[{:DIGIT, "2", [{:literal, "2", []}]}]}]}]}]}]}]}]}]},
{:"c-nl", "\r\n",
[{:CRLF, "\r\n",
[{:CR, "\r", [{:literal, "\r", []}]},
{:LF, "\n", [{:literal, "\n", []}]}]}]}]}]
- Improve test coverage
- Log error messages during parsing
- Improve UX of parsing for specific rules
- Improve documentation
The package can be installed by:
-
Adding abnf2 to your list of dependencies in
mix.exs
:def deps do [{:abnf2, "~> 0.1.0"}] end