feat(variform): support array syntax '[' and ']'
This commit is contained in:
parent
5f26e4ed5e
commit
bfca3ebc71
|
@ -78,6 +78,8 @@ eval({str, Str}, _Bindings) ->
|
||||||
str(Str);
|
str(Str);
|
||||||
eval({num, Num}, _Bindings) ->
|
eval({num, Num}, _Bindings) ->
|
||||||
str(Num);
|
str(Num);
|
||||||
|
eval({array, Args}, Bindings) ->
|
||||||
|
eval(Args, Bindings);
|
||||||
eval({call, FuncNameStr, Args}, Bindings) ->
|
eval({call, FuncNameStr, Args}, Bindings) ->
|
||||||
{Mod, Fun} = resolve_func_name(FuncNameStr),
|
{Mod, Fun} = resolve_func_name(FuncNameStr),
|
||||||
ok = assert_func_exported(Mod, Fun, length(Args)),
|
ok = assert_func_exported(Mod, Fun, length(Args)),
|
||||||
|
|
|
@ -1,16 +1,38 @@
|
||||||
Nonterminals expr call_or_var args.
|
Nonterminals
|
||||||
Terminals identifier number string '(' ')' ','.
|
expr
|
||||||
|
call_or_var
|
||||||
|
array
|
||||||
|
args
|
||||||
|
arg.
|
||||||
|
|
||||||
Rootsymbol expr.
|
Terminals
|
||||||
|
identifier
|
||||||
|
number
|
||||||
|
string
|
||||||
|
'(' ')'
|
||||||
|
',' '[' ']'.
|
||||||
|
|
||||||
|
Rootsymbol
|
||||||
|
expr.
|
||||||
|
|
||||||
%% Grammar Rules
|
%% 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')}.
|
call_or_var -> identifier : {var, element(3, '$1')}.
|
||||||
args -> expr : ['$1'].
|
|
||||||
args -> args ',' expr : '$1' ++ ['$3'].
|
|
||||||
|
|
||||||
%% Handling direct values and variables within arguments
|
%% Array is like a arg list, but with square brackets
|
||||||
expr -> number : {num, element(3, '$1')}.
|
array -> '[' args ']' : {array, '$2'}.
|
||||||
expr -> string : {str, element(3, '$1')}.
|
|
||||||
|
%% 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')}.
|
||||||
|
|
|
@ -6,6 +6,8 @@ DQ_STRING = \"[^\"]*\"
|
||||||
NUMBER = [+-]?(\\d+\\.\\d+|[0-9]+)
|
NUMBER = [+-]?(\\d+\\.\\d+|[0-9]+)
|
||||||
LPAREN = \(
|
LPAREN = \(
|
||||||
RPAREN = \)
|
RPAREN = \)
|
||||||
|
LBRACKET = \[
|
||||||
|
RBRACKET = \]
|
||||||
COMMA = ,
|
COMMA = ,
|
||||||
WHITESPACE = [\s\t\n]+
|
WHITESPACE = [\s\t\n]+
|
||||||
|
|
||||||
|
@ -18,6 +20,8 @@ Rules.
|
||||||
{NUMBER} : {token, {number, TokenLine, TokenChars}}.
|
{NUMBER} : {token, {number, TokenLine, TokenChars}}.
|
||||||
{LPAREN} : {token, {'(', TokenLine}}.
|
{LPAREN} : {token, {'(', TokenLine}}.
|
||||||
{RPAREN} : {token, {')', TokenLine}}.
|
{RPAREN} : {token, {')', TokenLine}}.
|
||||||
|
{LBRACKET} : {token, {'[', TokenLine}}.
|
||||||
|
{RBRACKET} : {token, {']', TokenLine}}.
|
||||||
{COMMA} : {token, {',', TokenLine}}.
|
{COMMA} : {token, {',', TokenLine}}.
|
||||||
|
|
||||||
Erlang code.
|
Erlang code.
|
||||||
|
|
Loading…
Reference in New Issue