From 8a26b3d43e1adb6f9585891500a5fc856fd0ca5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sat, 8 Nov 2025 22:59:31 +0100 Subject: perf(var): replace atoms by charlist --- example/input.txt | 12 ++++++------ lib/elixir_math_parser.ex | 10 +++++----- src/elixir_math_parser.yrl | 6 +++--- src/elixir_math_parser_lexer.xrl | 4 ++-- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/example/input.txt b/example/input.txt index 7233dc7..0d42cb7 100644 --- a/example/input.txt +++ b/example/input.txt @@ -1,7 +1,7 @@ -:a = 7;; :b = 4;; -(:a + :b) * 10 / 2 +a = 7;; b = 4 +(a + b) * 10 / 2 -:x = 20 -:y = 3 -:z = 6 -10 + :z / :y * :x / 4 +x = 20 +y = 3 +z = 6 +10 + z / y * x / 4 diff --git a/lib/elixir_math_parser.ex b/lib/elixir_math_parser.ex index 4da4271..bb24d88 100644 --- a/lib/elixir_math_parser.ex +++ b/lib/elixir_math_parser.ex @@ -7,11 +7,11 @@ defmodule ElixirMathParser do {:ok, value} end - defp reduce_to_value({:atom, _line, atom}, state) do - if !Map.has_key?(state, atom) do - {:error, "value not found for " <> to_string(atom)} + defp reduce_to_value({:var, _line, var}, state) do + if !Map.has_key?(state, var) do + {:error, "value not found for " <> to_string(var)} else - {:ok, state[atom]} + {:ok, state[var]} end end @@ -43,7 +43,7 @@ defmodule ElixirMathParser do end end - defp evaluate_tree([{:assign, {:atom, _line, lhs}, rhs} | tail], state) do + defp evaluate_tree([{:assign, {:var, _line, lhs}, rhs} | tail], state) do with {:ok, val} <- reduce_to_value(rhs, state) do evaluate_tree(tail, Map.merge(state, %{lhs => val})) end diff --git a/src/elixir_math_parser.yrl b/src/elixir_math_parser.yrl index 17b46ad..46340ae 100644 --- a/src/elixir_math_parser.yrl +++ b/src/elixir_math_parser.yrl @@ -7,7 +7,7 @@ Nonterminals Terminals int - atom + var '+' '-' '*' @@ -35,11 +35,11 @@ statements -> statement : ['$1']. statements -> statement statements : ['$1'|'$2']. statements -> statement ';;' statements : ['$1'|'$3']. -statement -> atom '=' expr : {assign, '$1', '$3'}. +statement -> var '=' expr : {assign, '$1', '$3'}. statement -> expr : {eval, '$1'}. expr -> int : unwrap('$1'). -expr -> atom : '$1'. +expr -> var : '$1'. expr -> expr '+' expr : {add_op, '$1', '$3'}. expr -> expr '-' expr : {sub_op, '$1', '$3'}. expr -> expr '*' expr : {mul_op, '$1', '$3'}. diff --git a/src/elixir_math_parser_lexer.xrl b/src/elixir_math_parser_lexer.xrl index 7256090..d02a62c 100644 --- a/src/elixir_math_parser_lexer.xrl +++ b/src/elixir_math_parser_lexer.xrl @@ -1,6 +1,6 @@ Definitions. INT = [0-9]+ -NAME = :[a-zA-Z_][a-zA-Z0-9_]* +NAME = [a-zA-Z_][a-zA-Z0-9_]* WHITESPACE = [\s\t\n\r] Rules. @@ -12,7 +12,7 @@ Rules. \( : {token, {'(', TokenLine}}. \) : {token, {')', TokenLine}}. ;; : {token, {';;', TokenLine}}. -{NAME} : {token, {atom, TokenLine, to_atom(TokenChars)}}. +{NAME} : {token, {var, TokenLine, TokenChars}}. {INT} : {token, {int, TokenLine, TokenChars}}. {WHITESPACE}+ : skip_token. -- cgit v1.2.3