Skip to content

Commit b49f97d

Browse files
committed
simplify
1 parent b1b4283 commit b49f97d

File tree

2 files changed

+49
-43
lines changed

2 files changed

+49
-43
lines changed

flopy4/mf6/codec/reader/grammar/__init__.py

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,28 +17,39 @@ def _get_template_env():
1717
)
1818
env.filters["field_type"] = filters.field_type
1919
env.filters["record_child_type"] = filters.record_child_type
20-
env.filters["keystring_children"] = filters.keystring_children
21-
env.filters["group_period_fields"] = filters.group_period_fields
22-
env.filters["get_recarray_name"] = filters.get_recarray_name
23-
env.filters["get_all_grouped_field_names"] = filters.get_all_grouped_field_names
2420
return env
2521

2622

2723
def _compute_block_metadata(blocks):
2824
"""Pre-compute block metadata for template rendering."""
29-
block_metadata = {}
25+
blocks_list = []
3026
for block_name, block_fields in blocks.items():
3127
period_groups = filters.group_period_fields(block_fields)
32-
recarray_name = filters.get_recarray_name(block_name) if period_groups else None
3328
has_index = block_name == "period"
3429

35-
block_metadata[block_name] = {
36-
"fields": block_fields,
37-
"period_groups": period_groups,
38-
"recarray_name": recarray_name,
39-
"has_index": has_index,
40-
}
41-
return block_metadata
30+
# Build recarrays list
31+
recarrays = []
32+
grouped_field_names = set()
33+
if period_groups:
34+
for field_names in period_groups.values():
35+
recarray_name = filters.get_recarray_name(block_name)
36+
recarrays.append({"name": recarray_name, "fields": field_names})
37+
grouped_field_names.update(field_names)
38+
39+
# Get standalone fields (not in any recarray)
40+
all_field_names = list(block_fields.keys())
41+
standalone_fields = [f for f in all_field_names if f not in grouped_field_names]
42+
43+
blocks_list.append(
44+
{
45+
"name": block_name,
46+
"has_index": has_index,
47+
"standalone_fields": standalone_fields,
48+
"recarrays": recarrays,
49+
}
50+
)
51+
52+
return blocks_list
4253

4354

4455
def make_grammar(dfn: Dfn, outdir: PathLike):
@@ -49,15 +60,11 @@ def make_grammar(dfn: Dfn, outdir: PathLike):
4960
target_path = outdir / f"{dfn.name}.lark"
5061

5162
# Pre-compute block metadata
52-
block_metadata = _compute_block_metadata(dfn.blocks)
63+
blocks_list = _compute_block_metadata(dfn.blocks)
5364

5465
with open(target_path, "w") as f:
5566
name = dfn.name
56-
f.write(
57-
template.render(
58-
name=name, blocks=dfn.blocks, fields=dfn.fields, block_metadata=block_metadata
59-
)
60-
)
67+
f.write(template.render(name=name, blocks=blocks_list, fields=dfn.fields))
6168

6269

6370
def make_all_grammars(dfns: dict[str, Dfn], outdir: PathLike):

flopy4/mf6/codec/reader/grammar/templates/component.lark.jinja

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,33 @@
99

1010
// Top-level structure
1111
start: block*
12-
block: {% for block_name in blocks.keys() %}
13-
{{- block_name }}_block
12+
block: {% for block in blocks %}
13+
{{- block.name }}_block
1414
{%- if not loop.last %} | {% endif %}
1515
{%- endfor %}
1616

1717
// Block definitions
18-
{% for block_name, meta in block_metadata.items() %}
19-
{{ m.block_def(block_name, meta.has_index) }}
18+
{% for block in blocks %}
19+
{{ m.block_def(block.name, block.has_index) }}
2020
{% endfor %}
21-
{% if block_metadata.values()|selectattr('has_index')|list %}
21+
{% if blocks|selectattr('has_index')|list %}
2222
block_index: integer
2323
{% endif %}
2424
// Block field lists
25-
{% for block_name, meta in block_metadata.items() %}
26-
{% if meta.period_groups %}
27-
{% set grouped_field_names = meta.period_groups.values()|first %}
28-
{% set field_names = [] %}
29-
{% for field_name in meta.fields.keys() %}
30-
{%- if field_name not in grouped_field_names %}
31-
{%- set _ = field_names.append(field_name) %}
32-
{%- endif %}
33-
{%- endfor %}
34-
{{ m.field_list(block_name, field_names, meta.recarray_name) }}
25+
{% for block in blocks %}
26+
{% if block.recarrays %}
27+
{% set recarray_name = block.recarrays[0].name %}
28+
{{ m.field_list(block.name, block.standalone_fields, recarray_name) }}
3529
{% else %}
36-
{{ m.field_list(block_name, meta.fields.keys()|list, none) }}
30+
{{ m.field_list(block.name, block.standalone_fields, none) }}
3731
{% endif %}
3832
{% endfor %}
3933
// Individual field rules
40-
{% set grouped_fields = blocks|get_all_grouped_field_names %}
41-
{% for field_name, field in fields.items() %}
42-
{% if field_name not in grouped_fields %}
34+
{% set generated_rules = [] %}
35+
{% for block in blocks %}
36+
{% for field_name in block.standalone_fields %}
37+
{% if field_name not in generated_rules %}
38+
{% set field = fields[field_name] %}
4339
{% set field_type = field|field_type %}
4440
{% if field.type == 'record' and field.children is not none %}
4541
{{ m.record_field(field_name, field) }}
@@ -48,11 +44,14 @@ block_index: integer
4844
{% else %}
4945
{{ m.simple_field(field_name, field, field_type) }}
5046
{% endif %}
47+
{% set _ = generated_rules.append(field_name) %}
5148
{% endif %}
5249
{% endfor %}
50+
{% endfor %}
5351
{# Generate union rules for nested unions within records #}
5452
{% set unions_generated = [] %}
55-
{% for field_name, field in fields.items() %}
53+
{% for field_name in generated_rules %}
54+
{% set field = fields[field_name] %}
5655
{% if field.type == 'record' and field.children is not none %}
5756
{% for child_name, child in field.children.items() %}
5857
{% if child.type == 'union' and child_name not in unions_generated %}
@@ -63,10 +62,10 @@ block_index: integer
6362
{% endif %}
6463
{% endfor %}
6564
// Recarray rules for period data (stress_period_data, etc.)
66-
{% for block_name, meta in block_metadata.items() %}
67-
{% if meta.recarray_name %}
68-
{{ meta.recarray_name }}: record+
69-
{% endif %}
65+
{% for block in blocks %}
66+
{% for recarray in block.recarrays %}
67+
{{ recarray.name }}: record+
68+
{% endfor %}
7069
{% endfor %}
7170

7271
%import typed.integer -> integer

0 commit comments

Comments
 (0)