{
  "displayName": "Tasl",
  "fileTypes": [
    "tasl"
  ],
  "name": "tasl",
  "patterns": [
    {
      "include": "#comment"
    },
    {
      "include": "#namespace"
    },
    {
      "include": "#type"
    },
    {
      "include": "#class"
    },
    {
      "include": "#edge"
    }
  ],
  "repository": {
    "class": {
      "begin": "^\\s*(class)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.tasl.class"
        }
      },
      "end": "$",
      "patterns": [
        {
          "include": "#key"
        },
        {
          "include": "#export"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "comment": {
      "captures": {
        "1": {
          "name": "punctuation.definition.comment.tasl"
        }
      },
      "match": "(#).*$",
      "name": "comment.line.number-sign.tasl"
    },
    "component": {
      "begin": "->",
      "beginCaptures": {
        "0": {
          "name": "punctuation.separator.tasl.component"
        }
      },
      "end": "$",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "coproduct": {
      "begin": "\\[",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.block.tasl.coproduct"
        }
      },
      "end": "]",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.block.tasl.coproduct"
        }
      },
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#term"
        },
        {
          "include": "#option"
        }
      ]
    },
    "datatype": {
      "match": "[A-Za-z][0-9A-Za-z]*:(?:[!$\\&-;=?-Z_a-z~]|%\\h{2})+",
      "name": "string.regexp"
    },
    "edge": {
      "begin": "^\\s*(edge)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.tasl.edge"
        }
      },
      "end": "$",
      "patterns": [
        {
          "include": "#key"
        },
        {
          "include": "#export"
        },
        {
          "match": "=/",
          "name": "punctuation.separator.tasl.edge.source"
        },
        {
          "match": "/=>",
          "name": "punctuation.separator.tasl.edge.target"
        },
        {
          "match": "=>",
          "name": "punctuation.separator.tasl.edge"
        },
        {
          "include": "#expression"
        }
      ]
    },
    "export": {
      "match": "::",
      "name": "keyword.operator.tasl.export"
    },
    "expression": {
      "patterns": [
        {
          "include": "#literal"
        },
        {
          "include": "#uri"
        },
        {
          "include": "#product"
        },
        {
          "include": "#coproduct"
        },
        {
          "include": "#reference"
        },
        {
          "include": "#optional"
        },
        {
          "include": "#identifier"
        }
      ]
    },
    "identifier": {
      "captures": {
        "1": {
          "name": "variable"
        }
      },
      "match": "([A-Za-z][0-9A-Za-z]*)\\b"
    },
    "key": {
      "match": "[A-Za-z][0-9A-Za-z]*:(?:[!$\\&-;=?-Z_a-z~]|%\\h{2})+",
      "name": "markup.bold entity.name.class"
    },
    "literal": {
      "patterns": [
        {
          "include": "#datatype"
        }
      ]
    },
    "namespace": {
      "captures": {
        "1": {
          "name": "keyword.control.tasl.namespace"
        },
        "2": {
          "patterns": [
            {
              "include": "#namespaceURI"
            },
            {
              "match": "[A-Za-z][0-9A-Za-z]*\\b",
              "name": "entity.name"
            }
          ]
        }
      },
      "match": "^\\s*(namespace)\\b(.*)"
    },
    "namespaceURI": {
      "match": "[a-z]+:[]!#-;=?-\\[_a-z~]+",
      "name": "markup.underline.link"
    },
    "option": {
      "begin": "<-",
      "beginCaptures": {
        "0": {
          "name": "punctuation.separator.tasl.option"
        }
      },
      "end": "$",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "optional": {
      "begin": "\\?",
      "beginCaptures": {
        "0": {
          "name": "keyword.operator"
        }
      },
      "end": "$",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "product": {
      "begin": "\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.block.tasl.product"
        }
      },
      "end": "}",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.block.tasl.product"
        }
      },
      "patterns": [
        {
          "include": "#comment"
        },
        {
          "include": "#term"
        },
        {
          "include": "#component"
        }
      ]
    },
    "reference": {
      "captures": {
        "1": {
          "name": "markup.bold keyword.operator"
        },
        "2": {
          "patterns": [
            {
              "include": "#key"
            }
          ]
        }
      },
      "match": "(\\*)\\s*(.*)"
    },
    "term": {
      "match": "[A-Za-z][0-9A-Za-z]*:(?:[!$\\&-;=?-Z_a-z~]|%\\h{2})+",
      "name": "entity.other.tasl.key"
    },
    "type": {
      "begin": "^\\s*(type)\\b",
      "beginCaptures": {
        "1": {
          "name": "keyword.control.tasl.type"
        }
      },
      "end": "$",
      "patterns": [
        {
          "include": "#expression"
        }
      ]
    },
    "uri": {
      "match": "<>",
      "name": "variable.other.constant"
    }
  },
  "scopeName": "source.tasl"
}
