{
  "name": "Sprak Language Extension",
  "scopeName": "source.sprak",
  "fileTypes": [
    "sprak",
    "Sprak",
    "SPRAK"
  ],
  "uuid": "92b7c74c-cde8-4611-979e-a162a03c37fb",
  "patterns": [
    {
      "comment": "Comment",
      "name": "comment.line.sprak",
      "match": "(#).*",
      "captures": {
        "1": {
          "name": "punctuation.definition.comment.sprak"
        }
      }
    },
    {
      "comment": "Keywords",
      "name": "keyword.control.sprak",
      "match": "\\b(else if|(end )?if|(end )?void|end|else|loop|in|from|to|break|return)\\b"
    },
    {
      "comment": "Operators",
      "name": "keyword.operator.sprak",
      "match": "^(?:(?i)and|(?i)or|[!<->]=|&&|\\|\\||[!<->]|[*+\\-/])$"
    },
    {
      "comment": "Types",
      "name": "storage.type.sprak",
      "match": "\\b(void|bool|number|string|array|var)\\b"
    },
    {
      "comment": "Functions",
      "name": "support.function.sprak",
      "match": "\\b(Allow|Append|Blip|BootFromFloppy|Broadcast|ChangeBalance|CharToInt|Charisma|ClearData|ClearMemories|ClearText|Color|Connect|CopyToClipBoard|Corruption|Cos|Count|DisconnectAll|DisplayGraphics|Drink|Drunkenness|EnableAPI|EraseMemory|FastForward|FindPath|GetAction|GetAllRooms|GetBalanceForPerson|GetChannel|GetConnections|GetHour|GetIndexes|GetMemories|GetMinute|GetNumericData|GetPosition|GetPeople|GetRain|GetRoom|GetThingsInRoom|GetThingsOfType|GetTypeOfThing|GetUser|HD|HSVtoRGB|HasFloppy|HasFunction|HasIndex|HasMemory|Height|Info|Input|Int|InteractWith|IntToChar|IsKeyPressed|IsUser|Line|Lines|LoadData|LoadMemory|Lock|Log|Mod|Move|MovePerson|Name|OnHack|OnIntruder|Pitch|PlaySound|Position|Print|PrintS|QuickBoost|Quit|RGBToHSV|Random|Range|Rect|RegisterSeller|RemoteFunctionCall|Remove|RemoveAll|Repeat|RestoreCode|Round|SaveData|SaveMemory|Say|SetChannel|SetMaxTime|SetMhz|SetNumericData|SetPosition|SetRain|Sin|Sleep|Sleepiness|Slurp|Smelliness|Speed|StringContains|Switch|TeleportSetWorldPosition|Text|Time|Toggle|Trippy|TurnLeft|TurnOff|TurnOffSound|TurnOn|TurnOnSound|TurnRight|Type|Unlock|Width|ZapPerson|ZapPersonGently)\\b"
    },
    {
      "comment": "Numeric",
      "name": "constant.numeric.sprak",
      "match": "\\b(\\d(\\.\\d)?)+"
    },
    {
      "comment": "Global",
      "name": "constant.global.sprak",
      "match": "\\b\\w+\\$"
    },
    {
      "comment": "SUB",
      "name": "meta.function.sprak",
      "match": "^(\\w+):",
      "captures": {
        "1": {
          "name": "entity.name.function.sprak"
        }
      }
    },
    {
      "comment": "Brace, round",
      "name": "meta.brace.round.sprak",
      "match": "[\\(\\)]"
    },
    {
      "comment": "Brace, curly",
      "name": "meta.brace.curly.sprak",
      "match": "[\\{\\}]"
    },
    {
      "comment": "Array",
      "name": "other.array.sprak",
      "begin": "(\\w+\\()",
      "beginCaptures": {
        "1": {
          "name": "constant.array.sprak"
        }
      },
      "end": "(\\))",
      "endCaptures": {
        "1": {
          "name": "constant.array.sprak"
        }
      },
      "patterns": [
        {
          "include": "$self"
        }
      ]
    },
    {
      "comment": "String, double-quoted",
      "name": "string.quoted.double.sprak",
      "match": "\\\"[^\"]*\\\""
    },
    {
      "comment": "String, single-quoted",
      "name": "string.quoted.single.sprak",
      "match": "\\'[^']*\\'"
    }
  ]
}