diff options
| author | Anhgelus Morhtuuzh <william@herges.fr> | 2025-11-04 12:30:35 +0100 |
|---|---|---|
| committer | Anhgelus Morhtuuzh <william@herges.fr> | 2025-11-04 12:30:35 +0100 |
| commit | 4ac065fbe57ed19760dbb55453e5875b3c0c188d (patch) | |
| tree | 09d8bdc002902ffe5cc353b563fb489bdbddc254 /lib/elixir_math_parser.ex | |
| parent | cc2b7a9a7b4c6269a6b93f99581b91b29fccc66d (diff) | |
feat(parser): default parser
Diffstat (limited to 'lib/elixir_math_parser.ex')
| -rw-r--r-- | lib/elixir_math_parser.ex | 47 |
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 |
