feat(variform): add a variable transformer

This commit is contained in:
zmstone 2024-03-27 17:34:18 +01:00
parent a9ce4d7645
commit 9bf65a415b
3 changed files with 44 additions and 0 deletions

2
.gitignore vendored
View File

@ -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

View File

@ -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')}.

View File

@ -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]).