| 904 | rule += ' "," space ( ' |
| 905 | |
| 906 | def get_recursive_refs(ks, first_is_optional): |
| 907 | [k, *rest] = ks |
| 908 | kv_rule_name = prop_kv_rule_names[k] |
| 909 | if k == "*": |
| 910 | res = self._add_rule( |
| 911 | f"{name}{'-' if name else ''}additional-kvs", |
| 912 | f'{kv_rule_name} ( "," space ' + kv_rule_name + " )*", |
| 913 | ) |
| 914 | elif first_is_optional: |
| 915 | res = f'( "," space {kv_rule_name} )?' |
| 916 | else: |
| 917 | res = kv_rule_name |
| 918 | if len(rest) > 0: |
| 919 | res += " " + self._add_rule( |
| 920 | f"{name}{'-' if name else ''}{k}-rest", |
| 921 | get_recursive_refs(rest, first_is_optional=True), |
| 922 | ) |
| 923 | return res |
| 924 | |
| 925 | rule += " | ".join( |
| 926 | get_recursive_refs(optional_props[i:], first_is_optional=False) |