Skip to content

Commit 9d679f0

Browse files
nopperlggerganov
andauthored
examples : support minItems/maxItems in JSON grammar converter (ggml-org#5039)
* support minLength and maxLength in JSON schema grammar converter * Update examples/json-schema-to-grammar.py --------- Co-authored-by: Georgi Gerganov <[email protected]>
1 parent 1387cf6 commit 9d679f0

File tree

1 file changed

+15
-1
lines changed

1 file changed

+15
-1
lines changed

examples/json-schema-to-grammar.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,21 @@ def visit(self, schema, name):
8787
elif schema_type == 'array' and 'items' in schema:
8888
# TODO `prefixItems` keyword
8989
item_rule_name = self.visit(schema['items'], f'{name}{"-" if name else ""}item')
90-
rule = f'"[" space ({item_rule_name} ("," space {item_rule_name})*)? "]" space'
90+
list_item_operator = f'("," space {item_rule_name})'
91+
successive_items = ""
92+
min_items = schema.get("minItems", 0)
93+
if min_items > 0:
94+
first_item = f"({item_rule_name})"
95+
successive_items = list_item_operator * (min_items - 1)
96+
min_items -= 1
97+
else:
98+
first_item = f"({item_rule_name})?"
99+
max_items = schema.get("maxItems")
100+
if max_items is not None and max_items > min_items:
101+
successive_items += (list_item_operator + "?") * (max_items - min_items - 1)
102+
else:
103+
successive_items += list_item_operator + "*"
104+
rule = f'"[" space {first_item} {successive_items} "]" space'
91105
return self._add_rule(rule_name, rule)
92106

93107
else:

0 commit comments

Comments
 (0)