Current section

Files

Jump to
rollex lib rollex lexer.ex
Raw

lib/rollex/lexer.ex

defmodule Rollex.Lexer do
def tokenize(_input, []) do
{:error, "No valid list of tokens provided!"}
end
def tokenize({:ok, input}, valid_tokens) when is_list(valid_tokens) and length(valid_tokens) > 0 do
input
|> String.replace(~r/\s/, "") # Remove whitespace
|> _do_tokenize(valid_tokens, [])
end
defp _do_tokenize("", _valid_tokens, current_result) do
{:ok, Enum.reverse([%Rollex.Tokens.End{} | current_result])}
end
defp _do_tokenize(roll_expr, valid_tokens, result) do
case _first_match(roll_expr, valid_tokens) do
nil ->
{:error, "Unrecognized input!"}
{token, length} ->
_do_tokenize(String.slice(roll_expr, length..-1), valid_tokens, [token | result])
end
end
defp _first_match(_roll_expr, []) do
nil
end
defp _first_match(roll_expr, [ candidate | tail ] = tokens) when is_list(tokens) and length(tokens) > 0 do
case String.match?(roll_expr, candidate.regex) do
true ->
case Rollex.Token.create(candidate, roll_expr) do
{:error, _msg} = result ->
result
result ->
result
end
false ->
_first_match(roll_expr, tail)
end
end
end