mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-11-03 09:22:01 +00:00 
			
		
		
		
	grammar : support array references in json schema (#16792)
* grammar : support array references in json schema * Update json-schema-to-grammar.cpp Co-authored-by: Sigbjørn Skjæret <sigbjorn.skjaeret@scala.com> * grammar : improve regex when naming ref derived rules * grammar : replace non-conformant definitions array with anyOf test case --------- Co-authored-by: Sigbjørn Skjæret <sigbjorn.skjaeret@scala.com>
This commit is contained in:
		@@ -1124,9 +1124,9 @@ static void test_all(const std::string & lang, std::function<void(const TestCase
 | 
			
		||||
        })""",
 | 
			
		||||
        R"""(
 | 
			
		||||
            char ::= [^"\\\x7F\x00-\x1F] | [\\] (["\\bfnrt] | "u" [0-9a-fA-F]{4})
 | 
			
		||||
            foo ::= "{" space foo-a-kv "}" space
 | 
			
		||||
            foo-a-kv ::= "\"a\"" space ":" space string
 | 
			
		||||
            root ::= foo
 | 
			
		||||
            ref-definitions-foo ::= "{" space ref-definitions-foo-a-kv "}" space
 | 
			
		||||
            ref-definitions-foo-a-kv ::= "\"a\"" space ":" space string
 | 
			
		||||
            root ::= ref-definitions-foo
 | 
			
		||||
            space ::= | " " | "\n"{1,2} [ \t]{0,20}
 | 
			
		||||
            string ::= "\"" char* "\"" space
 | 
			
		||||
        )"""
 | 
			
		||||
@@ -1151,20 +1151,58 @@ static void test_all(const std::string & lang, std::function<void(const TestCase
 | 
			
		||||
            "type": "object"
 | 
			
		||||
        })""",
 | 
			
		||||
        R"""(
 | 
			
		||||
            alternative-0 ::= foo
 | 
			
		||||
            alternative-1 ::= bar
 | 
			
		||||
            bar ::= "{" space  (bar-b-kv )? "}" space
 | 
			
		||||
            bar-b-kv ::= "\"b\"" space ":" space number
 | 
			
		||||
            alternative-0 ::= ref-definitions-foo
 | 
			
		||||
            alternative-1 ::= ref-definitions-bar
 | 
			
		||||
            decimal-part ::= [0-9]{1,16}
 | 
			
		||||
            foo ::= "{" space  (foo-a-kv )? "}" space
 | 
			
		||||
            foo-a-kv ::= "\"a\"" space ":" space number
 | 
			
		||||
            integral-part ::= [0] | [1-9] [0-9]{0,15}
 | 
			
		||||
            number ::= ("-"? integral-part) ("." decimal-part)? ([eE] [-+]? integral-part)? space
 | 
			
		||||
            ref-definitions-bar ::= "{" space  (ref-definitions-bar-b-kv )? "}" space
 | 
			
		||||
            ref-definitions-bar-b-kv ::= "\"b\"" space ":" space number
 | 
			
		||||
            ref-definitions-foo ::= "{" space  (ref-definitions-foo-a-kv )? "}" space
 | 
			
		||||
            ref-definitions-foo-a-kv ::= "\"a\"" space ":" space number
 | 
			
		||||
            root ::= alternative-0 | alternative-1
 | 
			
		||||
            space ::= | " " | "\n"{1,2} [ \t]{0,20}
 | 
			
		||||
        )"""
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test({
 | 
			
		||||
        SUCCESS,
 | 
			
		||||
        "anyOf $ref",
 | 
			
		||||
        R"""({
 | 
			
		||||
            "properties": {
 | 
			
		||||
                "a": {
 | 
			
		||||
                    "anyOf": [
 | 
			
		||||
                        {"type": "string"},
 | 
			
		||||
                        {"type": "number"}
 | 
			
		||||
                    ]
 | 
			
		||||
                },
 | 
			
		||||
                "b": {
 | 
			
		||||
                    "anyOf": [
 | 
			
		||||
                        {"$ref": "#/properties/a/anyOf/0"},
 | 
			
		||||
                        {"type": "boolean"}
 | 
			
		||||
                    ]
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            "type": "object"
 | 
			
		||||
        })""",
 | 
			
		||||
        R"""(
 | 
			
		||||
            a ::= string | number
 | 
			
		||||
            a-kv ::= "\"a\"" space ":" space a
 | 
			
		||||
            a-rest ::= ( "," space b-kv )?
 | 
			
		||||
            b ::= b-0 | boolean
 | 
			
		||||
            b-0 ::= string
 | 
			
		||||
            b-kv ::= "\"b\"" space ":" space b
 | 
			
		||||
            boolean ::= ("true" | "false") space
 | 
			
		||||
            char ::= [^"\\\x7F\x00-\x1F] | [\\] (["\\bfnrt] | "u" [0-9a-fA-F]{4})
 | 
			
		||||
            decimal-part ::= [0-9]{1,16}
 | 
			
		||||
            integral-part ::= [0] | [1-9] [0-9]{0,15}
 | 
			
		||||
            number ::= ("-"? integral-part) ("." decimal-part)? ([eE] [-+]? integral-part)? space
 | 
			
		||||
            root ::= "{" space  (a-kv a-rest | b-kv )? "}" space
 | 
			
		||||
            space ::= | " " | "\n"{1,2} [ \t]{0,20}
 | 
			
		||||
            string ::= "\"" char* "\"" space
 | 
			
		||||
        )"""
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test({
 | 
			
		||||
        SUCCESS,
 | 
			
		||||
        "mix of allOf, anyOf and $ref (similar to https://json.schemastore.org/tsconfig.json)",
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user