defmodule Cldr.Rbnf.Rule do
@moduledoc """
Tokenizer and Parser for RBNF rules.
"""
defstruct [:base_value, :radix, :definition, :range, :divisor]
alias Cldr.Rbnf.Rule
@doc """
Scan and tokenize rule definition
Using a leex lexer, tokenize a rule definition
"""
def tokenize(definition) when is_binary(definition) do
definition
|> String.trim_leading("'")
|> String.to_charlist()
|> :rbnf_lexer.string()
end
def tokenize(%Rule{definition: definition} = _rule) do
tokenize(definition)
end
@doc """
Parse an RBNF rule definition
Returns a list of rule subparts that can then be used for
further processing or for turning into an AST for execution.
"""
def parse(definition) when is_binary(definition) do
{:ok, tokens, _end_line} = tokenize(definition)
parse(tokens)
end
def parse([]) do
{:ok, []}
end
def parse(tokens) when is_list(tokens) do
tokens
|> :rbnf_parser.parse()
end
end