/* [CORRECCIÓN] Todas las subreglas de <util_command> están ahora completamente expandidas. */
<util_command>    ::= <json_list_cmd> | <crypto_cmd> | <regex_cmd> | <datetime_cmd> | <stamp_cmd> | <string_cmd> | <replace_cmd>

/* Manipulación de listas y JSON */
<json_list_cmd>   ::= "variableToList(" <expression> "," <identifier> ")"
                    | "itemFromList(" <identifier> "," <expression> "," <identifier> ")"
                    | "variableFromJSON(" <identifier> "," <expression> "," <identifier> ")"
                    | "AddVariableToJSON(" <expression> "," <expression> "," <identifier> ")"

/* Criptografía */
<crypto_cmd>      ::= "encodeSHA256(" <identifier_or_string> "," <identifier> ")"
                    | "encodeMD5(" <identifier_or_string> "," <identifier> ")"

/* Expresiones regulares */
<regex_cmd>       ::= "getRegex(" <identifier> "," <stringliteral> "," <identifier> ")"

<datetime_cmd>    ::= "getDateTime(" <stringliteral> "," <expression> "," <stringliteral> "," <identifier> ")"
/*  Argumentos: formato_salida, epoch_origen, zona_horaria, destino */

<stamp_cmd>       ::= "stampToDatetime(" <expression> "," <stringliteral> "," <expression> "," <identifier> ")"
/*  Argumentos: epoch_origen, formato, timedelta, destino */
                    | "getTimeStamp(" <stringliteral> "," <stringliteral> "," <expression> "," <identifier> ")"
/*  Argumentos: fecha_string, formato_entrada, timedelta, destino */

<string_cmd>      ::= "randomString(" <expression> "," <identifier> ")"
/*  Argumentos: longitud, destino */

<replace_cmd>     ::= "replace(" <identifier_or_string> "," <stringliteral> "," <stringliteral> "," <identifier> ")"
/*  Argumentos: origen, patron_busqueda, reemplazo, destino */