From 9bf65a415b17f635f2a86487920bc5a0ac8df580 Mon Sep 17 00:00:00 2001 From: zmstone Date: Wed, 27 Mar 2024 17:34:18 +0100 Subject: [PATCH] feat(variform): add a variable transformer --- .gitignore | 2 ++ .../src/variform/emqx_variform_parser.yrl | 16 ++++++++++++ apps/emqx/src/variform/emqx_variform_scan.xrl | 26 +++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 apps/emqx/src/variform/emqx_variform_parser.yrl create mode 100644 apps/emqx/src/variform/emqx_variform_scan.xrl diff --git a/.gitignore b/.gitignore index 5e91d4bc5..a2c8b7e65 100644 --- a/.gitignore +++ b/.gitignore @@ -76,3 +76,5 @@ rebar-git-cache.tar .docker_image_tag .emqx_docker_image_tags .git/ +apps/emqx/src/emqx_variform_parser.erl +apps/emqx/src/variform/emqx_variform_scan.erl diff --git a/apps/emqx/src/variform/emqx_variform_parser.yrl b/apps/emqx/src/variform/emqx_variform_parser.yrl new file mode 100644 index 000000000..3f2b739ba --- /dev/null +++ b/apps/emqx/src/variform/emqx_variform_parser.yrl @@ -0,0 +1,16 @@ +Nonterminals expr call_or_var args. +Terminals identifier number string '(' ')' ','. + +Rootsymbol expr. + +%% Grammar Rules +expr -> call_or_var: '$1'. + +call_or_var -> identifier '(' args ')' : {call, element(3,'$1'), '$3'}. +call_or_var -> identifier : {var, element(3, '$1')}. +args -> expr : ['$1']. +args -> args ',' expr : '$1' ++ ['$3']. + +%% Handling direct values and variables within arguments +expr -> number : {num, element(3, '$1')}. +expr -> string : {str, element(3, '$1')}. diff --git a/apps/emqx/src/variform/emqx_variform_scan.xrl b/apps/emqx/src/variform/emqx_variform_scan.xrl new file mode 100644 index 000000000..53657bad4 --- /dev/null +++ b/apps/emqx/src/variform/emqx_variform_scan.xrl @@ -0,0 +1,26 @@ +Definitions. +%% Define regular expressions for tokens +IDENTIFIER = [a-zA-Z][a-zA-Z0-9_.]* +SQ_STRING = \'[^\']*\' +DQ_STRING = \"[^\"]*\" +NUMBER = [+-]?(\\d+\\.\\d+|[0-9]+) +LPAREN = \( +RPAREN = \) +COMMA = , +WHITESPACE = [\s\t\n]+ + +Rules. +%% Match function names, variable names (with ${}), strings, numbers, and structural characters +{WHITESPACE} : skip_token. +{IDENTIFIER} : {token, {identifier, TokenLine, TokenChars}}. +{SQ_STRING} : {token, {string, TokenLine, unquote(TokenChars, $')}}. +{DQ_STRING} : {token, {string, TokenLine, unquote(TokenChars, $")}}. +{NUMBER} : {token, {number, TokenLine, TokenChars}}. +{LPAREN} : {token, {'(', TokenLine}}. +{RPAREN} : {token, {')', TokenLine}}. +{COMMA} : {token, {',', TokenLine}}. + +Erlang code. + +unquote(String, Char) -> + string:trim(String, both, [Char]).