55
66MF6_GRAMMAR = r"""
77// component
8- component: _NL* (block _NL+)* _NL*
8+ component: _NL* (block _NL+)+ _NL*
99
1010// block
11- block: _paramblock | _listblock
12- _paramblock : _BEGIN paramblock _NL params _END paramblock
11+ block: _dictblock | _listblock
12+ _dictblock : _BEGIN dictblock _NL dict _END dictblock
1313_listblock: _BEGIN listblock _NL list _END listblock
14- paramblock: PARAMBLOCK
14+ dictblock: DICTBLOCK
1515listblock: LISTBLOCK [_blockindex]
1616_blockindex: INT
1717_BEGIN: "begin"i
1818_END: "end"i
1919
20+ // dict
21+ dict.1: (param _NL)*
22+
23+ // list adapted from https://github.com/lark-parser/lark/blob/master/examples/composition/csv.lark
24+ // negative priority for records because the pattern is so indiscriminate
25+ list.-1: record*
26+ record.-1: _record+ _NL
27+ _record: scalar
28+
2029// parameter
21- params.1: (param _NL)*
2230param: key | _pair
2331_pair: key value
2432key: PARAM
5462factor: "FACTOR" NUMBER
5563iprn: "IPRN" INT
5664
57- // list adapted from https://github.com/lark-parser/lark/blob/master/examples/composition/csv.lark
58- // negative priority for records because the pattern is so indiscriminate
59- list.-1: record*
60- record.-1: _record+ _NL
61- _record: scalar
62-
6365// newline
6466_NL: /(\r?\n[\t ]*)+/
6567
8082
8183def make_parser (
8284 params : Iterable [str ],
83- param_blocks : Iterable [str ],
85+ dict_blocks : Iterable [str ],
8486 list_blocks : Iterable [str ],
8587):
8688 """
@@ -92,18 +94,18 @@ def make_parser(
9294 We specify blocks containing parameters separately from blocks
9395 that contain a list. These must be handled separately because
9496 the pattern for list elements (records) casts a wider net than
95- the pattern for parameters, causing parameter blocks to parse
96- as lists otherwise .
97+ the pattern for parameters, which can cause a dictionary block
98+ of named parameters to parse as a block with a list of records .
9799
98100 """
99101 params = "|" .join (['"' + n + '"i' for n in params ])
100- param_blocks = "|" .join (['"' + n + '"i' for n in param_blocks ])
102+ dict_blocks = "|" .join (['"' + n + '"i' for n in dict_blocks ])
101103 list_blocks = "|" .join (['"' + n + '"i' for n in list_blocks ])
102104 grammar = linesep .join (
103105 [
104106 MF6_GRAMMAR ,
105107 f"PARAM: ({ params } )" ,
106- f"PARAMBLOCK : ({ param_blocks } )" ,
108+ f"DICTBLOCK : ({ dict_blocks } )" ,
107109 f"LISTBLOCK: ({ list_blocks } )" ,
108110 ]
109111 )
0 commit comments