Skip to content

Commit 47e435d

Browse files
committed
introduce 'pattern' argument for 'get_pragma_parameters' defaulting to the original behaviour allowing necessary pass of different pattern to 'process_dimension_pragmas'
1 parent dec1ad7 commit 47e435d

File tree

1 file changed

+24
-4
lines changed

1 file changed

+24
-4
lines changed

loki/ir/pragma_utils.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
96115
def 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

Comments
 (0)