Explorar o código

feat(variform): support array syntax '[' and ']'

zmstone hai 1 ano
pai
achega
bfca3ebc71

+ 2 - 0
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)),

+ 32 - 10
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')}.

+ 4 - 0
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.