defmodule Leex do
alias Leex.Util.Core
defmacro __using__(_opts) do
quote do
@defs []
@rules []
import unquote(__MODULE__)
@before_compile unquote(__MODULE__)
end
end
defmacro a <~ b when is_bitstring(a) do
quote do
@defs @defs ++ [{unquote(a), unquote(b)}]
end
end
defmacro a ~> b when is_bitstring(a) do
block = Macro.escape(b)
quote do
@rules @rules ++ [{unquote(a), unquote(block)}]
end
end
defmacro __before_compile__(env) do
rules = Module.get_attribute(env.module, :rules)
defs = Module.get_attribute(env.module, :defs)
Module.delete_attribute(env.module, :rules)
Module.delete_attribute(env.module, :defs)
{included_functions, action_functions, dfa_functions} = Core.generate_functions(rules, defs)
quote do
unquote(included_functions)
unquote(action_functions)
unquote(dfa_functions)
end
end
end