@@ -50,9 +50,17 @@ def is_loki_pragma(pragma, starts_with=None):
5050 return True
5151
5252
53- _get_pragma_parameters_re = re .compile (r'(?P<command>[\w-]+)\s*(?:\((?P<arg>.*)\))?' )
53+ _get_pragma_parameters_re = re .compile (r'(?P<command>[\w-]+)\s*(?:\((?P<arg>.+?)\))?' )
54+ """
55+ Regular expression pattern to match pragma parameters.
5456
55- def get_pragma_parameters (pragma , starts_with = None , only_loki_pragmas = True ):
57+ E.g., match ``!$loki something key1(val1) key2(val2)``.
58+ Problematic for e.g., ``!$loki something key1((val1 + 1)/2)``,
59+ use instead: `_get_pragma_dim_parameter_re`.
60+ """
61+
62+ def get_pragma_parameters (pragma , starts_with = None , only_loki_pragmas = True ,
63+ pattern = _get_pragma_parameters_re ):
5664 """
5765 Parse the pragma content for parameters in the form ``<command>[(<arg>)]`` and
5866 return them as a map ``{<command>: <arg> or None}``.
@@ -70,6 +78,8 @@ def get_pragma_parameters(pragma, starts_with=None, only_loki_pragmas=True):
7078 the keyword the pragma content should start with.
7179 only_loki_pragmas : bool, optional
7280 restrict parameter extraction to ``loki`` pragmas only.
81+ pattern : :any:`regex.Pattern`, optional
82+ Regex pattern (default: `_get_pragma_dim_parameter_re`).
7383
7484 Returns
7585 -------
@@ -87,12 +97,21 @@ def get_pragma_parameters(pragma, starts_with=None, only_loki_pragmas=True):
8797 if not content .lower ().startswith (starts_with .lower ()):
8898 continue
8999 content = content [len (starts_with ):]
90- for match in re .finditer (_get_pragma_parameters_re , content ):
100+ for match in re .finditer (pattern , content ):
91101 parameters [match .group ('command' )].append (match .group ('arg' ))
92102 parameters = {k : v if len (v ) > 1 else v [0 ] for k , v in parameters .items ()}
93103 return parameters
94104
95105
106+ _get_pragma_dim_parameter_re = re .compile (r'(?P<command>[\w-]+)\s*(?:\((?P<arg>.*)\))?' )
107+ """
108+ Regular expression pattern to match pragma dimension parameter.
109+
110+ E.g., match ``!$loki something key1((val1 + 1)/2)``.
111+ Problematic for e.g., ``!$loki something key1(val1) key2(val2)``,
112+ use instead: `_get_pragma_parameters_re`.
113+ """
114+
96115def process_dimension_pragmas (ir , scope = None ):
97116 """
98117 Process any ``!$loki dimension`` pragmas to override deferred dimensions
@@ -111,7 +130,8 @@ def process_dimension_pragmas(ir, scope=None):
111130 if is_loki_pragma (decl .pragma , starts_with = 'dimension' ):
112131 for v in decl .symbols :
113132 # Found dimension override for variable
114- dims = get_pragma_parameters (decl .pragma )['dimension' ]
133+ dims = get_pragma_parameters (decl .pragma ,
134+ pattern = _get_pragma_dim_parameter_re )['dimension' ]
115135 dims = [d .strip () for d in dims .split (',' )]
116136 # parse each dimension
117137 shape = tuple (parse_expr (d , scope = scope ) for d in dims )
0 commit comments