Quellcode durchsuchen

feat(variform): add a variable transformer

zmstone vor 1 Jahr
Ursprung
Commit
9bf65a415b

+ 2 - 0
.gitignore

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

+ 16 - 0
apps/emqx/src/variform/emqx_variform_parser.yrl

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

+ 26 - 0
apps/emqx/src/variform/emqx_variform_scan.xrl

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