From 8f9730d89e66ab1cbf08cbc0dea2a429d135e0da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?William=20Herg=C3=A8s?= Date: Sun, 9 Nov 2025 12:49:15 +0100 Subject: feat(parser): supports implicit mult --- example/input.txt | 4 ++-- lib/main.ex | 7 ++++--- src/elixir_math_parser.yrl | 31 ++++++++++++++++--------------- src/elixir_math_parser_lexer.xrl | 7 ++++--- 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. -- cgit v1.2.3