diff options
| author | Anhgelus Morhtuuzh <william@herges.fr> | 2025-11-04 12:19:54 +0100 |
|---|---|---|
| committer | Anhgelus Morhtuuzh <william@herges.fr> | 2025-11-04 12:19:54 +0100 |
| commit | cc2b7a9a7b4c6269a6b93f99581b91b29fccc66d (patch) | |
| tree | cb97f6c5a65434bfd2c72bb7bab27940763adfde /src | |
| parent | 24570e7bf215c79a55927f23a6735acd8cd0ff59 (diff) | |
feat(lexer): default grammar
Diffstat (limited to 'src')
| -rw-r--r-- | src/elixir_math_parser.yrl | 44 | ||||
| -rw-r--r-- | src/elixir_math_parser_lexer.xrl | 19 |
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). |
