{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "https://github.com/marmeladema/Peggy/tree/master/peggy/grammar.json",
    "title": "Peggy PEG Grammar Schema",
    "definitions": {
        "node": {
            "type": "object",
            "properties": {
                "ast": {
                    "type": "string",
                    "enum": [
                        "BUILD",
                        "SKIP",
                        "VOID",
                        "PRUNE"
                    ]
                },
                "type": {
                    "type": "string",
                    "enum": [
                        "RULE",
                        "CALL",
                        "SEQUENCE",
                        "CHOICE",
                        "RANGE",
                        "WILDCARD",
                        "STRING",
                        "STRINGI"
                    ]
                },
                "min": {
                    "type": "integer"
                },
                "max": {
                    "type": "integer"
                }
            },
            "anyOf": [
                {
                    "properties": {
                        "type": {
                            "type": "string",
                            "enum": [
                                "RULE"
                            ]
                        },
                        "data": {
                            "$ref": "#/definitions/node"
                        }
                    }
                },
                {
                    "properties": {
                        "type": {
                            "type": "string",
                            "enum": [
                                "CALL",
                                "STRING",
                                "STRINGI"
                            ]
                        },
                        "data": {
                            "type": "string",
                            "minLength": 1
                        }
                    }
                },
                {
                    "properties": {
                        "type": {
                            "type": "string",
                            "enum": [
                                "RANGE"
                            ]
                        },
                        "data": {
                            "type": "array",
                            "items": {
                                "type": "integer"
                            }
                        }
                    }
                },
                {
                    "properties": {
                        "type": {
                            "type": "string",
                            "enum": [
                                "SEQUENCE",
                                "CHOICE"
                            ]
                        },
                        "data": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/node"
                            }
                        }
                    }
                },
                {
                    "properties": {
                        "type": {
                            "type": "string",
                            "enum": [
                                "WILDCARD"
                            ]
                        }
                    }
                }
            ],
            "required": [
                "ast",
                "type"
            ]
        }
    },
    "type": "object",
    "patternProperties": {
        "^[a-zA-Z0-8_]+$": {
            "$ref": "#/definitions/node"
        }
    },
    "additionalProperties": false
}