aboutsummaryrefslogtreecommitdiff
path: root/src/elixir_math_parser.yrl
diff options
context:
space:
mode:
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)}.