aboutsummaryrefslogtreecommitdiff
path: root/src/elixir_math_parser.yrl
diff options
context:
space:
mode:
authorAnhgelus Morhtuuzh <william@herges.fr>2025-11-04 12:19:54 +0100
committerAnhgelus Morhtuuzh <william@herges.fr>2025-11-04 12:19:54 +0100
commitcc2b7a9a7b4c6269a6b93f99581b91b29fccc66d (patch)
treecb97f6c5a65434bfd2c72bb7bab27940763adfde /src/elixir_math_parser.yrl
parent24570e7bf215c79a55927f23a6735acd8cd0ff59 (diff)
feat(lexer): default grammar
Diffstat (limited to 'src/elixir_math_parser.yrl')
-rw-r--r--src/elixir_math_parser.yrl44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/elixir_math_parser.yrl b/src/elixir_math_parser.yrl
new file mode 100644
index 0000000..4900996
--- /dev/null
+++ b/src/elixir_math_parser.yrl
@@ -0,0 +1,44 @@
+Nonterminals
+ root
+ assignment
+ assignments
+ expr
+.
+
+Terminals
+ int
+ atom
+ '+'
+ '-'
+ '*'
+ '/'
+ '='
+.
+
+Rootsymbol
+ root
+.
+
+Right 100 '='.
+Left 300 '+'.
+Left 300 '-'.
+Left 400 '*'.
+Left 400 '/'.
+
+root -> assignments : '$1'.
+
+assignments -> assignment : '$1'.
+assignments -> assignment assignments : lists:merge('$1', '$2').
+
+assignment -> atom '=' expr : [{assign, '$1', '$3'}].
+
+expr -> int : unwrap('$1').
+expr -> atom : '$1'.
+expr -> expr '+' expr : {add_op, '$1', '$3'}.
+expr -> expr '-' expr : {sub_op, '$1', '$3'}.
+expr -> expr '*' expr : {mul_op, '$1', '$3'}.
+expr -> expr '/' expr : {div_op, '$1', '$3'}.
+
+Erlang code.
+
+unwrap({int, Line, Value}) -> {int, Line, list_to_integer(Value)}.