@@ -24,15 +24,40 @@ def _get_template_env():
2424 return env
2525
2626
27+ def _compute_block_metadata (blocks ):
28+ """Pre-compute block metadata for template rendering."""
29+ block_metadata = {}
30+ for block_name , block_fields in blocks .items ():
31+ period_groups = filters .group_period_fields (block_fields )
32+ recarray_name = filters .get_recarray_name (block_name ) if period_groups else None
33+ has_index = block_name == "period"
34+
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
42+
43+
2744def make_grammar (dfn : Dfn , outdir : PathLike ):
2845 """Generate a Lark grammar file for a single component."""
2946 outdir = Path (outdir ).expanduser ().resolve ().absolute ()
3047 env = _get_template_env ()
3148 template = env .get_template ("component.lark.jinja" )
3249 target_path = outdir / f"{ dfn .name } .lark"
50+
51+ # Pre-compute block metadata
52+ block_metadata = _compute_block_metadata (dfn .blocks )
53+
3354 with open (target_path , "w" ) as f :
3455 name = dfn .name
35- f .write (template .render (name = name , blocks = dfn .blocks , fields = dfn .fields ))
56+ f .write (
57+ template .render (
58+ name = name , blocks = dfn .blocks , fields = dfn .fields , block_metadata = block_metadata
59+ )
60+ )
3661
3762
3863def make_all_grammars (dfns : dict [str , Dfn ], outdir : PathLike ):
0 commit comments