From cc2b7a9a7b4c6269a6b93f99581b91b29fccc66d Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Tue, 4 Nov 2025 12:19:54 +0100 Subject: feat(lexer): default grammar --- src/elixir_math_parser.yrl | 44 ++++++++++++++++++++++++++++++++++++++++ src/elixir_math_parser_lexer.xrl | 19 +++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 src/elixir_math_parser.yrl create mode 100644 src/elixir_math_parser_lexer.xrl 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). -- cgit v1.2.3