aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/elixir_math_parser.yrl44
-rw-r--r--src/elixir_math_parser_lexer.xrl19
2 files changed, 63 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)}.
diff --git a/src/elixir_math_parser_lexer.xrl b/src/elixir_math_parser_lexer.xrl
new file mode 100644
index 0000000..a2980c8
--- /dev/null
+++ b/src/elixir_math_parser_lexer.xrl
@@ -0,0 +1,19 @@
+Definitions.
+INT = [0-9]+
+NAME = :[a-zA-Z_][a-zA-Z0-9_]*
+WHITESPACE = [\s\t\n\r]|;{2}
+
+Rules.
+\+ : {token, {'+', TokenLine}}.
+\- : {token, {'-', TokenLine}}.
+\* : {token, {'*', TokenLine}}.
+\/ : {token, {'/', TokenLine}}.
+\= : {token, {'=', TokenLine}}.
+{NAME} : {token, {atom, TokenLine, to_atom(TokenChars)}}.
+{INT} : {token, {int, TokenLine, TokenChars}}.
+{WHITESPACE}+ : skip_token.
+
+Erlang code.
+% Given a ":name", chop off : and return name as an atom.
+to_atom([$:|Chars]) ->
+ list_to_atom(Chars).