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

This commit is contained in:
zmstone 2024-03-28 19:30:23 +01:00
parent 5f26e4ed5e
commit bfca3ebc71
3 changed files with 38 additions and 10 deletions

View File

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

View File

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

View File

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