{
  "displayName": "ROS Interface",
  "fileTypes": [
    "msg",
    "srv",
    "action"
  ],
  "name": "rosmsg",
  "patterns": [
    {
      "include": "#separators"
    },
    {
      "include": "#lines"
    },
    {
      "include": "#comments"
    }
  ],
  "repository": {
    "attributes": {
      "match": "@optional\\b",
      "name": "storage.modifier.attribute.rosmsg"
    },
    "builtin-types": {
      "match": "\\b(?:bool|byte|char|u?int(?:8|16|32|64)|float(?:32|64)|w?string|time|duration)\\b",
      "name": "storage.type.rosmsg"
    },
    "comments": {
      "match": "#.*",
      "name": "comment.line.number-sign.rosmsg"
    },
    "field-other": {
      "begin": "(?=\\b[A-Z_a-z])",
      "end": "$|(?=#)",
      "patterns": [
        {
          "captures": {
            "0": {
              "patterns": [
                {
                  "include": "#builtin-types"
                }
              ]
            }
          },
          "match": "\\G[/-9A-Z_a-z]+",
          "name": "support.type.rosmsg"
        },
        {
          "match": "\\d+",
          "name": "constant.numeric.integer.rosmsg"
        },
        {
          "begin": "(?=[A-Z_a-z])",
          "end": "$|(?=#)",
          "patterns": [
            {
              "include": "#field-other-after-type"
            }
          ]
        }
      ]
    },
    "field-other-after-type": {
      "patterns": [
        {
          "match": "\\G[0-9A-Z_a-z]+",
          "name": "variable.other.field.rosmsg"
        },
        {
          "begin": "",
          "end": "$|(?=#)",
          "patterns": [
            {
              "include": "#literal-other"
            },
            {
              "include": "#literal-other-array"
            }
          ]
        }
      ]
    },
    "field-string": {
      "begin": "(?=\\bw?string\\b)",
      "end": "$|(?=#)",
      "patterns": [
        {
          "captures": {
            "0": {
              "name": "storage.type.rosmsg"
            }
          },
          "match": "\\Gw?string\\b"
        },
        {
          "match": "\\d+",
          "name": "constant.numeric.integer.rosmsg"
        },
        {
          "begin": "(?=[A-Z_a-z])",
          "end": "$|(?=#)",
          "patterns": [
            {
              "include": "#field-string-after-type"
            }
          ]
        }
      ]
    },
    "field-string-after-type": {
      "patterns": [
        {
          "match": "\\G[0-9A-Z_a-z]+",
          "name": "variable.other.field.rosmsg"
        },
        {
          "begin": "=|(?<=\\s)",
          "end": "$|(?=#)",
          "patterns": [
            {
              "include": "#literal-string"
            }
          ]
        }
      ]
    },
    "field-string-array": {
      "begin": "(?=\\bw?string[<=\\d]*\\[)",
      "end": "$|(?=#)",
      "patterns": [
        {
          "captures": {
            "0": {
              "name": "storage.type.rosmsg"
            }
          },
          "match": "\\Gw?string\\b",
          "name": "support.type.rosmsg"
        },
        {
          "match": "\\d+",
          "name": "constant.numeric.integer.rosmsg"
        },
        {
          "begin": "(?=[A-Z_a-z])",
          "end": "$|(?=#)",
          "patterns": [
            {
              "include": "#field-string-array-after-type"
            }
          ]
        }
      ]
    },
    "field-string-array-after-type": {
      "patterns": [
        {
          "match": "\\G[0-9A-Z_a-z]+",
          "name": "variable.other.field.rosmsg"
        },
        {
          "begin": "(?<=\\s)",
          "end": "$|(?=#)",
          "name": "meta.default-value.rosmsg",
          "patterns": [
            {
              "include": "#literal-string-array"
            }
          ]
        }
      ]
    },
    "lines": {
      "patterns": [
        {
          "include": "#attributes"
        },
        {
          "include": "#field-string-array"
        },
        {
          "include": "#field-string"
        },
        {
          "include": "#field-other"
        }
      ]
    },
    "literal-other": {
      "patterns": [
        {
          "match": "[-+]?(?:(?:\\d+(?:_\\d+)*)?\\.\\d+(?:_\\d+)*|\\d+(?:_\\d+)*\\.)(?:[Ee][-+]?\\d+(?:_\\d+)*)?",
          "name": "constant.numeric.float.rosmsg"
        },
        {
          "match": "[-+]?\\d+(?:_\\d+)*",
          "name": "constant.numeric.integer.rosmsg"
        },
        {
          "match": "(?i)\\b(?:true|false)\\b",
          "name": "constant.language.boolean.rosmsg"
        }
      ]
    },
    "literal-other-array": {
      "patterns": [
        {
          "begin": "\\[",
          "end": "]|$|(?=#)",
          "name": "meta.array.rosmsg",
          "patterns": [
            {
              "include": "#literal-other"
            }
          ]
        }
      ]
    },
    "literal-string": {
      "patterns": [
        {
          "include": "#literal-string-quoted"
        },
        {
          "include": "#literal-string-unquoted"
        }
      ]
    },
    "literal-string-array": {
      "patterns": [
        {
          "begin": "\\[",
          "end": "]|$|(?=#)",
          "name": "meta.array.rosmsg",
          "patterns": [
            {
              "include": "#literal-string-quoted"
            },
            {
              "include": "#literal-string-unquoted-in-array"
            }
          ]
        }
      ]
    },
    "literal-string-escape": {
      "patterns": [
        {
          "match": "\\\\(?:[0-7]{3}|x\\h{2}|u\\h{4}|U\\h{8}|.)",
          "name": "constant.character.escape.rosmsg"
        }
      ]
    },
    "literal-string-quoted": {
      "patterns": [
        {
          "begin": "\"",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.string.begin.rosmsg"
            }
          },
          "end": "\"|$",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.rosmsg"
            }
          },
          "name": "string.quoted.double.rosmsg",
          "patterns": [
            {
              "include": "#literal-string-escape"
            }
          ]
        },
        {
          "begin": "'",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.string.begin.rosmsg"
            }
          },
          "end": "'|$",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.end.rosmsg"
            }
          },
          "name": "string.quoted.single.rosmsg",
          "patterns": [
            {
              "include": "#literal-string-escape"
            }
          ]
        }
      ]
    },
    "literal-string-unquoted": {
      "begin": "(?=[^\"'\\s])",
      "end": "(?=\\s*(?:#|$))",
      "name": "string.unquoted.rosmsg",
      "patterns": [
        {
          "include": "#literal-string-escape"
        }
      ]
    },
    "literal-string-unquoted-in-array": {
      "begin": "(?=[^]\"',\\s])",
      "end": "(?=\\s*(?:$|[],]))",
      "name": "string.unquoted.rosmsg",
      "patterns": [
        {
          "include": "#literal-string-escape"
        }
      ]
    },
    "separators": {
      "patterns": [
        {
          "match": "^---\\s*$\\n?",
          "name": "meta.separator.rosmsg"
        },
        {
          "match": "^={3,}\\s*$\\n?",
          "name": "meta.separator.rosmsg"
        },
        {
          "captures": {
            "1": {
              "name": "entity.name.type.class.rosmsg"
            }
          },
          "match": "^MSG:\\s+([/-9A-Z_a-z]+)\\s*$\\n?",
          "name": "meta.separator.rosmsg"
        }
      ]
    }
  },
  "scopeName": "source.rosmsg"
}
