summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornopperl <54780682+nopperl@users.noreply.github.com>2024-02-19 14:14:07 +0000
committerGitHub <noreply@github.com>2024-02-19 16:14:07 +0200
commit9d679f0fccd4030779ed3c7684a40122fe41806c (patch)
treea4a72cb4e865f6ab9cc4ae65a6d2ba63ad60245a
parent1387cf60f758efb218fa06b670182c38ff149b7b (diff)
examples : support minItems/maxItems in JSON grammar converter (#5039)
* support minLength and maxLength in JSON schema grammar converter * Update examples/json-schema-to-grammar.py --------- Co-authored-by: Georgi Gerganov <ggerganov@gmail.com>
-rwxr-xr-xexamples/json-schema-to-grammar.py16
1 files changed, 15 insertions, 1 deletions
diff --git a/examples/json-schema-to-grammar.py b/examples/json-schema-to-grammar.py
index 2a4cb65b..6a977f03 100755
--- a/examples/json-schema-to-grammar.py
+++ b/examples/json-schema-to-grammar.py
@@ -87,7 +87,21 @@ class SchemaConverter:
elif schema_type == 'array' and 'items' in schema:
# TODO `prefixItems` keyword
item_rule_name = self.visit(schema['items'], f'{name}{"-" if name else ""}item')
- rule = f'"[" space ({item_rule_name} ("," space {item_rule_name})*)? "]" space'
+ list_item_operator = f'("," space {item_rule_name})'
+ successive_items = ""
+ min_items = schema.get("minItems", 0)
+ if min_items > 0:
+ first_item = f"({item_rule_name})"
+ successive_items = list_item_operator * (min_items - 1)
+ min_items -= 1
+ else:
+ first_item = f"({item_rule_name})?"
+ max_items = schema.get("maxItems")
+ if max_items is not None and max_items > min_items:
+ successive_items += (list_item_operator + "?") * (max_items - min_items - 1)
+ else:
+ successive_items += list_item_operator + "*"
+ rule = f'"[" space {first_item} {successive_items} "]" space'
return self._add_rule(rule_name, rule)
else: