aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--example/input.txt4
-rw-r--r--lib/main.ex7
-rw-r--r--src/elixir_math_parser.yrl31
-rw-r--r--src/elixir_math_parser_lexer.xrl7
4 files changed, 26 insertions, 23 deletions
diff --git a/example/input.txt b/example/input.txt
index 0d42cb7..a32d267 100644
--- a/example/input.txt
+++ b/example/input.txt
@@ -3,5 +3,5 @@ a = 7;; b = 4
x = 20
y = 3
-z = 6
-10 + z / y * x / 4
+z = 2y
+10 + 4(z / y)(x / 4)
diff --git a/lib/main.ex b/lib/main.ex
index 5418da5..99c25ca 100644
--- a/lib/main.ex
+++ b/lib/main.ex
@@ -1,7 +1,8 @@
defmodule ElixirMathParser.Main do
def process_parse({:error, result}) do
- IO.puts("\nParse error")
- IO.inspect(result)
+ {line, _file, errors} = result
+ err = Enum.join(errors)
+ err <> " (line " <> to_string(line) <> ")"
end
def process_parse({:ok, tree}) do
@@ -26,7 +27,7 @@ defmodule ElixirMathParser.Main do
res = process_parse(:elixir_math_parser.parse(tokens))
if res != :ok do
- IO.puts(res)
+ IO.puts(:stderr, "\n" <> res)
end
end
end
diff --git a/src/elixir_math_parser.yrl b/src/elixir_math_parser.yrl
index 46340ae..86b36c8 100644
--- a/src/elixir_math_parser.yrl
+++ b/src/elixir_math_parser.yrl
@@ -3,19 +3,16 @@ Nonterminals
statement
statements
expr
+ exprs
.
Terminals
int
var
- '+'
- '-'
- '*'
- '/'
+ break
+ '+' '-' '*' '/'
'='
- '('
- ')'
- ';;'
+ '(' ')'
.
Rootsymbol
@@ -33,18 +30,22 @@ root -> statements : '$1'.
statements -> statement : ['$1'].
statements -> statement statements : ['$1'|'$2'].
-statements -> statement ';;' statements : ['$1'|'$3'].
+statements -> statement break statements : ['$1'|'$3'].
+statements -> break : [].
-statement -> var '=' expr : {assign, '$1', '$3'}.
-statement -> expr : {eval, '$1'}.
+statement -> var '=' exprs : {assign, '$1', '$3'}.
+statement -> exprs : {eval, '$1'}.
+
+exprs -> expr : '$1'.
+exprs -> expr exprs : {mul_op, '$1', '$2'}.
expr -> int : unwrap('$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'}.
-expr -> expr '/' expr : {div_op, '$1', '$3'}.
-expr -> '(' expr ')' : '$2'.
+expr -> exprs '+' exprs : {add_op, '$1', '$3'}.
+expr -> exprs '-' exprs : {sub_op, '$1', '$3'}.
+expr -> exprs '*' exprs : {mul_op, '$1', '$3'}.
+expr -> exprs '/' exprs : {div_op, '$1', '$3'}.
+expr -> '(' exprs ')' : '$2'.
Erlang code.
diff --git a/src/elixir_math_parser_lexer.xrl b/src/elixir_math_parser_lexer.xrl
index a72f7e3..facf323 100644
--- a/src/elixir_math_parser_lexer.xrl
+++ b/src/elixir_math_parser_lexer.xrl
@@ -1,8 +1,9 @@
Definitions.
INT = [0-9]+
NAME = [a-zA-Z_][a-zA-Z0-9_]*
-WHITESPACE = [\s\t\n\r]
-COMMENT = #[^\n]*
+WHITESPACE = [\s\t\r]
+COMMENT = #[^\n]*\n?
+BREAK = [\n;;]
Rules.
\+ : {token, {'+', TokenLine}}.
@@ -12,7 +13,7 @@ Rules.
\= : {token, {'=', TokenLine}}.
\( : {token, {'(', TokenLine}}.
\) : {token, {')', TokenLine}}.
-;; : {token, {';;', TokenLine}}.
+{BREAK}+ : {token, {break, TokenLine}}.
{NAME} : {token, {var, TokenLine, TokenChars}}.
{INT} : {token, {int, TokenLine, TokenChars}}.
{WHITESPACE}+ : skip_token.