aboutsummaryrefslogtreecommitdiff
path: root/lib/elixir_math_parser.ex
diff options
context:
space:
mode:
authorAnhgelus Morhtuuzh <william@herges.fr>2025-11-04 12:30:35 +0100
committerAnhgelus Morhtuuzh <william@herges.fr>2025-11-04 12:30:35 +0100
commit4ac065fbe57ed19760dbb55453e5875b3c0c188d (patch)
tree09d8bdc002902ffe5cc353b563fb489bdbddc254 /lib/elixir_math_parser.ex
parentcc2b7a9a7b4c6269a6b93f99581b91b29fccc66d (diff)
feat(parser): default parser
Diffstat (limited to 'lib/elixir_math_parser.ex')
-rw-r--r--lib/elixir_math_parser.ex47
1 files changed, 39 insertions, 8 deletions
diff --git a/lib/elixir_math_parser.ex b/lib/elixir_math_parser.ex
index cd300e9..1f147aa 100644
--- a/lib/elixir_math_parser.ex
+++ b/lib/elixir_math_parser.ex
@@ -3,16 +3,47 @@ defmodule ElixirMathParser do
Documentation for `ElixirMathParser`.
"""
- @doc """
- Hello world.
+ defp reduce_to_value({:int, _line, value}, _state) do
+ value
+ end
+
+ defp reduce_to_value({:add_op, lhs, rhs}, state) do
+ reduce_to_value(lhs, state) + reduce_to_value(rhs, state)
+ end
- ## Examples
+ defp reduce_to_value({:sub_op, lhs, rhs}, state) do
+ reduce_to_value(lhs, state) - reduce_to_value(rhs, state)
+ end
- iex> ElixirMathParser.hello()
- :world
+ defp reduce_to_value({:mul_op, lhs, rhs}, state) do
+ reduce_to_value(lhs, state) * reduce_to_value(rhs, state)
+ end
- """
- def hello do
- :world
+ defp reduce_to_value({:div_op, lhs, rhs}, state) do
+ reduce_to_value(lhs, state) / reduce_to_value(rhs, state)
end
+
+ defp reduce_to_value({:atom, _line, atom}, state) do
+ state[atom]
+ end
+
+ defp evaluate_tree([{:assign, {:atom, _line, lhs}, rhs} | tail], state) do
+ rhs_value = reduce_to_value(rhs, state)
+ evaluate_tree(tail, Map.merge(state, %{lhs => rhs_value}))
+ end
+
+ defp evaluate_tree([], state) do
+ state
+ end
+
+ def process_tree(tree) do
+ evaluate_tree(tree, %{})
+ end
+
+ def parse_file(filename) do
+ text = File.read!(filename)
+ {:ok, tokens, _line} = :elixir_math_parser_lexer.string(String.to_charlist(text))
+ {:ok, tree} = :elixir_math_parser.parse(tokens)
+ process_tree(tree)
+ end
end