aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/elixir_math_parser.ex14
-rw-r--r--lib/main.ex4
2 files changed, 15 insertions, 3 deletions
diff --git a/lib/elixir_math_parser.ex b/lib/elixir_math_parser.ex
index bb24d88..f7f916f 100644
--- a/lib/elixir_math_parser.ex
+++ b/lib/elixir_math_parser.ex
@@ -3,8 +3,11 @@ defmodule ElixirMathParser do
Documentation for `ElixirMathParser`.
"""
+ defdelegate numerator <~> denominator, to: Ratio, as: :new
+ use Numbers, overload_operators: true
+
defp reduce_to_value({:int, _line, value}, _state) do
- {:ok, value}
+ {:ok, value <~> 1}
end
defp reduce_to_value({:var, _line, var}, state) do
@@ -51,7 +54,14 @@ defmodule ElixirMathParser do
defp evaluate_tree([{:eval, expr} | tail], state) do
with {:ok, expr} <- reduce_to_value(expr, state) do
- IO.puts(expr)
+ num = Ratio.numerator(expr)
+ den = Ratio.denominator(expr)
+
+ case den do
+ 1 -> IO.puts(num)
+ _ -> IO.puts("#{num}/#{den}")
+ end
+
evaluate_tree(tail, state)
end
end
diff --git a/lib/main.ex b/lib/main.ex
index ad657ca..5418da5 100644
--- a/lib/main.ex
+++ b/lib/main.ex
@@ -7,8 +7,9 @@ defmodule ElixirMathParser.Main do
def process_parse({:ok, tree}) do
IO.puts("\nParse tree")
IO.inspect(tree, pretty: true)
+
case ElixirMathParser.process_tree(tree) do
- {:ok, _} -> :ok
+ {:ok, _} -> :ok
{:error, reason} -> reason
end
end
@@ -23,6 +24,7 @@ defmodule ElixirMathParser.Main do
IO.puts("Parsed #{filename}, stopped at line #{line}")
res = process_parse(:elixir_math_parser.parse(tokens))
+
if res != :ok do
IO.puts(res)
end