ada top-level property

Language ada
final

Implementation

final ada = Language(
  id: "ada",
  refs: {
    '~contains~6~contains~2': Mode(
      begin: "\\s+:\\s+",
      end: "\\s*(:=|;|\\)|=>|\$)",
      illegal: "[]\\{\\}%#'\"",
      contains: [
        Mode(
          beginKeywords: "loop for declare others",
          endsParent: true,
        ),
        Mode(
          className: "keyword",
          beginKeywords:
              "not null constant access function procedure in out aliased exception",
        ),
        Mode(
          className: "type",
          begin: "[A-Za-z](_?[A-Za-z0-9.])*",
          endsParent: true,
          relevance: 0,
        ),
      ],
    ),
    '~contains~0': Mode(
      scope: "comment",
      begin: "--",
      end: "\$",
      contains: [
        Mode(
          scope: "doctag",
          begin: "[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",
          end: "(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",
          excludeBegin: true,
          relevance: 0,
        ),
        Mode(
          begin:
              "[ ]+((?:I|a|is|so|us|to|at|if|in|it|on|[A-Za-z]+['](d|ve|re|ll|t|s|n)|[A-Za-z]+[-][a-z]+|[A-Za-z][a-z]{2,})[.]?[:]?([.][ ]|[ ])){3}",
        ),
      ],
    ),
  },
  name: "Ada",
  case_insensitive: true,
  keywords: {
    "keyword": [
      "abort",
      "else",
      "new",
      "return",
      "abs",
      "elsif",
      "not",
      "reverse",
      "abstract",
      "end",
      "accept",
      "entry",
      "select",
      "access",
      "exception",
      "of",
      "separate",
      "aliased",
      "exit",
      "or",
      "some",
      "all",
      "others",
      "subtype",
      "and",
      "for",
      "out",
      "synchronized",
      "array",
      "function",
      "overriding",
      "at",
      "tagged",
      "generic",
      "package",
      "task",
      "begin",
      "goto",
      "pragma",
      "terminate",
      "body",
      "private",
      "then",
      "if",
      "procedure",
      "type",
      "case",
      "in",
      "protected",
      "constant",
      "interface",
      "is",
      "raise",
      "use",
      "declare",
      "range",
      "delay",
      "limited",
      "record",
      "when",
      "delta",
      "loop",
      "rem",
      "while",
      "digits",
      "renames",
      "with",
      "do",
      "mod",
      "requeue",
      "xor"
    ],
    "literal": ["True", "False"]
  },
  contains: [
    ModeReference('~contains~0'),
    Mode(
      className: "string",
      begin: "\"",
      end: "\"",
      contains: [
        Mode(
          begin: "\"\"",
          relevance: 0,
        ),
      ],
    ),
    Mode(
      className: "string",
      begin: "'.'",
    ),
    Mode(
      className: "number",
      begin:
          "\\b(\\d(_|\\d)*#\\w+(\\.\\w+)?#([eE][-+]?\\d(_|\\d)*)?|\\d(_|\\d)*(\\.\\d(_|\\d)*)?([eE][-+]?\\d(_|\\d)*)?)",
      relevance: 0,
    ),
    Mode(
      className: "symbol",
      begin: "'[A-Za-z](_?[A-Za-z0-9.])*",
    ),
    Mode(
      className: "title",
      begin: "(\\bwith\\s+)?(\\bprivate\\s+)?\\bpackage\\s+(\\bbody\\s+)?",
      end: "(is|\$)",
      keywords: "package body",
      excludeBegin: true,
      excludeEnd: true,
      illegal: "[]\\{\\}%#'\"",
    ),
    Mode(
      begin: "(\\b(with|overriding)\\s+)?\\b(function|procedure)\\s+",
      end: "(\\bis|\\bwith|\\brenames|\\)\\s*;)",
      keywords: "overriding function procedure with is renames return",
      returnBegin: true,
      contains: [
        ModeReference('~contains~0'),
        Mode(
          className: "title",
          begin: "(\\bwith\\s+)?\\b(function|procedure)\\s+",
          end: "(\\(|\\s+|\$)",
          excludeBegin: true,
          excludeEnd: true,
          illegal: "[]\\{\\}%#'\"",
        ),
        ModeReference('~contains~6~contains~2'),
        Mode(
          className: "type",
          begin: "\\breturn\\s+",
          end: "(\\s+|;|\$)",
          keywords: "return",
          excludeBegin: true,
          excludeEnd: true,
          endsParent: true,
          illegal: "[]\\{\\}%#'\"",
        ),
      ],
    ),
    Mode(
      className: "type",
      begin: "\\b(sub)?type\\s+",
      end: "\\s+",
      keywords: "type",
      excludeBegin: true,
      illegal: "[]\\{\\}%#'\"",
    ),
    ModeReference('~contains~6~contains~2'),
  ],
);