{
  "name": "Turtle",
  "scopeName": "source.turtle",
  "patterns": [
    {
      "include": "#turtleDoc"
    }
  ],
  "repository": {
    "ANON": {
      "name": "meta.spec.ANON.turtle"
    },
    "BLANK_NODE_LABEL": {
      "name": "meta.spec.BLANK_NODE_LABEL.turtle",
      "captures": {
        "1": {
          "name": "keyword.other.BLANK_NODE_LABEL.turtle"
        },
        "2": {
          "name": "variable.other.BLANK_NODE_LABEL.turtle"
        }
      }
    },
    "BlankNode": {
      "name": "meta.spec.BlankNode.turtle",
      "patterns": [
        {
          "include": "#BLANK_NODE_LABEL"
        },
        {
          "include": "#ANON"
        }
      ]
    },
    "IRIREF": {
      "name": "entity.name.type.IRIREF.turtle",
      "match": "(?x) (\\\u003c) (?:[^\\x00-\\x20\\\u003c\\\u003e\\\\\\\"\\{\\}\\|\\^`] | (?:\\\\u[0-9A-Fa-f]{4}|\\\\U[0-9A-Fa-f]{8}))* (\\\u003e)",
      "captures": {
        "1": {
          "name": "punctuation.definition.entity.begin.turtle"
        },
        "2": {
          "name": "punctuation.definition.entity.end.turtle"
        }
      }
    },
    "PNAME_LN": {
      "name": "meta.spec.PNAME_LN.turtle",
      "captures": {
        "PNAME_NS": {
          "name": "variable.other.PNAME_NS.turtle"
        },
        "PN_LOCAL": {
          "name": "support.variable.PN_LOCAL.turtle"
        }
      }
    },
    "PNAME_NS": {
      "name": "variable.other.PNAME_NS.turtle"
    },
    "PN_LOCAL": {
      "name": "support.variable.PN_LOCAL.turtle"
    },
    "PrefixedName": {
      "name": "meta.spec.PrefixedName.turtle",
      "patterns": [
        {
          "include": "#PNAME_LN"
        },
        {
          "include": "#PNAME_NS"
        }
      ]
    },
    "blankNodePropertyList": {
      "name": "meta.spec.blankNodePropertyList.turtle",
      "begin": "\\b(\\[)\\b",
      "end": "\\b(\\])(?=\\b|\\s|[.;,])",
      "patterns": [
        {
          "name": "punctuation.terminator.stmt.turtle",
          "match": "((?\u003c=\\s)[.;,](?=\\b))"
        },
        {
          "include": "#literal"
        },
        {
          "include": "#blankNodePropertyList"
        },
        {
          "include": "#iri"
        },
        {
          "include": "#BlankNode"
        },
        {
          "include": "#collection"
        },
        {
          "name": "keyword.other.typeOf.turtle",
          "match": "(?\u003c=[ ])(a)(?=[ ])"
        }
      ],
      "captures": {
        "1": {
          "name": "punctuation.terminator.blankNodePropertyList.turtle"
        }
      }
    },
    "collection": {
      "name": "meta.spec.collection.turtle",
      "begin": "(\\b\\(\\b)",
      "end": "(\\b\\)\\b)",
      "patterns": [
        {
          "include": "#literal"
        },
        {
          "include": "#iri"
        },
        {
          "include": "#BlankNode"
        },
        {
          "include": "#collection"
        },
        {
          "name": "keyword.other.typeOf.turtle",
          "match": "(?\u003c=[ ])(a)(?=[ ])"
        },
        {
          "include": "#blankNodePropertyList"
        }
      ],
      "captures": {
        "1": {
          "name": "punctuation.terminator.collection.turtle"
        }
      }
    },
    "directive": {
      "name": "meta.spec.directive.turtle",
      "begin": "(?i)(^(?=@prefix|@base|PREFIX|BASE))",
      "end": "($)",
      "patterns": [
        {
          "name": "meta.spec.prefixID.turtle",
          "begin": "^(@prefix)(?=\\s)",
          "end": "(\\.?)$",
          "patterns": [
            {
              "include": "#IRIREF"
            },
            {
              "include": "#PNAME_NS"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "keyword.other.directive.prefix.turtle"
            }
          },
          "endCaptures": {
            "1": {
              "name": "punctuation.terminator.directive.turtle"
            }
          }
        },
        {
          "name": "meta.spec.base.turtle",
          "begin": "^(@base)",
          "end": "(\\.?)$",
          "patterns": [
            {
              "include": "#IRIREF"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "keyword.other.directive.base.turtle"
            }
          },
          "endCaptures": {
            "1": {
              "name": "punctuation.terminator.directive.turtle"
            }
          }
        },
        {
          "name": "meta.spec.sparqlPrefix.turtle",
          "begin": "^(?i)(PREFIX)(?=\\b)",
          "end": "$",
          "patterns": [
            {
              "include": "#IRIREF"
            },
            {
              "include": "#PNAME_NS"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "keyword.other.directive.sparqlPrefix.turtle"
            }
          }
        },
        {
          "name": "meta.spec.sparqlBase.turtle",
          "begin": "^(?i)(BASE)(?=\\b)",
          "end": "$",
          "patterns": [
            {
              "include": "#IRIREF"
            }
          ],
          "beginCaptures": {
            "1": {
              "name": "keyword.other.directive.sparqlBase.turtle"
            }
          }
        }
      ]
    },
    "iri": {
      "name": "meta.spec.iri.turtle",
      "patterns": [
        {
          "include": "#IRIREF"
        },
        {
          "include": "#PrefixedName"
        }
      ]
    },
    "literal": {
      "name": "meta.spec.literal.turtle",
      "patterns": [
        {
          "name": "constant.numeric.turtle",
          "match": "(?x)\n\t\t\t\t\t\t(?\u003c=\\s)[+-]?\t\t\t\t\t\t\n\t\t\t\t\t\t( (?: \\d+?\\.?\\d*[eE][+-]?\\d+) | \\d*\\.\\d+ | \\d+)\n\t\t\t\t\t\t(?=[ ]*[,.;]?)\n\t\t\t\t\t"
        },
        {
          "name": "constant.language.boolean.turtle",
          "match": "(?\u003c=\\s)(true|false)(?=[ ]*[,.;]?)"
        },
        {
          "name": "meta.spec.RDFLiteral.turtle",
          "patterns": [
            {
              "include": "#literal_triple"
            },
            {
              "include": "#literal_double"
            },
            {
              "include": "#literal_single"
            }
          ]
        }
      ]
    },
    "literal_double": {
      "name": "string.quoted.double.turtle",
      "match": "(?x)\n\t\t\t\t(\")[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*(\")\n\t\t\t\t(?\u003clang\u003e@(?:[a-z]{2}(?:-[a-z0-9]{2})*)?)?\n\t\t\t\t(?\u003cdt\u003e\\^\\^\\w*:\\w*|\\\u003c[^\\\u003e]+\\\u003e)?\n\t\t\t",
      "captures": {
        "1": {
          "name": "punctuation.definition.string.begin.turtle"
        },
        "2": {
          "name": "punctuation.definition.string.end.turtle"
        },
        "dt": {
          "name": "storage.type.datatype.turtle"
        },
        "lang": {
          "name": "constant.language.language_tag.turtle"
        }
      }
    },
    "literal_single": {
      "name": "string.quoted.single.turtle",
      "match": "(?x)\n\t\t\t\t(')[^'\\\\]*(?:\\.[^'\\\\]*)*(')\n\t\t\t\t(?\u003clang\u003e@(?:[a-z]{2}(?:-[a-z0-9]{2})*)?)?\n\t\t\t\t(?\u003cdt\u003e\\^\\^\\w*:\\w*|\\\u003c[^\\\u003e]+\\\u003e)?\n\t\t\t",
      "captures": {
        "1": {
          "name": "punctuation.definition.string.begin.turtle"
        },
        "2": {
          "name": "punctuation.definition.string.end.turtle"
        },
        "dt": {
          "name": "storage.type.datatype.turtle"
        },
        "lang": {
          "name": "constant.language.language_tag.turtle"
        }
      }
    },
    "literal_triple": {
      "name": "string.quoted.triple.turtle",
      "begin": "(['\"]{3})",
      "end": "(?x)\n\t\t\t\t(\\1)\n\t\t\t\t(?\u003clang\u003e@(?:[a-z]{2}(?:-[a-z0-9]{2})*)?)?\n\t\t\t\t(?\u003cdt\u003e\\^\\^\\w*:\\w*|\\\u003c[^\\\u003e]+\\\u003e)?\n\t\t\t\t(?=[ ]*[.;,]?)\n\t\t\t",
      "beginCaptures": {
        "1": {
          "name": "punctuation.definition.string.begin.turtle"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.turtle"
        },
        "dt": {
          "name": "storage.type.datatype.turtle"
        },
        "lang": {
          "name": "constant.language.language_tag.turtle"
        }
      }
    },
    "sparqlClausedKeywords": {
      "begin": "(?x)(\n\t\t\t\t(?# Special case because FILTER can have clauses what makes the lexer dizzy)\n\t\t\t\tFILTER\n\t\t\t)\\s*(\\((?=\\s*))",
      "end": "\\s*(\\))",
      "patterns": [
        {
          "include": "#sparqlVars"
        },
        {
          "include": "#sparqlFilterFns"
        },
        {
          "include": "#sparqlLangConsts"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "keyword.control.sparql.turtle"
        },
        "2": {
          "name": "punctuation.terminator.sparqlKeyword.turtle"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.terminator.sparqlKeyword.turtle"
        }
      }
    },
    "sparqlFilterFns": {
      "begin": "(?x)(\n\t\t\t\t(?# Special case because FILTER can have clauses what makes the lexer dizzy)\n\t\t\t\tFILTER|\n\t\t\t\t(?# Builtin callables )\n\t\t\t\tSTR|LANG|LANGMATCHES|DATATYPE|BOUND|IRI|URI|BNODE|RAND|ABS|CEIL|FLOOR|ROUND|CONCAT|STRLEN|UCASE|LCASE|ENCODE_FOR_URI|CONTAINS|STRSTARTS|STRENDS|STRBEFORE|STRAFTER|YEAR|MONTH|DAY|HOURS|MINUTES|SECONDS|TIMEZONE|TZ|NOW|UUID|STRUUID|MD5|SHA1|SHA256|SHA384|SHA512|COALESCE|IF|STRLANG|STRDT|sameTerm|isIRI|isURI|isBLANK|isLITERAL|isNUMERIC|COUNT|SUM|MIN|MAX|AVG|SAMPLE|GROUP_CONCAT|\n\t\t\t\tBOUND|COALESCE|NOT EXISTS|EXISTS|REGEX|SUBSTR|REPLACE\n\t\t\t)\\s*(\\((?=\\s*))",
      "end": "\\s*(\\))",
      "patterns": [
        {
          "include": "#sparqlVars"
        },
        {
          "include": "#sparqlFilterFns"
        },
        {
          "include": "#sparqlLangConsts"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "support.function.sparql.turtle"
        },
        "2": {
          "name": "punctuation.terminator.sparqlFunc.turtle"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.terminator.sparqlFunc.turtle"
        }
      }
    },
    "sparqlKeywords": {
      "name": "keyword.control.sparql.turtle",
      "match": "(?x)(\n\t\t\t\t\t(?# SPARQL )\n\t\t\t\t\tSELECT|ASK|CONSTRUCT|DESCRIBE|FROM|NAMED|WHERE|GRAPH|AS|\n\t\t\t\t\tUNION|FILTER|HAVING|VALUES|\n\t\t\t\t\tOPTIONAL|SERVICE|\t\t\t \n\t\t\t\t\t(?# SPARUL )\n\t\t\t\t\tSILENT|DATA|\t\t\t\t\t\n\t\t\t\t\tADD|MOVE|COPY|\n\t\t\t\t\tINSERT|DELETE|\n\t\t\t\t\tLOAD|INTO|\n\t\t\t\t\tGRAPH|ALL|DEFAULT|\t\t\t\t\t\n\t\t\t\t\tCLEAR|CREATE|DROP|\n\t\t\t\t\tWITH|USING|\n\t\t\t\t\t(?# Solution sequence modifiers )\n\t\t\t\t\tDISTINCT|REDUCED|\n\t\t\t\t\tORDER|ASC|DESC|OFFSET|LIMITED|REDUCED|\n\t\t\t\t\tGROUP|BY|LIMIT\t\t\t\t\t\n\t\t\t\t)"
    },
    "sparqlLangConsts": {
      "name": "constant.language.sparql.turtle",
      "match": "(true|false)"
    },
    "sparqlVars": {
      "name": "constant.variable.sparql.turtle",
      "match": "(\\?\\w+|\\*)"
    },
    "triples": {
      "name": "meta.spec.triples.turtle",
      "begin": "(?i)^(?!@|\\#|PREFIX|BASE)",
      "end": "([.;,]?)$",
      "patterns": [
        {
          "name": "comment.line.number-sign.turtle",
          "match": "(#.+$)",
          "captures": {
            "1": {
              "name": "punctuation.definition.comment.turtle"
            }
          }
        },
        {
          "name": "punctuation.terminator.stmt.turtle",
          "match": "[.;,](?=\\s|\\b)"
        },
        {
          "include": "#literal"
        },
        {
          "include": "#sparqlVars"
        },
        {
          "include": "#sparqlClausedKeywords"
        },
        {
          "include": "#sparqlKeywords"
        },
        {
          "include": "#sparqlFilterFns"
        },
        {
          "include": "#sparqlLangConsts"
        },
        {
          "include": "#blankNodePropertyList"
        },
        {
          "include": "#iri"
        },
        {
          "include": "#BlankNode"
        },
        {
          "include": "#collection"
        },
        {
          "name": "keyword.other.typeOf.turtle",
          "match": "\\b(a)(?=[ ])"
        }
      ],
      "beginCaptures": {
        "1": {
          "name": "meta.spec.triples.turtle"
        }
      },
      "endCaptures": {
        "1": {
          "name": "punctuation.terminator.triple.turtle"
        }
      }
    },
    "turtleDoc": {
      "name": "meta.spec.turtleDoc.turtle",
      "begin": "^",
      "end": "\\z",
      "patterns": [
        {
          "name": "comment.line.number-sign.turtle",
          "match": "^(#).+$",
          "captures": {
            "1": {
              "name": "punctuation.definition.comment.turtle"
            }
          }
        },
        {
          "include": "#directive"
        },
        {
          "include": "#sparqlClausedKeywords"
        },
        {
          "include": "#sparqlKeywords"
        },
        {
          "include": "#sparqlFilterFns"
        },
        {
          "include": "#sparqlLangConsts"
        },
        {
          "include": "#sparqlVars"
        },
        {
          "include": "#triples"
        }
      ]
    }
  }
}