diff --git a/apps/emqx/src/variform/emqx_variform.erl b/apps/emqx/src/variform/emqx_variform.erl index 51108885c..95ea1e1ce 100644 --- a/apps/emqx/src/variform/emqx_variform.erl +++ b/apps/emqx/src/variform/emqx_variform.erl @@ -78,6 +78,8 @@ eval({str, Str}, _Bindings) -> str(Str); eval({num, Num}, _Bindings) -> str(Num); +eval({array, Args}, Bindings) -> + eval(Args, Bindings); eval({call, FuncNameStr, Args}, Bindings) -> {Mod, Fun} = resolve_func_name(FuncNameStr), ok = assert_func_exported(Mod, Fun, length(Args)), diff --git a/apps/emqx/src/variform/emqx_variform_parser.yrl b/apps/emqx/src/variform/emqx_variform_parser.yrl index 3f2b739ba..8a8a03a4d 100644 --- a/apps/emqx/src/variform/emqx_variform_parser.yrl +++ b/apps/emqx/src/variform/emqx_variform_parser.yrl @@ -1,16 +1,38 @@ -Nonterminals expr call_or_var args. -Terminals identifier number string '(' ')' ','. +Nonterminals + expr + call_or_var + array + args + arg. -Rootsymbol expr. +Terminals + identifier + number + string + '(' ')' + ',' '[' ']'. + +Rootsymbol + expr. %% Grammar Rules -expr -> call_or_var: '$1'. -call_or_var -> identifier '(' args ')' : {call, element(3,'$1'), '$3'}. +%% Root expression: function call or variable +expr -> call_or_var : '$1'. + +%% Function call or variable +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')}. +%% Array is like a arg list, but with square brackets +array -> '[' args ']' : {array, '$2'}. + +%% Argument handling +args -> arg : ['$1']. +args -> args ',' arg : '$1' ++ ['$3']. + +%% Arguments can be expressions, arrays, numbers, or strings +arg -> expr : '$1'. +arg -> array : '$1'. +arg -> number : {num, element(3, '$1')}. +arg -> 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 index 53657bad4..29a45ef92 100644 --- a/apps/emqx/src/variform/emqx_variform_scan.xrl +++ b/apps/emqx/src/variform/emqx_variform_scan.xrl @@ -6,6 +6,8 @@ DQ_STRING = \"[^\"]*\" NUMBER = [+-]?(\\d+\\.\\d+|[0-9]+) LPAREN = \( RPAREN = \) +LBRACKET = \[ +RBRACKET = \] COMMA = , WHITESPACE = [\s\t\n]+ @@ -18,6 +20,8 @@ Rules. {NUMBER} : {token, {number, TokenLine, TokenChars}}. {LPAREN} : {token, {'(', TokenLine}}. {RPAREN} : {token, {')', TokenLine}}. +{LBRACKET} : {token, {'[', TokenLine}}. +{RBRACKET} : {token, {']', TokenLine}}. {COMMA} : {token, {',', TokenLine}}. Erlang code.